gensim库三大功能:
- 可扩展的统计语义
- 分析语义结构的纯文本
- 检索语义上类似的文档
word2vec是gensim的一个子模块,可以用来实现上面三大功能
word2vec的理解
下面的两篇博客对word2vec介绍的很详细
https://www.zhihu.com/question/25269336
http://www.cnblogs.com/iloveai/p/word2vec.html
我个人理解:
机器学习中,一切都是基于向量的.自然语言处理中的句子都是依赖词向量来表示.
而word2vec和lda相对应,是词向量的两种不同的模型:
- word2vec属于神经网络语言模型,根据词与其周边词汇的关系训练词向量,然后将词向量用来做nlp的任务
- lda则是一种文档主题生成模型,比如lsi模型
在gensim中使用word2vec
详细教程参见:
http://radimrehurek.com/gensim/models/word2vec.html
https://rare-technologies.com/word2vec-tutorial/
http://textprocessing.org/getting-started-with-word2vec
练习:
test8下载地址:
http://mattmahoney.net/dc/text8.zip
from gensim.models import word2vec
import gensim
import logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
#第一次使用,需要加载文档集(http://mattmahoney.net/dc/text8.zip)
sentences = word2vec.Text8Corpus('/tmp/text8')
model = word2vec.Word2Vec(sentences, size=200)
#保存模型,以便下次直接使用
model.save('/tmp/text8.model')
#下次使用的时候,无需加载sentences文档集,直接读取model啦
#model = word2vec.Word2Vec('/tmp/text8.model')
#word2vec好玩的地方,计算相似词,woman+man+kiss+love-girl=bride
>>> model.most_similar(positive=['woman','man','kiss','love'],negative=['girl'],topn=5)
#结果如下[('bride', 0.6755753755569458), ('me', 0.6339389681816101),
#('baby', 0.6337762475013733), ('lady', 0.6284192204475403), ('devil', 0.6243280172348022)]
也可以这样玩:
#找出不同类的词
model.doesnt_match(['fuck','head','foot','hand'])#fuck
model.doesnt_match("breakfast cereal dinner lunch".split())#cereal
还可以找两个词的相似度
word2vec也支持短语:
>>> bigram_transformer = gensim.models.Phrases(sentences)
>>> model = Word2Vec(bigram_transformer[sentences], size=100, ...)