用gensim的word2vector实现词嵌入

准备输入

Gensim的word2vec的输入是句子的序列. 每个句子是一个单词列表

>>> # import modules & set up logging
>>> import gensim, logging
>>> logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
>>>
>>> sentences = [['first', 'sentence'], ['second', 'sentence']]
>>> # train word2vec on the two sentences
>>> model = gensim.models.Word2Vec(sentences, min_count=1)

将输入视为Python的内置列表很简单, 但是在输入很大时会占用大量的内存. 所以Gensim只要求输入按顺序提供句子, 并不将这些句子存储在内存, 然后Gensim可以加载一个句子, 处理该句子, 然后加载下一个句子.

训练

Word2vec有很多可以影响训练速度和质量的参数.

第一个参数可以对字典做截断. 少于min_count次数的单词会被丢弃掉, 默认值为5


model = Word2Vec(sentences, min_count=10)  # default value is 5

另外一个是神经网络的隐藏层的单元数:

model = Word2Vec(sentences, size=200)  # default value is 100

大的size需要更多的训练数据, 但是效果会更好. 推荐值为几十到几百.

最后一个主要的参数控制训练的并行:

model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization

Word2vec的训练是无监督的, 没有可以客观的评测结果的好方法. Google提供的一种评测方式为诸如”A之于B相当于C至于D”之类的任务: 参见http://word2vec.googlecode.com/svn/trunk/questions-words.txt

Gensim也支持相同的评测集:

model.accuracy('/tmp/questions-words.txt')
-02-01 22:14:28,387 : INFO : family: 88.9% (304/342)
-02-01 22:29:24,006 : INFO : gram1-adjective-to-adverb: 32.4% (263/812)
-02-01 22:36:26,528 : INFO : gram2-opposite: 50.3% (191/380)
-02-01 23:00:52,406 : INFO : gram3-comparative: 91.7% (1222/1332)
-02-01 23:13:48,243 : INFO : gram4-superlative: 87.9% (617/702)
-02-01 23:29:52,268 : INFO : gram5-present-participle: 79.4% (691/870)
-02-01 23:57:04,965 : INFO : gram7-past-tense: 67.1% (995/1482)
-02-02 00:15:18,525 : INFO : gram8-plural: 89.6% (889/992)
-02-02 00:28:18,140 : INFO : gram9-plural-verbs: 68.7% (482/702)
-02-02 00:28:18,140 : INFO : total: 74.3% (5654/7614)

存储和加载模型

>>> model.save('/tmp/mymodel')
>>> new_model = gensim.models.Word2Vec.load('/tmp/mymodel')

在线训练

可以在加载模型之后使用另外的句子来进一步训练模型

model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)

但是不能对C生成的模型进行再训练.
使用模型
Word2vec支持数种单词相似度任务:

model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
[('queen', 0.50882536)]
model.doesnt_match("breakfast cereal dinner lunch".split())
'cereal'
model.similarity('woman', 'man')
.73723527

可以通过以下方式来得到单词的向量:

model['computer']  # raw NumPy vector of a word
array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)

你可能感兴趣的:(机器学习实践,机器学习工具)