使用word2vec训练中文维基百科

word2vec是Google于2013年开源推出的一个用于获取词向量的工具包,关于它的介绍,可以先看词向量工具word2vec的学习

获取和处理中文语料

维基百科的中文语料库质量高、领域广泛而且开放,非常适合作为语料用来训练。相关链接:

有了语料后我们需要将其提取出来,因为wiki百科中的数据是以XML格式组织起来的,所以我们需要寻求些方法。查询之后发现有两种主要的方式:gensim的wikicorpus库,以及wikipedia Extractor。

WikiExtractor

Wikipedia Extractor是一个用Python写的维基百科抽取器,使用非常方便。下载之后直接使用这条命令即可完成抽取,运行时间很快。执行以下命令。

相关链接:

相关命令:

相关说明:

  • -b 2048M表示的是以128M为单位进行切分,默认是1M。
  • extracted:需要将提取的文件存放的路径;
  • zhwiki-latest-pages-articles.xml.bz2:需要进行提取的.bz2文件的路径

二次处理:

通过Wikipedia Extractor处理时会将一些特殊标记的内容去除了,但有时这些并不影响我们的使用场景,所以只要把抽取出来的标签和一些空括号、「」、『』、空书名号等去除掉即可。

保存后执行 python filte.py wiki_00 即可进行二次处理。

gensim的wikicorpus库

转化程序:

化繁为简

维基百科的中文数据是繁简混杂的,里面包含大陆简体、台湾繁体、港澳繁体等多种不同的数据。有时候在一篇文章的不同段落间也会使用不同的繁简字。这里使用opencc来进行转换。

中文分词

这里直接使用jieba分词的命令行进行处理:

转换成 utf-8 格式

非 UTF-8 字符会被删除

参考链接:https://github.com/lzhenboy/word2vec-Chinese

word2vec模型训练

C语言版本word2vec

项目地址:

安装:

训练词向量

  • -train “input.txt” 表示在指定的语料库上训练模型
  • -output 结果输入文件,即每个词的向量
  • -cbow 是否使用cbow模型,0表示使用skip-gram模型,1表示使用cbow模型,默认情况下是skip-gram模型,cbow模型快一些,skip-gram模型效果好一些
  • -size 表示输出的词向量维数
  • -window 8 训练窗口的大小为8   即考虑一个单词的前八个和后八个单词(实际代码中还有一个随机选窗口的过程,窗口大小<=5)
  • -negative 表示是否使用NEG方,0表示不使用,其它的值目前还不是很清楚
  • -hs 是否使用HS方法,0表示不使用,1表示使用
  • -sample 表示 采样的阈值,如果一个词在训练样本中出现的频率越大,那么就越会被采样
  • -binary 表示输出的结果文件是否采用二进制存储,0表示不使用(即普通的文本存储,可以打开查看),1表示使用,即vectors.bin的存储类型
  • -threads 20 线程数
  • -iter 15 迭代次数

除了上面所讲的参数,还有:

  • -alpha 表示 学习速率
  • -min-count 表示设置最低频率,默认为5,如果一个词语在文档中出现的次数小于该阈值,那么该词就会被舍弃
  • -classes 表示词聚类簇的个数,从相关源码中可以得出该聚类是采用k-means

计算相似词

./distance可以看成计算词与词之间的距离,把词看成向量空间上的一个点,distance看成向量空间上点与点的距离。

词语类比

给定三个词语A、B、C,返回(A – B + C)语义最近的词语及相似列表

聚类

将经过分词后的语料中的词聚类并按照类别排序:

短语分析

先利用经过分词的语料得出包含词和短语的文件phrase.txt,再训练该文件中词与短语的向量表示。

Python版的Word2Vec

项目地址:https://github.com/danielfrg/word2vec

安装:pip install word2vec

整体使用和C语言版类似:

Python包Gensim

gensim是一个很好用的Python NLP的包,不光可以用于使用word2vec,还有很多其他的API可以用。它封装了google的C语言版的word2vec。当然我们可以可以直接使用C语言版的word2vec来学习,但是个人认为没有gensim的python版来的方便。安装gensim是很容易的,使用”pip install gensim”即可。

项目地址:https://github.com/RaRe-Technologies/gensim

gensim提供的word2vec主要功能:

在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法需要注意的参数有:

  • sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。后面我们会有从文件读出的例子。
  • size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。
  • window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。在实际使用中,可以根据实际的需求来动态调整这个window的大小。如果是小语料则这个值可以设的更小。对于一般的语料这个值推荐在[5,10]之间。
  • sg: 即我们的word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。
  • hs: 即我们的word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1的话并且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。
  • negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在我们的算法原理篇中标记为neg。
  • cbow_mean: 仅用于CBOW在做投影的时候,为0,则算法中的为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示,默认值也是1,不推荐修改默认值。
  • min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
  • iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
  • alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为,默认是0.025。
  • min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。这部分由于不是word2vec算法的核心内容,因此在原理篇我们没有提到。对于大语料,需要对alpha, min_alpha,iter一起调参,来选择合适的三个值。

以上就是gensim word2vec的主要的参数,可以看到相关的参数与C语言的版本类似。最简单的示例:

使用小说《人民的名义》作为语料进行训练:

总结

以上为使用Word2Vec训练词向量的流程,你可以自己训练后应用到生产环境中。除了维基百科的语料,另外也可以使用搜狗开源的新闻语料。另外更加推荐腾讯放出词向量数据(已跑好的模型)。该数据包含800多万中文词汇,相比现有的公开数据,在覆盖率、新鲜度及准确性上大幅提高。

其他资料:

腾讯词向量数据的使用

总体老说腾讯 AI Lab 开源的这份中文词向量的覆盖度比较高,精度也比较高。但是词向量里含有大量停用词,导致文件比较大加载速度较慢(数分钟),而且内存消耗较大,实际使用时根据场景需要裁剪以节省性能。由于这个词向量就是按照训练的词频进行排序的,前100w就能把我们的常用词覆盖到了。这里有已经裁剪好的数据:https://github.com/cliuxinxin/TX-WORD2VEC-SMALL

Tencent_AILab_ChineseEmbedding读入与高效查询

比较常见的读入方式:

这样纯粹就是以字典的方式读入,当然用于建模没有任何问题,但是笔者想在之中进行一些相似性操作,最好的就是重新载入gensim.word2vec系统之中,但载入时可能发生如下报错:

仔细一查看,发现原来一些词向量的词就是数字,譬如-0.2121或 57851,所以一直导入不进去。只能自己用txt读入后,删除掉这一部分,保存的格式参考下面。

第一行是一共5个词,每个词维度为4.

然后清洗完毕之后,就可以读入了:

但是又是一个问题,占用内存太大,导致不能查询相似词:

该操作是指model已经不再继续训练了,那么就锁定起来,让Model变为只读的,这样可以预载相似度矩阵,对于后面得相似查询非常有利。

未知词、短语向量补齐与域内相似词搜索

未知词语、短语的补齐手法是参考FastText的用法,当出现未登录词或短语的时候,会:先将输入词进行n-grams,然后去词表之中查找,查找到的词向量进行平均。
主要函数可见:

从词向量文件中提取词语生成自定义词库

主要应用场景:分词。(如果觉得词库太大,可以选择TOP N,目前词表是按热度排序的,所以处理起来很方便)

参考链接:https://blog.csdn.net/sinat_26917383/article/details/83999966

参考链接


使用word2vec训练中文维基百科

发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注