【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库

前言

  本篇主要是基于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)

运行结果如下:

【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库_第1张图片

文件中都是繁体中文,所以我们需要将其转换为简体中文,这时候 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 脚本文件查看,需要修改文件名。

【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库_第2张图片

此时我们发现,文本文件中已经都是简体中文了,接下来我们要对该文本进行分词操作

3、jieba 分词

  • 使用写好的 python 脚本文件执行即可

python 脚本文件可见: jieba_cut.py

执行语句:

python jieba_cut.py

此步骤我花了大概十几分钟

执行结果:

在这里插入图片描述

查看内容:

  • 同样的方式

【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库_第3张图片

此时,我们就已经分好词了,至此我们数据预处理就做好了,下面就开始模型训练了

二、模型的训练

  • 使用写好的 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

运行结果:

【NLP】维基百科中文数据训练word2vec词向量模型——基于gensim库_第4张图片

从上面的结果看来:

  • 和“数学”词向量比较相近的词还真是,都是和“数学”有关的,其他词也是,说明这个模型还不错,给自己一个赞吧

四、总结

  从上面的试验看来,应用维基百科的中文数据来训练模型还不错,要是我们有更好的语料库,或者更大的语料库,那模型的效果会不会更好呢?理论上是肯定的,我们可以将任何语料库提取、转换、分词后(当然,这些步骤不是每步都是必须的,但是分词是必须的),然后应用 gensim 库中的 Word2vec 模块进行训练。细心的朋友可能发现,现在有很多的分词工具(这里用的jieba,另外还有北大开源的 pkuseg,可参考:链接),那么分词的好坏会不会带来模型效果的提升呢?这也待进一步试验。我想分词结果越好,模型效果也越好吧。

  另外,词向量的构建仅是自然语言处理中的一个强大的工具,我们还需要对构建好的词向量加以应用,用来处理自然语言处理的或许工作,如:词性标注、主题分类等等。

你可能感兴趣的:(NLP)