英文语料的获取
该实验中所使用的语料
使用全量维基百科语料集的一个子集,压缩包大小大约在170M,可通过链接下载。文本数据的提取
处理包括两个阶段,首先将xml的wiki数据转换为text格式,可以通过下面的脚本进行(源自:中英文维基百科语料上的word2vec实验):
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import six
from gensim.corpora import WikiCorpus
if __name__ == '__main__':
inp = "../Data/enwiki-latest-pages-articles1.xml-p10p30302.bz2"
outp = "../Data/out_wiki.en.txt"
space = " "
i = 0
output = open(outp, 'w', encoding="utf-8")
wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
for text in wiki.get_texts():
if(i % 1000 == 0):
print(i)
if six.PY3:
output.write(' '.join(text) + '\n')
else:
output.write(space.join(text) + "\n")
i = i + 1
output.close()
- 模型训练
文本提取完成后,进行模型的训练:
# -*- coding: utf-8 -*-
from gensim.models import Word2Vec
if __name__ == '__main__':
input1 = "../Data/out_wiki.en.txt"
output1 = "../Data/word2vec_model/word2vec.model"
output2 = "../Data/word2vec_model/vector.model"
sentences = []
with open(input1, 'r', encoding='utf8', errors='ignore') as f:
for line in f:
if " " in line:
sentences.append(line.split(" "))
model = Word2Vec(size=200, window=5, min_count=5, workers=4) # 定义word2vec 对象
model.build_vocab(sentences) # 建立初始训练集的词典
model.train(sentences, total_examples=model.corpus_count, epochs=model.iter) # 模型训练
model.save(output1) # 模型保存
model.wv.save_word2vec_format(output2, binary=False) # 词向量保存
''' # 模型的训练和保存,下面两行同样可以训练,但是无法追加训练 model = Word2Vec(sentences, size=100, window=5, min_count=1, workers=4) model.save("word2vec.model") '''
我们在实际使用的时候,可能会有某些词语不在词典中,我们无法通过模型获取得到对应的词向量,因此可能需要追加训练,追加训练的代码如下:
# 增量训练
sentences = [['first', 'sentence'], ['second', 'sentence']] # 初始训练集
more_sentence = [["hello", "world"]] # 追加训练集
model = Word2Vec(size=100, window=5, min_count=1, workers=4) # 定义word2vec 对象
model.build_vocab(sentences) # 建立初始训练集的词典
model.train(sentences, total_examples=model.corpus_count, epochs=model.iter) # 模型训练
print(model.wv['first']) # 输出first的vector
# print(model.wv['hello']) 此时hello不在字典中,报错
model.build_vocab(more_sentence, update=True) # 追加训练集到词典中
model.train(more_sentence, total_examples=model.corpus_count, epochs=model.iter) # 追加训练
print(model.wv['hello']) # 此时hello在字典中,不报错
模型使用
常用的集中方法是:- 模型的加载:
model = gensim.models.Word2Vec.load('../Data/word2vec_model/word2vec.model')
- 获取词向量:可以使用
vector = model[word]
来获取 - 获取与指定单词最相近的词语及其相似度分数:
print(model.most_similar('car'))
- 获取两个指定词语的相似程度:
print(model.n_similarity(["mars"], ["earth"]))
- 模型的加载:
其他更多的使用可以参考官方文档:gensim.Word2Vec