美文网首页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:您好,我在中文维基繁体转简体时遇到问题,那个命令要在哪里输入呢?输了好几次都没有转为简体
      • 旺仔_9f99:你好,这个脚本process_wiki.py 在哪可以得到呢?
        howe_howe:@旺仔_9f99 代码那个超链接
      • 櫻絳:楼主你好,感谢你的分享!我在处理英文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