美文网首页gensim深度学习项目实践集文本挖掘
使用 word2vec 训练wiki中英文语料库

使用 word2vec 训练wiki中英文语料库

作者: howe_howe | 来源:发表于2016-03-06 16:18 被阅读16214次

上学期读了有关word2vec的两篇paper之后,不是很明白,这学期重新花时间再读,并且根据这两篇paper进行一个词向量相关的实验,选来选去,发现网上有大神就wiki中英文语料库进行训练,鉴于渣渣水平,于是就选择了训练使用词向量来训练wiki中英文语料库。

整个过程参考:“我爱自然语言处理”:www.52nlp.cn


准备工作

为了训练语料库,当然需要去下载。英文wiki语料库(11.9G) 中文wiki语料库(1.2G)

然后就是准备好编译环境,语言选择的是python,使用了gensim的库,该库是由Radim Řehůřek博士基于google发布的C语言版本的word2vec编写的Python库。如何安装该库就不多说了。

处理流程

1、英文wiki�训练

首先需要将xml的文件转换成txt文件,主要通过process_wiki.py这个脚本来进行,在参考文考网页中提出了注意“wiki = WikiCorpus(inp, lemmatize=False, dictionary={})"将lemmatize设置为False避免使用Pattern来讲英文单词词干化处理,以免变得很慢,于是就华丽丽的接受。整个过程大概用了5个小时左右,共有差不多400W的articles。

执行命令为:python3 process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text

生成了wiki.en.text,生成的效果如下:

wiki.en.text效果图

接下来就是拿wiki.en.text的文本进行词向量的调用处理,通过train_word2vec_model.py的脚本对该文件进行处理。

执行的命令为:

python3 train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector. 

同样采取参考blog的方式,保存了vector方便debug。训练了大概8个小时左右,之后在ipython中对已经训练好的model进行调试,调试如下:

英文wiki结果图(一) 英文wiki结果图(二)

在这里调试的时候并没有遇到参考blog中说到得问题,这里具体原因是什么,还是需要讨论。但是可以看出效果其实不怎么好,以后有机会会使用word2vec的C版本进行试验。当然,这里可以使用model的其他函数进行调试,具体可以看gensim的文档进行查看。

2、中文wiki训练

同样地和英文一样,使用process_wiki.py 进行脚本处理,处理了10分钟,执行命令为:

python3 process_wiki.py zhwiki-latest-pages-articles.xml.bz2 wiki.cn.text

处理得到的效果如下:

wiki.cn.text效果图

咦,全是繁体字,那么由于某种原因,wiki中文版本都是繁体字的语料,而且可以看出有一些英文,还有一些其他字符,而且还需要对中文进行分词,这些都是需要处理的部分。那么我们一步一步的来。


1)繁体转简体

繁体转成简体,通过blog得知了一种叫opencc的工具:OpenCC(github地址)

由于是OS X的系统,参见安装说明,但是发现并没有安装brew,于是又去安装brew,兴致冲冲的点进homebrew安装,结果发现主页无法进去,无奈又开始寻找解决方法,百度之。百度排名第一的英文界面貌似可以解决。

百度brew效果图

然而点进去,依然无法找到网页,于是机智的我点了百度快照。

安装brew代码

接下来就是一路安装,完成OpenCC的安装后。

执行命令:opencc -i wiki.cn.text -o wiki.cn.text.jian -c t2s.json

2)分词

中文不像英文一样,天生自带空格,于是就有了中文分词,在python中中文分词做的比较好的库是jieba分词库jieba(github地址)

通过代码库的实例,于是写了分词脚本seperate_words.py.

执行命令:python3 separate_words.py wiki.cn.text.jian wiki.cn.text.jian.seq 

得到了分好词的文件

3)去除多余的其他字符

最后通过python中自带的re库,使用正则表达式将其他字符去除,代码在remove_words.py

执行命令:python3 separate_words.py wiki.cn.text.jian.seq wiki.cn.text.jian.removed


之后就和英文分词一样,通过train_word2vec_model.py 进行处理

