当前位置:   article > 正文

中英文维基百科语料上的word2vec实验_enwiki-20220301-pages-articles

enwiki-20220301-pages-articles

在做的实验中需要使用词向量,由于是特定的方法对比,需要自己训练词向量。

中英文除了自己已有的语料外,需要下载更多的单语语料数据来扩充数据集,于是选择了维基百科语料。

其中英文语料下载地址:

https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2

获取的数据是xml格式的,需要自己处理下,使用以下脚本:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Author: Pan Yang (panyangnlp@gmail.com)
  4. # Copyrigh 2017
  5. from __future__ import print_function
  6. import logging
  7. import os.path
  8. import six
  9. import sys
  10. from gensim.corpora import WikiCorpus
  11. if __name__ == '__main__':
  12. program = os.path.basename(sys.argv[0])
  13. logger = logging.getLogger(program)
  14. logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
  15. logging.root.setLevel(level=logging.INFO)
  16. logger.info("running %s" % ' '.join(sys.argv))
  17. # check and process input arguments
  18. if len(sys.argv) != 3:
  19. print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
  20. sys.exit(1)
  21. inp, outp = sys.argv[1:3]
  22. space = " "
  23. i = 0
  24. output = open(outp, 'w')
  25. wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
  26. for text in wiki.get_texts():
  27. if six.PY3:
  28. output.write(' '.join(text) + '\n')
  29. # ###another method###
  30. # output.write(
  31. # space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
  32. else:
  33. output.write(space.join(text) + "\n")
  34. i = i + 1
  35. if (i % 10000 == 0):
  36. logger.info("Saved " + str(i) + " articles")
  37. output.close()
  38. logger.info("Finished Saved " + str(i) + " articles")

本人是在python3环境下处理的数据,直接执行原来的脚本报错,TypeError: sequence item 0: expected a bytes-like object, str found

针对问题对第35行进行了修改,可以处理数据了,

执行"python process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text":

处理后的数据形式:

这里利用了gensim里的维基百科处理类WikiCorpus,通过get_texts将维基里的每篇文章转换位1行text文本,并且去掉了标点符号等内容,注意这里“wiki = WikiCorpus(inp, lemmatize=False, dictionary={})”将lemmatize设置为False的主要目的是不使用pattern模块来进行英文单词的词干化处理,无论你的电脑是否已经安装了pattern,因为使用pattern会严重影响这个处理过程,变得很慢。

大约跑了4个半小时,处理了375万的文章后,我们得到了一个12G的text格式的英文维基百科数据wiki.en.text。

有了这个数据后,无论用原始的word2vec binary版本还是gensim中的python word2vec版本,都可以用来训练word2vec模型,不过我们试了一下前者,发现很慢,所以还是采用google group 讨论帖中的gensim word2vec方式的训练脚本,不过做了一点修改,保留了vector text格式的输出,方便debug, 脚本train_word2vec_model.py如下:

  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. import logging
  4. import os
  5. import sys
  6. import multiprocessing
  7. from gensim.models import Word2Vec
  8. from gensim.models.word2vec import LineSentence
  9. if __name__ == '__main__':
  10. program = os.path.basename(sys.argv[0])
  11. logger = logging.getLogger(program)
  12. logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
  13. logging.root.setLevel(level=logging.INFO)
  14. logger.info("running %s" % ' '.join(sys.argv))
  15. # check and process input arguments
  16. if len(sys.argv) < 4:
  17. print(globals()['__doc__'] % locals())
  18. sys.exit(1)
  19. inp, outp1, outp2 = sys.argv[1:4]
  20. model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
  21. workers=multiprocessing.cpu_count())
  22. # trim unneeded model memory = use(much) less RAM
  23. # model.init_sims(replace=True)
  24. model.save(outp1)
  25. model.wv.save_word2vec_format(outp2, binary=False)

执行 "python train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector":

大约跑了7个小时,我们得到了一个gensim中默认格式的word2vec model和一个原始c版本word2vec的vector格式的模型: wiki.en.text.vector,格式如下:

二、中文维基百科的Word2Vec测试

测试完英文维基百科之后,自然想试试中文的维基百科数据,与英文处理过程相似,也分两个步骤,不过这里需要对中文维基百科数据特殊处理一下,包括繁简转换,中文分词,去除非utf-8字符等。中文数据的下载地址是:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

中文维基百科的数据比较小,整个xml的压缩文件大约才1G,相对英文数据小了很多。首先用 process_wiki.py处理这个XML压缩文件,执行:python process_wiki.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text

得到了大约23万多篇中文语料的text格式的语料:wiki.zh.text,大概750多M。不过查看之后发现,除了加杂一些英文词汇外,还有很多繁体字混迹其中,这里还是参考了 @licstar 《维基百科简体中文语料的获取》中的方法,安装opencc,然后将wiki.zh.text中的繁体字转化位简体字:

opencc -i wiki.zh.text -o wiki.zh.text.jian -c zht2zhs.ini

然后就是分词处理了,这次我用基于MeCab训练的一套中文分词系统来进行中文分词,目前虽还没有达到实用的状态,但是性能和分词结果基本能达到这次的使用要求:

mecab -d ../data/ -O wakati wiki.zh.text.jian -o wiki.zh.text.jian.seg -b 10000000

注意这里data目录下是给mecab训练好的分词模型和词典文件等,详细可参考《用MeCab打造一套实用的中文分词系统》。

有了中文维基百科的分词数据,还以为就可以执行word2vec模型训练了:

python train_word2vec_model.py wiki.zh.text.jian.seg wiki.zh.text.model wiki.zh.text.vector

不过仍然遇到了问题,提示的错误是:

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 5394-5395: invalid continuation byte

google了一下,大致是文件中包含非utf-8字符,又用iconv处理了一下这个问题:

iconv -c -t UTF-8 < wiki.zh.text.jian.seg > wiki.zh.text.jian.seg.utf-8

这样基本上就没问题了,执行:

python train_word2vec_model.py wiki.zh.text.jian.seg.utf-8 wiki.zh.text.model wiki.zh.text.vector

 

中文处理参考:https://www.jianshu.com/p/e21dd72e391e

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/344171
推荐阅读
相关标签
  

闽ICP备14008679号