赞
踩
在做的实验中需要使用词向量,由于是特定的方法对比,需要自己训练词向量。
中英文除了自己已有的语料外,需要下载更多的单语语料数据来扩充数据集,于是选择了维基百科语料。
其中英文语料下载地址:
https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2
获取的数据是xml格式的,需要自己处理下,使用以下脚本:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- # Author: Pan Yang (panyangnlp@gmail.com)
- # Copyrigh 2017
-
- from __future__ import print_function
-
- import logging
- import os.path
- import six
- import sys
-
- from gensim.corpora import WikiCorpus
-
- if __name__ == '__main__':
- program = os.path.basename(sys.argv[0])
- logger = logging.getLogger(program)
-
- logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
- logging.root.setLevel(level=logging.INFO)
- logger.info("running %s" % ' '.join(sys.argv))
-
- # check and process input arguments
- if len(sys.argv) != 3:
- print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
- sys.exit(1)
- inp, outp = sys.argv[1:3]
- space = " "
- i = 0
-
- output = open(outp, 'w')
- wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
- for text in wiki.get_texts():
- if six.PY3:
- output.write(' '.join(text) + '\n')
- # ###another method###
- # output.write(
- # space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
- else:
- output.write(space.join(text) + "\n")
- i = i + 1
- if (i % 10000 == 0):
- logger.info("Saved " + str(i) + " articles")
-
- output.close()
- logger.info("Finished Saved " + str(i) + " articles")
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
本人是在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如下:
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
-
- import logging
- import os
- import sys
- import multiprocessing
-
- from gensim.models import Word2Vec
- from gensim.models.word2vec import LineSentence
-
- if __name__ == '__main__':
- program = os.path.basename(sys.argv[0])
- logger = logging.getLogger(program)
-
- logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
- logging.root.setLevel(level=logging.INFO)
- logger.info("running %s" % ' '.join(sys.argv))
-
- # check and process input arguments
- if len(sys.argv) < 4:
- print(globals()['__doc__'] % locals())
- sys.exit(1)
- inp, outp1, outp2 = sys.argv[1:4]
-
- model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
- workers=multiprocessing.cpu_count())
-
- # trim unneeded model memory = use(much) less RAM
- # model.init_sims(replace=True)
- model.save(outp1)
- model.wv.save_word2vec_format(outp2, binary=False)
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
执行 "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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。