Gensim Word2vec 使用教程
本文主要基于Radim Rehurek的Word2vec Tutorial.
**
準(zhǔn)備輸入
**
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的內(nèi)置列表很簡單, 但是在輸入很大時會占用大量的內(nèi)存. 所以Gensim只要求輸入按順序提供句子, 并不將這些句子存儲在內(nèi)存, 然后Gensim可以加載一個句子, 處理該句子, 然后加載下一個句子.
例如, 如果輸入分布在硬盤上的多個文件中, 文件的每一行是一個句子, 那么可以逐個文件, 逐行的處理輸入:
>>> 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 >>> model = gensim.models.Word2Vec(sentences)如果需要對文件中的單詞做其他處理, 比如轉(zhuǎn)換為unicode, 轉(zhuǎn)換大小寫, 刪除數(shù)字, 抽取命名實體等, 所有這些都可以在MySentence迭代器中進(jìn)行處理.
注意, word2vec會在整個句子序列上跑兩遍, 第一遍會收集單詞及其詞頻來夠愛走一個內(nèi)部字典樹結(jié)構(gòu). 第二遍才會訓(xùn)練神經(jīng)網(wǎng)絡(luò). 如果你只能遍歷一邊數(shù)據(jù), 則可以參考以下做法
>>> model = gensim.models.Word2Vec() # an empty model, no training >>> model.build_vocab(some_sentences) # can be a non-repeatable, 1-pass generator >>> model.train(other_sentences) # can be a non-repeatable, 1-pass generator**
訓(xùn)練
**
Word2vec有很多可以影響訓(xùn)練速度和質(zhì)量的參數(shù).
第一個參數(shù)可以對字典做截斷. 少于min_count次數(shù)的單詞會被丟棄掉, 默認(rèn)值為5
python model = Word2Vec(sentences, min_count=10) # default value is 5另外一個是神經(jīng)網(wǎng)絡(luò)的隱藏層的單元數(shù):
model = Word2Vec(sentences, size=200) # default value is 100大的size需要更多的訓(xùn)練數(shù)據(jù), 但是效果會更好. 推薦值為幾十到幾百.
最后一個主要的參數(shù)控制訓(xùn)練的并行:
model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelizationworker參數(shù)只有在安裝了Cython后才有效. 沒有Cython的話, 只能使用單核.
內(nèi)存
word2vec的參數(shù)被存儲為矩陣(Numpy array). array的大小為#vocabulary 乘以 #size大小的浮點數(shù)(4 byte)矩陣.
內(nèi)存中有三個這樣的矩陣, 如果你的輸入包含100,000個單詞, 隱層單元數(shù)為200, 則需要的內(nèi)存大小為100,000 * 200 * 4 * 3 bytes, 約為229MB.
另外還需要一些內(nèi)存來存儲字典樹, 但是除非你的單詞是特別長的字符串, 大部分內(nèi)存占用都來自前面說的三個矩陣.
評測
Word2vec的訓(xùn)練是無監(jiān)督的, 沒有可以客觀的評測結(jié)果的好方法. Google提供的一種評測方式為諸如”A之于B相當(dāng)于C至于D”之類的任務(wù): 參見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)切記, 要根據(jù)自己的應(yīng)用了需求來確定算法的性能.
存儲和加載模型
存儲、加載模型的方法如下:
>>> model.save('/tmp/mymodel') >>> new_model = gensim.models.Word2Vec.load('/tmp/mymodel')另外, 可以直接加載由C生成的模型:
model = Word2Vec.load_word2vec_format('/tmp/vectors.txt', binary=False)# using gzipped/bz2 input works too, no need to unzip: model=Word2Vec.load_word2vec_format('/tmp/vectors.bin.gz', binary=True)在線訓(xùn)練
可以在加載模型之后使用另外的句子來進(jìn)一步訓(xùn)練模型
model = gensim.models.Word2Vec.load('/tmp/mymodel') model.train(more_sentences)但是不能對C生成的模型進(jìn)行再訓(xùn)練.
使用模型
Word2vec支持?jǐn)?shù)種單詞相似度任務(wù):
可以通過以下方式來得到單詞的向量:
model['computer'] # raw NumPy vector of a word array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)總結(jié)
以上是生活随笔為你收集整理的Gensim Word2vec 使用教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pandas全表查询定位某个值所在行列
- 下一篇: 本题中的变量(不包括变量ID)进行z-s