1. 程式人生 > >python 下的 word2vec 學習筆記

python 下的 word2vec 學習筆記

1.ubuntu下安裝gensim

為了保證安裝成功,首先升級一下easy_install工具。

sudo easy_install -U setuptools

之後使用easy_install進行安裝,使用apt-get安裝會遇到編碼出錯,不知為什麼,使用easy_install安裝成功就行了。

sudo easy_install --upgrade gensim

結果在import gensim 中還出現了點小錯誤,缺少了平pattern模組,所以直接pip 安裝。

sudo pip install pattern

2.訓練生成模型

模型的訓練如下:

# ################# 例1 #########################
# 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)

在本次的實驗中,我們的資料是儲存在txt檔案中的。每一行對應一個句子(已經分詞,以空格隔開),我們可以直接用LineSentence把txt檔案轉為所需要的格式。

# ################# 例2 #########################
from gensim import Word2Vec
from gensim.Word2Vec import LineSentence

# inp為輸入語料
inp = 'wiki.zh.text.jian.seg.txt'
# outp1 為輸出模型 outp1 = 'wiki.zh.text.model' # outp2為原始c版本word2vec的vector格式的模型 outp2 = 'wiki.zh.text.vector' model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5, workers=multiprocessing.cpu_count()) model.save(outp1) model.save_word2vec_format(outp2, binary=False)

LineSentence(inp):應該是把word2vec訓練模型的磁碟儲存檔案(model在記憶體中總是不踏實)轉換成所需要的格式;對應的格式是參考上面的例1。
size:是每個詞的向量維度;
window:是詞向量訓練時的上下文掃描視窗大小,視窗為5就是考慮前5個詞和後5個詞;
min-count:設定最低頻率,預設是5,如果一個詞語在文件中出現的次數小於5,那麼就會丟棄;
workers:是訓練的程序數(需要更精準的解釋,請指正),預設是當前執行機器的處理器核數。這些引數先記住就可以了。

說明一下輸入語料,輸入的是文字檔案的格式,其中沒一行表示一個文章,而且是經過分詞處理的。詞與詞之間用空格隔開就行了。分詞的工具有很多,我一般用的是結巴分詞(不知道大家以後沒有好的分詞工具推薦)。一般來說,訓練集越大,結果的泛化性越好,對於專業領域的話,最好能使用專業領域的語料來進行訓練。

3.匯入模型

# -*- coding: utf-8 -*-
# <nbformat>3.0</nbformat>

import gensim
# 匯入模型
model = gensim.models.Word2Vec.load("wiki.zh.text.model")

4. 模型使用

可以參照官網上的指導迅速瞭解model的各種功能方法。

4.0 獲取詞向量

        print model[u'汽車']
        type(model[u'汽車'])
# 結果
[  3.74845356e-01   1.86477005e+00   1.28353190e+00   8.04618478e-01 ... ]
numpy.ndarray

4.1 計算一個詞的最近似的詞,倒排序

result = model.most_similar(u'足球')
for each in result:
    print each[0] , each[1]
國際足球 0.556692957878
足球運動 0.530436098576
籃球 0.518306851387
國家足球隊 0.516140639782
足球隊 0.513238489628
足球聯賽 0.500901579857
football 0.500162124634
體育 0.499264538288
足球比賽 0.488131582737
冰球 0.48725092411

4.2 計算兩詞之間的餘弦相似度

word2vec一個很大的亮點:支援詞語的加減運算。(實際中可能只有少數例子比較符合)

>>> model.most_similar(positive=['woman', 'king'], negative=['man'])
[('queen', 0.50882536), ...]
sim1 = model.similarity(u'勇敢', u'戰鬥')
sim2 = model.similarity(u'勇敢', u'膽小')
sim3 = model.similarity(u'高興', u'開心')
sim4 = model.similarity(u'傷心', u'開心')
print sim1 
print sim2
print sim3
print sim4
0.254622852224
0.38974887559
0.423695453969
0.376244588456

4.3 計算兩個集合之間的餘弦似度

當出現某個詞語不在這個訓練集合中的時候,會報錯!!!。

list1 = [u'今天', u'我', u'很', u'開心']
list2 = [u'空氣',u'清新', u'善良', u'開心']
list3 = [u'國家電網', u'再次', u'宣告', u'破產', u'重新']
list_sim1 =  model.n_similarity(list1, list2)
print list_sim1
list_sim2 = model.n_similarity(list1, list3)
print list_sim2
0.541874230659
0.13056320154

4.4 選出集合中不同類的詞語

list = [u'紐約', u'北京', u'上海', u'西安']
print model.doesnt_match(list)
list = [u'紐約', u'北京', u'上海', u'西瓜']
print model.doesnt_match(list)
紐約
西瓜