Gensim Word2vec 使用指南

本文主要內(nèi)容翻譯自 Word2vec Tutorial

Gemsim 安裝

快速安裝

  • easy install -U gensim
  • pip install --upgrade gensim

依賴

  1. Python >= 2.6
  2. NumPy >= 1.3
  3. SciPy >= 0.7

輸入

Gensim Word2vec 使用一個句子序列作為其輸入初坠,每個句子包含一個單詞列表甘畅。

sentences = [['first', 'sentence'], ['second', 'sentence']]
# train word2vec on the two sentences
model = gensim.models.Word2Vec(sentences, min_count=1)

用 Python 內(nèi)置的 list 類型作為輸入很方便,但當輸入內(nèi)容較多時,會占用很大的內(nèi)存空間端幼。Gemsim 的輸入只要求序列化的句子,而不需要將所有輸入都存儲在內(nèi)存中弧满。簡單來說婆跑,可以輸入一個句子,處理它庭呜,刪除它滑进,再載入另外一個句子。

舉例來說募谎, 假如輸入分散在硬盤的多個文件中扶关,每個句子一行,那么不需要將所有輸入先行存儲在內(nèi)存中数冬,Word2vec 可以一個文件一個文件节槐,一行一行地進行處理。

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)

如果希望對文件中的內(nèi)容進行預(yù)處理拐纱,舉例來說铜异,轉(zhuǎn)換編碼,大小寫轉(zhuǎn)換秸架,去除數(shù)字等操作揍庄,均可以在 MySentences 迭代器中完成,完全獨立于 Word2vec东抹。Word2vec 只負責(zé)接收 yield 的輸入蚂子。

針對高級用戶:調(diào)用 Word2Vec(sentences, iter=1) 會調(diào)用句子迭代器運行兩次(一般來說沃测,會運行 iter+1 次,默認情況下 iter=5)食茎。第一次運行負責(zé)收集單詞和它們的出現(xiàn)頻率芽突,從而構(gòu)造一個內(nèi)部字典樹。第二次以及以后的運行負責(zé)訓(xùn)練神經(jīng)模型董瞻。這兩次運行(iter+1)也可以被手動初始化寞蚌,如果輸入流是無法重復(fù)利用的,也可以用下面的方式對其進行初始化钠糊。

model = gensim.models.Word2Vec(iter=1)  # an empty model, no training yet
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

如果對 Python 中迭代器挟秤,可迭代的,生成器這些概念不是很理解抄伍,可以參考下文艘刚。
Python關(guān)鍵字yield的解釋

訓(xùn)練

Word2vec 有多個影響訓(xùn)練速度和質(zhì)量的參數(shù)。

其中之一是用來修剪內(nèi)部字典樹的截珍。在一個數(shù)以億計的預(yù)料中出現(xiàn)一到兩次的單詞非常有可能是噪音或不需要被關(guān)注的攀甚。另外,也沒有足夠的數(shù)據(jù)對他們進行有意義的訓(xùn)練岗喉。因此秋度,最好的辦法就是直接將他們忽略掉。
model = Word2Vec(sentences, min_count=10) # default value is 5
對于設(shè)定 min_count 的值钱床,合理的范圍是0 - 100荚斯,可以根據(jù)數(shù)據(jù)集的規(guī)模進行調(diào)整。

另一個參數(shù)是神經(jīng)網(wǎng)絡(luò) NN 層單元數(shù)查牌,它也對應(yīng)了訓(xùn)練算法的自由程度事期。
model = Word2Vec(sentences, size=200) # default value is 100
更大的 size 值需要更多的訓(xùn)練數(shù)據(jù),但也同時可以得到更準確的模型纸颜。合理的取值范圍是幾十到幾百兽泣。

最后一個主要參數(shù)是訓(xùn)練并行粒度,用來加速訓(xùn)練胁孙。
model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization
該參數(shù)只有在機器已安裝 Cython 情況下才會起到作用唠倦。如沒有 Cython,則只能單核運行浊洞。

完整參數(shù)列表

內(nèi)存

在內(nèi)部牵敷,Word2vec 模型的參數(shù)以矩陣形式存儲(NumPy 數(shù)組),數(shù)組的大小為 #vocabulary 乘以 #size 的浮點數(shù) (4 bytes)法希。

三個如上的矩陣被存儲在內(nèi)存中(將其簡化為兩個或一個的工作進行中)枷餐。如果輸入中存在 100,000 個互異的詞,神經(jīng)網(wǎng)絡(luò)規(guī)模 size 設(shè)為200苫亦,則該模型大致需要內(nèi)存
100,000 * 200 * 3 * 4 bytes = ~229MB毛肋。

