1. 程式人生 > >Python版的Word2Vec -- gensim 學習手札 中文詞語相似性度量 V1.1

Python版的Word2Vec -- gensim 學習手札 中文詞語相似性度量 V1.1

前言

相關內容連結: 第一節:Google Word2vec 學習手札
昨天好不容易試用了一下Google自己提供的Word2Vector的原始碼,花了好長時間訓練資料,結果發現似乎Python並不能直接使用,於是上網找了一下Python能用的Word2Vector,這麼一找,就找到了gensim

安裝

gensim有一些依賴,首先請先確保你安裝了這些東西:

Python >= 2.6. Tested with versions 2.6, 2.7, 3.3, 3.4 and 3.5. Support for Python 2.5 was discontinued starting gensim 0.10
.0; if you must use Python 2.5, install gensim 0.9.1. NumPy >= 1.3. Tested with version 1.9.0, 1.7.1, 1.7.0, 1.6.2, 1.6.1rc2, 1.5.0rc1, 1.4.0, 1.3.0, 1.3.0rc2. SciPy >= 0.7. Tested with version 0.14.0, 0.12.0, 0.11.0, 0.10.1, 0.9.0, 0.8.0, 0.8.0b1, 0.7.1, 0.7.0.

還有一點特別注意的是,保證你的系統有C的編譯器,不然速度會很慢,其實你可以首先編譯一下Google官方的C語言版的試試,然後在安裝gensim,gensim的word2vector用了官方的程式碼

根據官網的安裝指南,有兩種方法可以選擇:
使用easy_install 或者pip,注意這兩者可能都需要sudo申請更高的許可權

easy_install -U gensim
或者(這個相對於官網的,我修改過,實測我的沒問題)
pip install --upgrade --ignore-installed six gensim

我使用了第二種方式進行的安裝,如果這些依賴沒有安裝的,可以安裝python和相關的工具後,直接使用pip或easy_install安裝。

在進行模型訓練的時候,如果不安裝Cython,無法進行多執行緒訓練,速度很瘦影響,所以接著安裝下Cython

pip install
cython

1、訓練模型:
如果所有安裝配置工作都已經做好了,那麼可以開始使用gensim了。這裡的語料庫使用我之前部落格裡面已經分好詞的corpus-seg.txt語料庫。這裡在完成模型訓練後,將他存到一個檔案中,這樣下次就可以直接使用了。

# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
from gensim.models import Word2Vec
import logging,gensim,os

class TextLoader(object):
    def __init__(self):
        pass

    def __iter__(self):
        input = open('corpus-seg.txt','r')
        line = str(input.readline())
        counter = 0
        while line!=None and len(line) > 4:
            #print line
            segments = line.split(' ')
            yield  segments
            line = str(input.readline())

sentences = TextLoader()
model = gensim.models.Word2Vec(sentences, workers=8)
model.save('word2vector2.model')
print 'ok'

這裡的檔案載入用了自己的程式碼,當然也可以使用自帶的Line Sentence,之所以貼出上面的程式碼是因為,如果你的檔案格式比較特殊可以參照上面的程式碼進行處理。

# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
from gensim.models import Word2Vec
import logging,gensim,os

#模型的載入
model = Word2Vec.load('word2vector.model')
#比較兩個詞語的相似度,越高越好
print('"唐山" 和 "中國" 的相似度:'+ str(model.similarity('唐山','中國')))
print('"中國" 和 "祖國" 的相似度:'+ str(model.similarity('祖國','中國')))
print('"中國" 和 "中國" 的相似度:'+ str(model.similarity('中國','中國')))
#使用一些詞語來限定,分為正向和負向的
result = model.most_similar(positive=['中國', '城市'], negative=['學生'])
print('同"中國"與"城市"二詞接近,但是與"學生"不接近的詞有:')
for item in result:
    print('   "'+item[0]+'"  相似度:'+str(item[1]))

result = model.most_similar(positive=['男人','權利'], negative=['女人'])
print('同"男人"和"權利"接近,但是與"女人"不接近的詞有:')
for item in result:
    print('   "'+item[0]+'"  相似度:'+str(item[1]))

result = model.most_similar(positive=['女人','法律'], negative=['男人'])
print('同"女人"和"法律"接近,但是與"男人"不接近的詞有:')
for item in result:
    print('   "'+item[0]+'"  相似度:'+str(item[1]))
#從一堆詞裡面找到不匹配的
print("老師 學生 上課 校長 , 有哪個是不匹配的? word2vec結果說是:"+model.doesnt_match("老師 學生 上課 校長".split()))
print("汽車 火車 單車 相機 , 有哪個是不匹配的? word2vec結果說是:"+model.doesnt_match("汽車 火車 單車 相機".split()))
print("大米 白色 藍色 綠色 紅色 , 有哪個是不匹配的? word2vec結果說是:"+model.doesnt_match("大米 白色 藍色 綠色 紅色 ".split()))
#直接檢視某個詞的向量
print('中國的特徵向量是:')
print(model['中國'])

這裡給出一個我的執行結果:

