在前一节,(一)利用Wikipedia中文语料训练词向量word2vec——获取Wikipedia简体中文语料库
我们学习到了如何下载Wiki中文语料库,并且学会了如何将繁体转换为简体。在这一节中,我们将学习如何训练word2vec,包括分词以及训练两个步骤。所有的处理过程都是在jupyter notebook中进行的。
第一步 jieba分词
import pandas as pd
import codecs
import jieba, re
其中codecs
模块用于打开数据量大的文本文件。
%%time # 统计代码的运行时间
# 利用codecs模块打开大容量文本,wiki_text.txt是简体文件
f = codecs.open('wiki_text.txt', 'r', encoding='utf-8')
# 将分词后的文件存入target
target = codecs.open('wiki.zh.jianti.cut.words.txt', 'w', encoding='utf-8')
line_num = 1
line = f.readline() # 按行读取
# 匹配中文分词
zhPattern = re.compile(u'[\u4e00-\u9fa5]+')
while line:
print('-'*8 + 'processing ', line_num, ' article' + '-'*8)
line_cut = ' '.join([word for word in jieba.cut(line) if zhPattern.search(word)])
target.writelines(line_cut)
line_num += 1
line = f.readline()
f.close()
target.close()
运行结果如下:
第二步 gensim训练word2vec
导入相关包
import logging # 打印日志
import gensim
import multiprocessing # 多核处理
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
相关参数:
sg=1: 使用skip-gram; sg=0: 使用cbow.
min_count 忽略所有频率低于此值的单词。默认值为5。
window(int)是一个句子中当前单词和预测单词之间的最大距离
size表示训练的词向量维度
%%time
from gensim.models.word2vec import LineSentence, Word2Vec
# wiki.zh.jianti.cut.words.txt是分词后的文本
sentences = LineSentence("wiki.zh.jianti.cut.words.txt")
# multiprocessing.cpu_count()多核CPU进行计算
model = Word2Vec(sentences, size=300, min_count=5, sg=1, window=5, workers=multiprocessing.cpu_count())
#保存模型,供日后使用
model.save("word2vec_300.model")
运行结果:(logging
模块将会输出程序运行日志)。
程序运行完后,将会在本地产生模型文件:
因为语料库太大,训练很耗时,本机训练2G左右的语料,花了接近三个小时。