采用维基百科里的中文网页作为训练语料库,下载地址为:https://dumps.wikipedia.org/zhwiki/20190301/zhwiki-20190301-pages-articles.xml.bz2
维基百科提供的语料是xml格式的,因此需要将其转换为txt格式。由于维基百科中有很多是繁体中文网页,故需要将这些繁体字转换为简体字。另外,在用语料库训练词向量之前需要对中文句子进行分词,这里采用Jieba中文分词工具对句子进行分词。
from gensim.corpora import WikiCorpus
import jieba
from opencc import OpenCC
opencc = OpenCC('t2s')
def preprocess():
space = ' '
i = 0
l = []
zhwiki_name = './data/zhwiki-20190301-pages-articles.xml.bz2'
with open('./data/reduce_zhiwiki.txt', 'w') as f: # xml转换为txt
wiki = WikiCorpus(zhwiki_name, lemmatize=False, dictionary={}) # 读取训练语料
for text in wiki.get_texts(): # 文本
for temp_sentence in text: # 段落
temp_sentence = opencc.convert(temp_sentence) # 繁体转简体
seg_list = list(jieba.cut(temp_sentence)) # 分词
for temp_term in seg_list:
l.append(temp_term) # 组合成列表
f.write(space.join(l) + '\n') # 写入txt文件
l = []
i = i + 1
if i % 200 == 0:
print('Saved ' + str(i) + ' articles')
if __name__ == '__main__':
import time
before = time.time()
preprocess()
after = time.time()
print(str((after - before) / 60) + ' minutes')
处理后的语料如图:
利用gensim模块训练词向量,Word2Vec函数的参数如下:
# sg=0:使用CBOW模型训练词向量 # sg=1:使用skip-gram训练词向量 # size:词向量维度 # windows:当前词和预测词可能的最大距离 # min_count:最小出现次数,如果一个词出现的次数小于min_count,直接忽略该词 # workers:训练词向量时使用的线程数
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
def train():
wiki_news = open('./data/reduce_zhiwiki.txt', 'r')
model = Word2Vec(LineSentence(wiki_news), sg=0, size=192, window=5, min_count=5, workers=8) # 训练词向量
model.save('zhiwiki_news.word2vec')
if __name__ == '__main__':
train()
训练好的词向量存在下列文件中:
# coding=utf-8
import gensim
def simularity():
model = gensim.models.Word2Vec.load('./data/zhiwiki_news.word2vec')
print(model.similarity('数据', '人工智能')) # 相似度为0.29
print(model.similarity('滴滴', '摩拜')) # 相似度为0.39
word = '北航'
if word in model.wv.index2word:
print(model.most_similar(word)) # 最相近的词
if __name__ == '__main__':
simularity()
得到数据与人工智能的相似度为0.29,滴滴与摩拜的相似度为0.39,与北航最相近的词有:
[('天津大学', 0.708594799041748), ('哈工大', 0.7071467638015747), ('同济大学', 0.6879477500915527), ('浙大', 0.6827788949012756), ('湖南大学', 0.6754754185676575), ('水利系', 0.6699927449226379), ('深圳大学', 0.6659466624259949), ('西北工业大学', 0.6655755043029785), ('北京航空航天大学', 0.6644810438156128), ('上海大学', 0.663300633430481)]