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