除此之外怨咪,還需要一些額外的空間存儲字典樹,但除非輸入內(nèi)容極端長润匙,內(nèi)存主要仍被上文所提到的矩陣所占用诗眨。

評估

Word2vec 訓(xùn)練是一個非監(jiān)督任務(wù),很難客觀地評估結(jié)果孕讳。評估要依賴于后續(xù)的實際應(yīng)用場景匠楚。Google 公布了一個包含 20,000 語法語義的測試樣例,形式為 “A is to B as C is to D”厂财。

需要注意的是芋簿,如在此測試樣例上展示良好性能并不意味著在其它應(yīng)用場景依然有效,反之亦然璃饱。

存儲和載入模型

使用 Gensim 的方法進行存儲和載入模型

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

該方法將模型內(nèi)部的 NumPy 矩陣從硬盤載入到虛擬內(nèi)存与斤。另外,可以使用如下的方法載入原生 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)練和恢復(fù)訓(xùn)練

高級用戶可以載入模型后用更多的預(yù)料對其進行訓(xùn)練,你可能要對參數(shù) total_words 進行調(diào)整谒撼,取決于希望達到的學(xué)習(xí)率食寡。

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

從原生 C 工具生成的模型載入后無法繼續(xù)進行訓(xùn)練,仍然可以對該模型進行查詢和相關(guān)度計算操作嗤栓,但由于字典樹的丟失冻河,無法繼續(xù)進行訓(xùn)練。

使用模型

Word2vec 支持以下多種詞語相似度任務(wù):

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')
0.73723527

可以用如下方法查詢詞向量:

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

如需要全體的詞向量茉帅,可以調(diào)用 model.syn0 返回一個 2D 的 NumPy 矩陣。

參考文獻

Word2vec Tutorial

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锭弊,一起剝皮案震驚了整個濱河市堪澎,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌味滞,老刑警劉巖樱蛤,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剑鞍,居然都是意外死亡昨凡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門蚁署,熙熙樓的掌柜王于貴愁眉苦臉地迎上來便脊,“玉大人,你說我怎么就攤上這事光戈∧奶担” “怎么了遂赠?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長晌杰。 經(jīng)常有香客問我跷睦,道長,這世上最難降的妖魔是什么肋演? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任抑诸,我火速辦了婚禮,結(jié)果婚禮上爹殊,老公的妹妹穿的比我還像新娘哼鬓。我一直安慰自己,他們只是感情好边灭,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布异希。 她就那樣靜靜地躺著,像睡著了一般绒瘦。 火紅的嫁衣襯著肌膚如雪称簿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天惰帽,我揣著相機與錄音憨降,去河邊找鬼。 笑死该酗,一個胖子當著我的面吹牛授药,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播呜魄,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼悔叽,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爵嗅?” 一聲冷哼從身側(cè)響起娇澎,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睹晒,沒想到半個月后趟庄,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡伪很,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年瘟滨,在試婚紗的時候發(fā)現(xiàn)自己被綠了变泄。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖返干,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布匾七,位于F島的核電站,受9級特大地震影響江兢,放射性物質(zhì)發(fā)生泄漏昨忆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一杉允、第九天 我趴在偏房一處隱蔽的房頂上張望邑贴。 院中可真熱鬧,春花似錦叔磷、人聲如沸拢驾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽繁疤。三九已至,卻和暖如春秕狰,著一層夾襖步出監(jiān)牢的瞬間稠腊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工鸣哀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留架忌,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓我衬,卻偏偏與公主長得像叹放,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挠羔,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 模型創(chuàng)建 Gensim中 Word2Vec 模型的期望輸入是進過分詞的句子列表井仰,即是某個二維數(shù)組。這里我們暫時使用...
    chaaffff閱讀 2,114評論 0 5
  • 前面的文章主要從理論的角度介紹了自然語言人機對話系統(tǒng)所可能涉及到的多個領(lǐng)域的經(jīng)典模型和基礎(chǔ)知識褥赊。這篇文章糕档,甚至之后...
    我偏笑_NSNirvana閱讀 13,888評論 2 64
  • 1.NLP當前熱點方向 詞法/句法分析 詞嵌入(word embedding) 命名實體識別(Name Entit...
    __Aragorn閱讀 6,011評論 1 9
  • 前言 本文根據(jù)實際項目撰寫,由于項目保密要求拌喉,源代碼將進行一定程度的刪減。本文撰寫的目的是進行公司培訓(xùn)俐银,請勿以任何...
    b19707134332閱讀 4,835評論 0 18
  • 對著地上影子微笑 把微笑當成回憶的往事 在往事里尋找著安慰 呵 身邊悄然離去的種子 那消逝的樹木啊 載著破碎的夢想...
    Josan喬閱讀 163評論 0 3