当前位置:   article > 正文

Gensim Word2vec简介_gensim.models.word2vec.train()

gensim.models.word2vec.train()
本文主要基于Radim Rehurek的 Word2vec Tutorial.

准备输入


Gensim的word2vec的输入是句子的序列. 每个句子是一个单词列表:
  1. >>> # import modules & set up logging
  2. >>> import gensim, logging
  3. >>> logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
  4. >>>
  5. >>> sentences = [['first', 'sentence'], ['second', 'sentence']]
  6. >>> # train word2vec on the two sentences
  7. >>> model = gensim.models.Word2Vec(sentences, min_count=1)

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

例如, 如果输入分布在硬盘上的多个文件中, 文件的每一行是一个句子, 那么可以逐个文件, 逐行的处理输入:
  1. >>> class MySentences(object):
  2. ... def __init__(self, dirname):
  3. ... self.dirname = dirname
  4. ...
  5. ... def __iter__(self):
  6. ... for fname in os.listdir(self.dirname):
  7. ... for line in open(os.path.join(self.dirname, fname)):
  8. ... yield line.split()
  9. >>>
  10. >>> sentences = MySentences('/some/directory') # a memory-friendly iterator
  11. >>> model = gensim.models.Word2Vec(sentences)

如果需要对文件中的单词做其他处理, 比如转换为unicode, 转换大小写, 删除数字, 抽取命名实体等, 所有这些都可以在MySentence迭代器中进行处理.

注意, word2vec会在整个句子序列上跑两遍, 第一遍会收集单词及其词频来够爱走一个内部字典树结构. 第二遍才会训练神经网络. 如果你只能遍历一边数据, 则可以参考以下做法
  1. >>> model = gensim.models.Word2Vec() # an empty model, no training
  2. >>> model.build_vocab(some_sentences) # can be a non-repeatable, 1-pass generator
  3. >>> model.train(other_sentences) # can be a non-repeatable, 1-pass generator


 训练


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

worker参数只有在安装了Cython后才有效. 没有Cython的话, 只能使用单核.

内存


word2vec的参数被存储为矩阵(Numpy array). array的大小为#vocabulary  乘以 #size大小的浮点数(4 byte)矩阵.

内存中有三个这样的矩阵, 如果你的输入包含100,000个单词, 隐层单元数为200, 则需要的内存大小为100,000 * 200 * 4 * 3 bytes, 约为229MB.

另外还需要一些内存来存储字典树, 但是除非你的单词是特别长的字符串, 大部分内存占用都来自前面说的三个矩阵.

评测


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

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

切记, 要根据自己的应用了需求来确定算法的性能.

存储和加载模型


存储、加载模型的方法如下:
  1. >>> model.save('/tmp/mymodel')
  2. >>> new_model = gensim.models.Word2Vec.load('/tmp/mymodel')

另外, 可以直接加载由C生成的模型:
  1. >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False)
  2. >>> # using gzipped/bz2 input works too, no need to unzip:
  3. >>> model = Word2Vec.load_word2vec_format('/tmp/vectors.bin.gz', binary=True)


 在线训练


可以在加载模型之后使用另外的句子来进一步训练模型
  1. >>> model = gensim.models.Word2Vec.load('/tmp/mymodel')
  2. >>> model.train(more_sentences)

但是不能对C生成的模型进行再训练.

使用模型


Word2vec支持数种单词相似度任务:
  1. >>> model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
  2. [('queen', 0.50882536)]
  3. >>> model.doesnt_match("breakfast cereal dinner lunch".split())
  4. 'cereal'
  5. >>> model.similarity('woman', 'man')
  6. .73723527

可以通过以下方式来得到单词的向量:
  1. >>> model['computer'] # raw NumPy vector of a word
  2. array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)

 

参考文献:

[1]. Word2vec Tutorial
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号