执行命令:python3 train_word2vec_model.py wiki.cn.text.jian.removed wiki.en.text.jian.model wiki.en.text.jian.vector.

最后测试一下运行的效果:

中文wiki结果图(一) 中文wiki结果图(二) 中文wiki效果图(三)

代码:word2vec-for-wiki

----

代码已经进行了review,在python3的情况下,存在bytes和str不兼容的问题已经解决了,另外将所有py文件全部放入一个文件中不同函数,在main()函数中也已经进行了各种处理的demo。由于gensim版本变化快,所以在载入model的时候可以参考最新gensim的api。

相关文章

网友评论

  • 别理我这个小可爱:有训练好的model可以分享一下吗?机器不行没法从头训练!_!
    7d51cd78a575:github里面的issue有
  • 4c029998bec7:您好,我在中文维基繁体转简体时遇到问题,那个命令要在哪里输入呢?输了好几次都没有转为简体
  • dd800e04fc5a:你好,这个脚本process_wiki.py 在哪可以得到呢?
    howe_howe:@旺仔_9f99 代码那个超链接
  • a34e8782a0c6:楼主你好,感谢你的分享!我在处理英文wiki语料的时候,在命令行输入“python3 process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text” 却得到error“python3: can't open file 'process_wiki.py': [Errno 2] No such file or directory”是因为找不到“process_wiki.py”这个脚本。 随后我做了两个尝试,先在网上找这个脚本下载,找不到。然后我有在命令行“pip install wiki”,我在想这个包里面会不会有呢?结果还是失败了。请楼主指条明路。 蟹蟹了啦~
    howe_howe:在文末处,我已经把代码放到了github上,可以随时下载。这个脚本不是通过什么包或者在网上下载的,是我自己的写的。
  • fbde584839f5:raise EOFError("Compressed file ended before the "
    EOFError: Compressed file ended before the end-of-stream marker was reached
    读取到中间 出现这个错误 请问有人出现过吗
  • A_arsenal:楼主你好,请问下通过train_word2vec_model.py 进行处理得到的模型能在其他平台上使用的吗? 或者生成其他格式的模型,是不是只要把输出的文件名称改一下就行了,我看到网上都是用的后缀是.bin的模型。
    howe_howe:@A_arsenal 代码两年前写的,近期可能会review一下。wiki语料库是一个较为通用的语料库,如果针对某领域的任务的话,精度可能就不是很好了。国内公开的语料真的是少,数据为王的时代,数据都是要用钱买了。
    A_arsenal:@howe_howe 感谢楼主的回复。 去除多余的其他字符,执行命令那行你应该是笔误写错了,python3 remove_words.py ... ... 这个命令的吧。 wiki语料库训练好的model测试时好像并不是很精确,分词时如果用jieba.cut_for_search("") 会不会得到的词会多一些? 或者你有别的语料下载推荐的吗?
    howe_howe:@A_arsenal 尝试下换成bin后缀的呗,应该是可以的
  • keaidelele:wiki-latest-pages-articles.xml.bz2 wiki.en.text
    Traceback (most recent call last):
    File "process_wiki.py", line 27, in <module>
    output.write(space.join(text) + '\n')
    TypeError: sequence item 0: expected str instance, bytes found
    楼主你好,请问你运行process_wiki.py 遇到过这个问题吗
    0be3bc6ebb20:楼主,我用的gensim 是 3.4.0版本的,运行你的代码报错,错误信息如下,我是python小白,能帮我解答一下吗?
    During handling of the above exception, another exception occurred:

    Traceback (most recent call last):
    File "C:/pythonWorkspace/Include/train_w2v_model.py", line 36, in <module>
    train_w2v_model(s, '../data/w2v_model.bin', '../data/w2v_vector.bin')
    File "C:/pythonWorkspace/Include/train_w2v_model.py", line 27, in train_w2v_model
    model = Word2Vec(LineSentence(inp), sg=1, size=100, window=5, min_count=5, negative=3, sample=0.001, hs=1, workers=4)
    File "C:\pythonWorkspace\venv1\lib\site-packages\gensim\models\word2vec.py", line 527, in __init__
    fast_version=FAST_VERSION)
    File "C:\pythonWorkspace\venv1\lib\site-packages\gensim\models\base_any2vec.py", line 335, in __init__
    self.build_vocab(sentences, trim_rule=trim_rule)
    File "C:\pythonWorkspace\venv1\lib\site-packages\gensim\models\base_any2vec.py", line 480, in build_vocab
    sentences, progress_per=progress_per, trim_rule=trim_rule)
    File "C:\pythonWorkspace\venv1\lib\site-packages\gensim\models\word2vec.py", line 1151, in scan_vocab
    for sentence_no, sentence in enumerate(sentences):
    File "C:\pythonWorkspace\venv1\lib\site-packages\gensim\models\word2vec.py", line 1073, in __iter__
    line = utils.to_unicode(line).split()
    File "C:\pythonWorkspace\venv1\lib\site-packages\gensim\utils.py", line 359, in any2unicode
    return unicode(text, encoding, errors=errors)
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc5 in position 0: invalid continuation byte
    keaidelele:@尐邱 space.join(text)是byte,'\n'是str,两个不能直接用+链接。
    2db96d4efb32:我也遇到了这个问题,请问你解决了么?
  • freedomzll:我的电脑是4核8G的内存,19号下午两点半开始训练词向量。到现在才完成74%,为什么差别这么大???
    7d51cd78a575:中文我训练了一个小时不到就搞定了
  • a81dd64da42c:哥们,我在使用51nlp提供的process_wiki.py抽取维基百科英文语料时出错了,因为他那个是基于python2.X的,而我看你也是用python3,你对process_wiki.py进行了什么样的修改呢,最近也查了很多资料,代码基于薄弱啊,求指教。
    howe_howe:好久之前写的,我把代码地址留在最后了,你可以去对比下:joy:
  • db13dc7ca150:楼主,您好 请问在win7中怎样装opencc呢?
  • 1978946f5317:楼主你好,对你的文章很感兴趣,但是英文语料库和中文语料库都打不开了 ,请问还有别的链接吗
    howe_howe:刚尝试点击了下,都能打开啊
  • 酱油攻城狮:学习了,谢谢楼主
  • d148988f9ef1:楼主,您好,很高兴看到您写的这个实验心得,我从头到尾都走过来了,真的受益匪浅,现在遇到了以下几个问题:
    1)在去除多余的其他字符这块,执行命令时是用separate_words.py个吗?而不是用removed_words.py个吗?
    2)如果用了removed_words.py这个文件的话,运行出来的全都是英文字段?
    f4f33b2f49c1:我刚试了一下,发现保留的是所有的英文
    howe_howe:@jianshuLee 出去多余字符用的是removed_words.py这个文件啊,上面写的也是这样。这个removed的py文件的作用是保留所有空格以及中文字符,执行出来应该不会是英文字段吧。
  • 1fca07a7f378:java中有没有类似于 gensim的这样的库?
  • 1fca07a7f378:楼主训练好的模型能不能传一份啊。实验室机子训练的时候,总是崩溃。。。
    howe_howe:@steady_pace 我当初训练的时候都是用自己的电脑训练- -,训练好的模型也没保存。另外java这方面的东西不是很了解,不好意思。
  • e539cd60e3f4:请问,如果我要用这个做的word2vec,是不是只需要把自己的数据用于训练,然后得到模型,就可以了
    howe_howe:@aiaibibi 当然可以啊,不过我做的时候训练时没去停词,使用词向量的时候再去的停词。至于参数是什么意思,参考http://radimrehurek.com/gensim/models/word2vec.html。写的很清楚了。
    e539cd60e3f4:请问训练的时候需可以把动词和停用词去掉可以吗?还有这几个参数具体应该怎么设置呢?size=20, window=5, min_count=10, workers=4 ,能具体解释一下这几个参数的对训练模型的影响吗?看了官方文档不是很明白
    howe_howe:@aiaibibi 是的,不过词向量对于低频词效果不好。自己的数据集要精心修饰。😁

本文标题:使用 word2vec 训练wiki中英文语料库

本文链接:https://www.haomeiwen.com/subject/jjqakttx.html