以《兽血沸腾.txt》的每一行为一篇文档,得到对应关键词的词向量,计算其中部分关键词的相似度。主要是熟悉词向量的使用场景。
词向量是自然语言理解中一种语言模型的副产品。所谓语言模型,其实就是将人类识别的语言转变为机器可以分析和处理的对象。传统的语言模型称为“词袋子模型”,一篇文章被分解为N个词的组合,进一步表示为一个M维度的向量,每个维度是字典中的一个词,如果这个词在文章中出现则表示为1,否则表示为0。
从语言建模的角度看,词向量使用的是n-gram模型,认为一篇文章当中不同的词之间存在关系,这种关系体现在这个词与出现在这个词之前和之后的若干个词之间,从概率的角度说,也就是这篇文章中这个词出现的概率可以近似等于该词与其关联词出现的条件概率。
从表示形式上看,词向量与传统语言模型的不同之处在于,传统语言模型是一个M维度的向量,向量中每一项的值为0或者1,而词向量维度更低,一般设定为几百维,并且每一项的值为一个实数。
已有多种方法可以获取,我们这里使用最Fashion的神经网络方法。简单说一下原理:
(1)基于n-gram模型
(2)目标:最大化关键词的条件概率
(3)通过神经网络优化各层参数,最终得到词向量
已经有各类型的变种和实现,最出名的是Google的word2vec工具,简单灵活,去掉了隐藏层,有兴趣的同学可以去了解一下。本例中使用的是gensim实现的word2vec。
import jieba
from gensim.models import word2vec
def splitSentence(inputFile, outputFile):
fin = open(inputFile, 'rb')
fout = open(outputFile, 'wb')
for eachLine in fin.readlines():
line = eachLine.strip().decode('utf-8')
wordList = list(jieba.cut(line))
outStr = ''
for word in wordList:
outStr += ' '
outStr += word
fout.write(outStr.strip().encode('utf-8'))
fout.write("\n".encode('utf-8'))
splitSentence('sxftutf.txt', 'sxft_fc.txt')
sentences=word2vec.Text8Corpus(u'sxft_fc.txt')
model=word2vec.Word2Vec(sentences, size=200)
y1=model.similarity(u"震撼", u"李察")
y2=model.similarity(u"震撼", u"果果")
y3=model.similarity(u"震撼", u"凝玉")
print(y1)
print(y2)
print(y3)
注意:
1. gensim的word2vec不支持汉语,但可以将汉字当做unicode进行处理,这个原因大家看一下上面的原理就可以知道了
2. 注意编码格式问题
0.948390382529
0.90573522136
0.924164016955
注意:每次执行的结果都不一样,因为算法本身使用SGD的原因(随机梯度下降)。
震撼与李察的实际关系:主角别名/与配角重名
震撼与果果的实际关系:果果是主角宠物,同时出现的概率很高
震撼与凝玉的实际关系:夫妻,同时出现的概率很高
TD-IDF http://www.ruanyifeng.com/blog/2013/03/tf-idf.html
PCA http://dataunion.org/13702.html
《基于神经网络的词和文档语义向量表示方法研究》 来斯惟
《word2vec中的数学原理详解》http://www.tuicool.com/articles/7jQbQvr
《深度学习word2vec》http://blog.csdn.net/mytestmy/article/details/38612907
《机器学习》 周志华