Gensim進階教程:訓練word2vec與doc2vec模型

轉自:公子天的技術博客http://www.cnblogs.com/iloveai/html

本篇博客是Gensim的進階教程,主要介紹用於詞向量建模的word2vec模型和用於長文本向量建模的doc2vec模型在Gensim中的實現。python

Word2vec

Word2vec並非一個模型——它實際上是2013年Mikolov開源的一款用於計算詞向量的工具。關於Word2vec更多的原理性的介紹,能夠參見個人另外一篇博客:word2vec前世此生函數

在Gensim中實現word2vec模型很是簡單。首先,咱們須要將原始的訓練語料轉化成一個sentence的迭代器;每一次迭代返回的sentence是一個word(utf8格式)的列表:工具

class MySentences(object): def __init__(self, dirname): self.dirname = dirname def __iter__(self): for fname in os.listdir(self.dirname): for line in open(os.path.join(self.dirname, fname)): yield line.split() sentences = MySentences('/some/directory') # a memory-friendly iterator

接下來,咱們用這個迭代器做爲輸入,構造一個Gensim內建的word2vec模型的對象(即將原始的one-hot向量轉化爲word2vec向量):ui

model = gensim.models.Word2Vec(sentences)

如此,便完成了一個word2vec模型的訓練。spa

咱們也能夠指定模型訓練的參數,例如採用的模型(Skip-gram或是CBoW);負採樣的個數;embedding向量的維度等。具體的參數列表在這裏code

一樣,咱們也能夠經過調用save()load()方法完成word2vec模型的持久化。此外,word2vec對象也支持原始bin文件格式的讀寫。htm

Word2vec對象還支持online learning。咱們能夠將更多的訓練數據傳遞給一個已經訓練好的word2vec對象,繼續更新模型的參數:對象

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

若要查看某一個word對應的word2vec向量,能夠將這個word做爲索引傳遞給訓練好的模型對象:blog

model['computer'] # raw NumPy vector of a word

Doc2vec

Doc2vec是Mikolov在word2vec基礎上提出的另外一個用於計算長文本向量的工具。它的工做原理與word2vec極爲類似——只是將長文本做爲一個特殊的token id引入訓練語料中。在Gensim中,doc2vec也是繼承於word2vec的一個子類。所以,不管是API的參數接口仍是調用文本向量的方式,doc2vec與word2vec都極爲類似。

主要的區別是在對輸入數據的預處理上。Doc2vec接受一個由LabeledSentence對象組成的迭代器做爲其構造函數的輸入參數。其中,LabeledSentence是Gensim內建的一個類,它接受兩個List做爲其初始化的參數:word list和label list。

from gensim.models.doc2vec import LabeledSentence sentence = LabeledSentence(words=[u'some', u'words', u'here'], tags=[u'SENT_1'])

相似地,能夠構造一個迭代器對象,將原始的訓練數據文本轉化成LabeledSentence對象:

class LabeledLineSentence(object): def __init__(self, filename): self.filename = filename def __iter__(self): for uid, line in enumerate(open(filename)): yield LabeledSentence(words=line.split(), labels=['SENT_%s' % uid])

準備好訓練數據,模型的訓練便只是一行命令:

from gensim.models import Doc2Vec model = Doc2Vec(dm=1, size=100, window=5, negative=5, hs=0, min_count=2, workers=4)

該代碼將同時訓練word和sentence label的語義向量。若是咱們只想訓練label向量,能夠傳入參數train_words=False以固定詞向量參數。更多參數的含義能夠參見這裏的API文檔

注意,在目前版本的doc2vec實現中,每個Sentence vector都是常駐內存的。所以,模型訓練所需的內存大小同訓練語料的大小正相關。

相關文章
相關標籤/搜索