前言
本篇主要是基于gensim
库中的 Word2Vec
模型,使用维基百科中文数据训练word2vec
词向量模型,大体步骤如下:
- 数据预处理
- 模型的训练
- 模型的测试
准备条件:
- Windows10 64位
- Python3.6,并安装
gensim
库:pip install gensim
- 数据集:下载地址
注意:
- 下载
zhwiki-latest-pages-articles-multistream.xml.bz2
此类型的,其中包括:articles
以及后缀为xml.bz2
- 尽可能下载大一点的,我下载的是1.7G的,语料库越大,模型的效果会比较好
- opencc(中文繁体转简体):下载地址
我这里下载的是
opencc-1.0.1-win64.7z
,下载后解压备用即可,解压后得到文件夹:opencc-1.0.1-win64
本篇所有脚本代码可见:Github
其中提供了脚本文件和
opencc
工具包,由于数据比较大,所以这里我没有上传,可以自行下载训练模型。
一、数据预处理
下载后的数据如下:
1、将下载后的数据转为txt
文本文件
- 这里只需要使用写好的
python
脚本文件执行即可,此步骤大概需要20分钟左右,根据个人电脑配置。
python
脚本文件可见: process.py
执行语句:
python process.py zhwiki-latest-pages-articles.xml.bz2 wiki_zh.txt
#python 原数据的文件名 转换后数据的文件名
#中间为空格
执行后得到:
2、繁体转简体
打开 wiki_zh.txt
文件看看:
- 由于文件比较大,所以一般文本编辑器很难打开,我们可以写个
python
脚本来读取部分内容。
python
脚本文件可见: read_file.py
执行语句:
python read_file.py
脚本代码如下:
import codecs
f = codecs.open('wiki_zh.txt', 'r', encoding="utf8") # 这里打开哪个文件就改为哪个文件的文件名
line = f.readline()
print(line)
运行结果如下:
文件中都是繁体中文,所以我们需要将其转换为简体中文,这时候
opencc
就派上用场了
繁体转简体:
- 将
wiki_zh.txt
文件移到opencc
解压后的文件夹opencc-1.0.1-win64
下,执行如下语句:
opencc -i wiki_zh.txt -o wiki_zh_jian.txt -c t2s.json
此步骤大概需要几分钟的时间,我的花了大概1分钟
执行后结果为:
查看内容:
- 同样使用
read_file.py
脚本文件查看,需要修改文件名。
此时我们发现,文本文件中已经都是简体中文了,接下来我们要对该文本进行分词操作
3、jieba
分词
- 使用写好的
python
脚本文件执行即可
python
脚本文件可见: jieba_cut.py
执行语句:
python jieba_cut.py
此步骤我花了大概十几分钟
执行结果:
查看内容:
- 同样的方式
此时,我们就已经分好词了,至此我们数据预处理就做好了,下面就开始模型训练了
二、模型的训练
- 使用写好的
python
脚本文件执行即可
python
脚本文件可见: word2vec_model.py
执行语句:
python word2vec_model.py wiki_zh_jian_cut.txt wiki_zh.model wiki_zh.vector
此步骤我花了一个多小时
执行结果:
模型训练好了,我们可以来试试这个模型怎么样了
三、模型的测试
- 执行脚本文件
test_model.py
测试代码:
from gensim.models import Word2Vec
en_wiki_word2vec_model = Word2Vec.load('wiki.zh.text.model')
testwords = ['苹果', '数学', '学术', '白痴', '篮球']
for i in range(5):
res = en_wiki_word2vec_model.most_similar(testwords[i])
print(testwords[i])
print(res)
执行语句:
python test_model.py
运行结果:
从上面的结果看来:
- 和“数学”词向量比较相近的词还真是,都是和“数学”有关的,其他词也是,说明这个模型还不错,给自己一个赞吧
四、总结
从上面的试验看来,应用维基百科的中文数据来训练模型还不错,要是我们有更好的语料库,或者更大的语料库,那模型的效果会不会更好呢?理论上是肯定的,我们可以将任何语料库提取、转换、分词后(当然,这些步骤不是每步都是必须的,但是分词是必须的),然后应用 gensim
库中的 Word2vec
模块进行训练。细心的朋友可能发现,现在有很多的分词工具(这里用的jieba
,另外还有北大开源的 pkuseg
,可参考:链接),那么分词的好坏会不会带来模型效果的提升呢?这也待进一步试验。我想分词结果越好,模型效果也越好吧。
另外,词向量的构建仅是自然语言处理中的一个强大的工具,我们还需要对构建好的词向量加以应用,用来处理自然语言处理的或许工作,如:词性标注、主题分类等等。