NLP 利器 Gensim 來訓練自己的 word2vec 詞向量模型
首先,要訓練一個自己的詞向量模型,我們是需要一些數據的。
在這裡,我們使用 Lee background Corpus 作為訓練用語料數據。
下載地址:
lee_background.cor
一、數據預處理
這個語料庫不大,可以一次讀取到內存中,但是我們可以用 「內存友好」 的方式,一行一行地讀取,這種方式同樣適合處理大規模語料。
from gensim.test.utils import datapath
from gensim import utils
class MyCorpus(object):
"""迭代器每次生成一個句子 (字符串的列表)。"""
def __iter__(self):
corpus_path = datapath('lee_background.cor')
# 語料庫的地址
for line in open(corpus_path):
# 每一行是一個文本
# 每個單詞由空格分割
yield utils.simple_preprocess(line)
# 每次處理一行,迭代輸出
MyCorpus 這個類主要是用來做數據預處理的。
我們可以在這裡做個性化的安排,比如解碼非標準編碼,字母小寫處理,去除數字,提取命名實體等。
所有這些處理皆在這裡完成,word2vec 模型是不需要管這些的。
最終,我們只要達到的目的是,一次 yield 一個句子(uft8 編碼單詞的列表)。
二、訓練模型
來試着訓練個模型吧:
import gensim.models
sentences = MyCorpus()
# 實例化語料的類
model = gensim.models.Word2Vec(sentences=sentences)
# 訓練,完成後模型存入 model 中
這樣就得到了訓練好的模型。
然後就可以利用這個模型,來進行詞語語義之間的一些操作。
模型最重要的部分就是 model.wv
,這裡的 」wv「 代表 word vectors。
然後我們可以看下形成的詞表:
for i, word in enumerate(model.wv.vocab):
if i == 10:
break
print(word)
運行結果:
hundreds
of
people
have
been
forced
to
their
homes
in
查看詞表長度:
print(len(model.wv.vocab))
運行結果:
1750
三、存儲模型:
model.save('./w2v.m')
這樣模型就存儲到了指定的路徑,後綴名隨意,因為內核用的是 pickle,所以無所謂。
四、讀取模型:
new_model = gensim.models.Word2Vec.load('./w2v.m')
使用 Word2Vec 下的 load 方法即可。