文本向量学习笔记

文本向量其实是文本的一个数字化表达,以利于计算机理解文本,文本向量表达文本的好坏就决定了计算能否准确文本的意思。
文本向量分为词向量,文档向量,句向量。
文本向量算法学习笔记 :
词袋模型:简单的统计词频,不能表示句中的词序,也无法表达语议。
词向量模型:
上下文相似的词其语议也相似。

文本向量学习笔记_第1张图片
词向量直观理解学习笔记:
词义相似度高在空间上越近。

文本向量学习笔记_第2张图片
深度神经网络语言模型学习笔记:
神经网络求取文本向量,是在不断优化训练网络带来的结果,他把文本向量先全部拼接在一起保留词序与语议,回避了词袋模型的缺点。
文本向量学习笔记_第3张图片CBOW模型原理讲解学习笔记:
文本向量学习笔记_第4张图片
CBOW模型去除了隐藏层,虽然使参数大量减少,但是各种词的条件组合计算太多,而输出层W(t)的候选词是整个词库太大了,为了降低这部分的计算量CBOW采用了哈夫曼树、正负采样两者结合的技术降低了计算量,从而使CBOW模型成为了可以实际商业化的模型。
Gension建立词向量模型学习笔记 :
学习这个视频我有个疑问,难道我们都需要训练词向量吗?咨询老师得到的回复是词向量文件未必需要重新训练,可以使用其它公司已经训练好的,重新训练主要是在现有的词向量起的作用不大,有很多词的词向量没有,经常在一些专业领域中没有就需要重新训练了。
至于学习实现代码个人所花费的时间最主要是在Gensim,jieba这两个第三方工具的API使用上,以及Python日志处理代码理解。
使用TensorFlow建立词向量模型——数据预处理:
建议先把Python如何操作文件操作关这样的语法给过了。比如pickle的用法,set为什么就能够去重复词呢?另外就是math、collection、os这些API用法,建议先学《零基础入门编程——Python》相关章节。
在数据预处理的工作中就是实现数据的清洗工作,去停用词、去换行符、去特定英文词。
在学习此节的过程中,我不禁有个疑问如果出现很多阿拉伯数字怎么办呢,比如123、654出现在文本中怎么清洗呢?
带着问题咨询老师,老师回复这种情况如果很多的话,也需要清洗,可以使用Python正则表达式对数据进行清洗,其实在数据预处理的工作中,有相当一部分时间是要去爬取数据,因为很有可能现成的数据不多,为了防止过拟合,需要准备更大的数据集所以就要去网站上爬取数据,但是爬来的数据往往不规范,存在很多噪音,所以就要清洗。
使用TensorFlow建立词向量模型——模型建立:
学习本节课程建议先把Python如何操作类的语法给搞懂,否则不明白self,__init__这些方法属性的作用。
在学习代码的过程中,理解此行代码尤其重要,

 embed = tf.nn.embedding_lookup(self.embedding_dict, self.train_inputs) 

self.embedding_dict就是整个词表的向量字典,即vocab_size行embedding_size列的矩阵数据,说白了就词表中的每个词都用embedding_size列的矩阵数据来表示。
使用TensorFlow建立词向量模型——模型训练:
这段视频中的最核心的其实就是如何把标签和训练词根据CBOW算法的规则取出来,去重复训练。懂了他的规则就明白了其代码为什么要这样写。
使用TensorFlow建立词向量模型——使用模型:
在使用模型计算近义词时我发现看不懂如何计算近似词的代码:

vec_l2_model = tf.sqrt(  # 求各词向量的L2模
                tf.reduce_sum(tf.square(self.embedding_dict),1,keep_dims=True)
            )

            avg_l2_model = tf.reduce_mean(vec_l2_model)
            tf.summary.scalar('avg_vec_model',avg_l2_model)

            self.normed_embedding = self.embedding_dict / vec_l2_model#归一化
            # self.embedding_dict = norm_vec # 对embedding向量正则化
            test_embed = tf.nn.embedding_lookup(self.normed_embedding, self.test_word_id)
            self.similarity = tf.matmul(test_embed, self.normed_embedding, transpose_b=True)

我不明白为何要这样写,咨询老师,老师说这一块的代码其实是计算夹角余弦,如果对这块的数学知识不懂的话,就当做一个API来调用也是没问题的。
句向量模型原理讲解笔记:
句向量表示一个句子的语序信息,这使得小红送给小王一个苹果。小王送给小红一个苹果。两个词完全相同的句子,能够区分出不同的意思。
文本向量学习笔记_第5张图片
代码实战新闻相似度计算学习笔记 :
这节课主要是对比使用词向量和句向量应用于新闻相似度时不同的效果,得到的结论是句向量的准确性要远优于词向量。
在使用词向量实战新闻相似度时有两处关键代码是需要多加注意的:
keyword_extract.app这个文件中如下代码:
tfidf = analyse.extract_tags
keywords = tfidf(data)
这两行代码实现使用tfidf算法提取关键词。我搞不懂tfidf是什么意思,咨询老师老师说一种算法,后续的课程中会学到,现在就把他理解成一种提取新闻中关键词的算法。
word2vec_sim.app这个文件中如下代码:
p1_vec=word2vec(p1_keywords,model)
p2_vec=word2vec(p2_keywords,model)
上述两行代码就是把两个测试新闻的关键词向量分别相加得到两个新闻的向量表示。
print(simlarityCalu(p1_vec,p2_vec))
这行代码使用两个新闻的向量表示,计算相似度。
使用句向量实战新闻相似度的核心代码如下:
1、首先在读取语料时不同虽然都是使用wiki的语料,但是其读入语料时读入了pageid(页面ID),title(标题)信息,而这一部分信息是为了训练句向量而准备的,其实就是将这个标题来训练句向量,代码如下:

for content, (page_id, title) in self.wiki.get_texts():
            yield g.doc2vec.LabeledSentence(words=[w for c in content for w in jieba.cut(Converter('zh-hans').convert(c))], tags=[title])

另外还要说明的是,这行代码中使用Python yield迭函数来分批次返回数据,这样做能起到节省内存的作用。
在使用训练好的句向量模型计算新闻相似度时有两处代码需要加以注意:

 doc_vec_all = model.infer_vector(doc, alpha=start_alpha, steps=infer_epoch)

这行代码和词向量获取新闻的向量简单叠加不同,它是把新闻的所有词向量传给句向量模型开启一轮训练来得到此新闻的句向量。
在得到了两个新闻的句向量之后,再使用simlarityCalu函数计算相似度。

你可能感兴趣的:(人工智能)