/System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /Users/MebiuW/Documents/Doing/Bot/word2vector/model_loader.py
"唐山""中國" 的相似度:0.1720725224
"中國""祖國" 的相似度:0.456236474841
"中國""中國" 的相似度:1.0"中國""城市"二詞接近,但是與"學生"不接近的詞有:
   "全球"  相似度:0.60819453001
   "亞洲"  相似度:0.588450014591
   "我國"  相似度:0.545840501785
   "世界"  相似度:0.540009200573
   "名城"  相似度:0.518879711628
   "矽谷"  相似度:0.517688155174
   "長三角"  相似度:0.512072384357
   "國內"  相似度:0.511703968048
   "全國"  相似度:0.507433652878
   "國際"  相似度:0.505781650543"男人""權利"接近,但是與"女人"不接近的詞有:
   "權益"  相似度:0.67150759697
   "隱私權"  相似度:0.666741013527
   "選舉權"  相似度:0.626420497894
   "財產權"  相似度:0.617758154869
   "利益"  相似度:0.610122740269
   "義務"  相似度:0.608267366886
   "尊嚴"  相似度:0.605125784874
   "繼承權"  相似度:0.603345394135
   "法律"  相似度:0.596215546131
   "優先權"  相似度:0.59428691864"女人""法律"接近,但是與"男人"不接近的詞有:
   "勞動法"  相似度:0.652353703976
   "司法"  相似度:0.652238130569
   "婚姻法"  相似度:0.631354928017
   "民法"  相似度:0.624598622322
   "法規"  相似度:0.623348236084
   "刑法"  相似度:0.611774325371
   "國際法"  相似度:0.608191132545
   "訴訟"  相似度:0.607495307922
   "REACH"  相似度:0.599701464176
   "強制力"  相似度:0.597045660019
老師 學生 上課 校長 , 有哪個是不匹配的? word2vec結果說是:上課
汽車 火車 單車 相機 , 有哪個是不匹配的? word2vec結果說是:相機
大米 白色 藍色 綠色 紅色 , 有哪個是不匹配的? word2vec結果說是:大米
中國的特徵向量是:
[-0.08299727 -3.58397388 -0.55335367  1.4152931   3.94189262 -2.03232622
  1.31824613 -1.75067747 -1.66100371 -1.70273054 -3.47409034  2.70463562
 -0.87696695 -2.53364205 -2.12181163 -7.60758495 -0.6421982   2.9187181
  1.38164878 -0.05457138  1.02129567  1.64029694  0.21894537 -0.82295948
  3.30296516 -0.65931851  1.39501953  0.71423614  2.0213325   2.97903037
  1.46234405 -0.30748805  2.45258284 -0.51123774 -1.84140313 -0.92091084
 -4.28990364  4.0552578  -2.01020265  0.85769647 -4.6681509  -2.88254309
 -1.80714786  0.52874494  3.31922817  0.43049669 -3.03839922 -1.20092583
  2.75143361  0.99246925  0.41537657 -0.78819919  1.28469515  0.12056304
 -4.54702759 -1.36031103  0.35673267 -0.36477017 -3.63630986 -0.21103215
  2.16747832 -0.47925043 -0.63043374 -2.25911093 -1.47486925  4.2380085
 -0.22334123  3.2125628   0.91901672  0.66508955 -2.80306172  3.42943978
  2.26001453  5.24837303 -4.0164156  -3.28324246  4.40493822 -0.14068756
 -4.31880903  1.98531461  0.2576215  -2.69446373  0.59171939 -0.48250189
 -0.67274201  1.96152794 -2.83031917  0.54468328  2.57930231 -1.44152164
 -0.61808151  1.03311574 -3.48526216 -2.35903311 -3.9816277  -0.93071622
  2.77195001  1.8912288  -3.45096016  4.93347549]

Process finished with exit code 0

2、語料庫更新後模型的線上訓練
很多時候,當原有的語料庫不符合要求,或者我們需要有更多語料加入到我們模型的時候,如果再重新訓練模型,就顯得十分的不合算了。
其實在Gensim當中,提供了模型的線上訓練,即我們可以增加新的語料到現有的模型中,而不用全部重新學習。

# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
from gensim.models import Word2Vec
import logging,gensim,os
from gensim.models.word2vec import LineSentence

#提前載入
model = Word2Vec.load('word2vector2.model')
#新的語料庫
new_corpus = LineSentence('corpus/iphone6sreview-seg.txt')
#訓練新的語料
model.train(new_corpus)
#將其進行儲存
model.save('word2vector3.model')

這裡主要分為載入原有的模型,匯入新的語料庫,訓練新的語料庫,最後儲存,我已經在程式碼當中將其分解清楚

結語

目前這個手札只是介紹幾本的安裝和使用,更多的工作將會在後續部落格中寫入。
轉載請註明來自:mebiuw ,更多內容請關注我的新浪各位微博 @MebiuW

使用可能遇到的問題:

參考資料

版本

2016.9.2 更新至 V1.1:

  1. 修正語言表述
  2. 增加Gensim模型的持續學習(擴充語料庫)的介紹