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 方法即可。