一、利用wiki中文语料进行word2vec模型构建
1)数据获取
到wiki官网下载中文语料,下载完成后会得到命名为zhwiki-latest-pages-articles.xml.bz2的文件,里面是一个XML文件
下载地址如下:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
其中:https://dumps.wikimedia.org/zhwiki/latest/提供wiki各种文件下载,而且在不停的更新
本人已经下载并上传百度云盘,链接:https://pan.baidu.com/s/1kzMwGwVR4h0wuOYU70aUhA 提取码:2axt
然后在桌面新建wiki中文语料的word2vec模型构建文件夹,将下载的压缩文件放在内,进入wiki中文语料的word2vec模型构建文件夹,按住shift+右键,选择在此处打开命令窗口
输入jupyter notebook,新建一个名为:wiki_word2vec_test的脚本文件:
2)将XML的Wiki数据转换为text格式
使用gensim.corpora中的WikiCorpus函数来处理维基百科的数据,转换后生成的文件wiki.zh.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | import logging import sys import os from gensim.corpora import WikiCorpus 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) ) inp = 'zhwiki-latest-pages-articles.xml.bz2' outp = 'wiki.zh.txt' space = ' ' i = 0 output = open (outp, 'w' , encoding = 'utf-8' ) #gensim里的维基百科处理类WikiCorpu wiki = WikiCorpus(inp, lemmatize = False , dictionary = [] ) #通过get_texts将维基里的每篇文章转换为1行text文本,并且去掉了标点符号等内容 for text in wiki.get_texts(): output.write( space.join(text) + '\n' ) i + = 1 if ( i % 10000 = = 0 ): logger.info( 'Saved ' + str (i) + ' articles.' ) output.close() logger.info( 'Finished Saved ' + str (i) + ' articles.' ) |
从下面的结果看27min处理了331588条数据,还是比较慢的,已经将wiki.zh.txt上传云盘,并且被压缩:
链接:https://pan.baidu.com/s/1g7d87ztvAdr8CZd2rCnvOg 提取码:42x5
3)中文繁体转简体
Wiki中文语料中包含了很多繁体字,需要转成简体字再进行处理,这里使用到了OpenCC工具进行转换
安装OpenCC:下载对应版本的OpenCC,https://bintray.com/package/files/byvoid/opencc/OpenCC,本人选择的是win 64位
下载解压后,在wiki中文语料的word2vec模型构建文件夹下打开dos窗口:
1 2 | opencc -i wiki.zh.txt -o wiki.zh.simp.txt -c t2s.json #注意可以添加上opencc的绝对路径,t2s.json也要加绝对路径 |
则会得到文件wiki.zh.simp.txt,即转成了简体的中文,由于文件过大,无法直接打开查看,我们使用代码查看前2行:
1 2 3 4 5 6 7 8 9 | import codecs,sys i = 0 f = codecs. open ( 'wiki.zh.txt' , 'r' ,encoding = "utf-8" ) for eachline in f: i + = 1 if (i < 3 ): print (eachline) else : break |
可以看出有很多繁体字:
我们再来看看繁体转简体后:
1 2 3 4 5 6 7 8 9 | import codecs,sys i = 0 f = codecs. open ( 'wiki.zh.simp.txt' , 'r' ,encoding = "utf-8" ) for eachline in f: i + = 1 if (i < 3 ): print (eachline) else : break |
是不是都看懂了呢?
其中的wiki.zh.simp.txt简体文件以及被我压缩,并上传至云盘:
链接:https://pan.baidu.com/s/1Gx1iWORvKvmd5AzaZY3raw 提取码:45k5
4)jieba分词
本例中采用结巴分词对字体简化后的wiki中文语料数据集进行分词。由于此语料已经去除了标点符号,因此在分词程序中无需进行清洗操作,可直接分词
若是自己采集的数据还需进行标点符号去除和去除停用词的操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import jieba import jieba.analyse import codecs def prepareData(sourceFile, targetFile): f = codecs. open (sourceFile, 'r' , encoding = 'utf-8' ) target = codecs. open (targetFile, 'w' , encoding = 'utf-8' ) print ( 'open source file: ' + sourceFile ) print ( 'open target file: ' + targetFile ) lineNum = 0 for eachline in f: lineNum + = 1 if lineNum % 1000 = = 0 : print ( '---processing ' , sourceFile, lineNum, ' article---' ) seg_list = jieba.cut(eachline, cut_all = False ) line_seg = ' ' .join(seg_list) target.write(line_seg + '\n' ) print ( '---Well Done!!!---' * 4 ) f.close() target.close() sourceFile = 'wiki.zh.simp.txt' targetFile = 'wiki.zh.simp.seg.txt' prepareData(sourceFile, targetFile) |
查看分词结果文件-wiki.zh.simp.seg.txt
1 2 3 4 5 6 7 8 9 | import codecs,sys i = 0 f = codecs. open ( 'wiki.zh.simp.seg.txt' , 'r' ,encoding = "utf-8" ) for eachline in f: i + = 1 if (i < 3 ): print (eachline) else : break |
其中分词结果文件wiki.zh.simp.seg.txt已经被压缩并上传云盘:
链接:https://pan.baidu.com/s/15R75m5T2WlyjMagqkXbI6g 提取码:zr46
5)Word2Vec模型训练
分好词的文档即可进行word2vec词向量模型的训练了。文档较大,需要内存较大,具体Python代码实现如下所示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import os import sys import logging from gensim.models import Word2Vec from gensim.models.word2vec import LineSentence import multiprocessing program = os.path.basename(sys.argv[ 0 ]) logger = logging.getLogger(program) logging.basicConfig( format = '%(asctime)s: %(levelname)s: %(message)s' ,level = logging.INFO) logger.info( "running %s" % ' ' .join(sys.argv)) # inp为输入语料, outp1 为输出模型, outp2为原始c版本word2vec的vector格式的模型 inp = 'wiki.zh.simp.seg.txt' outp1 = 'wiki.zh.text.model' outp2 = 'wiki.zh.text.vector' #训练skip-gram 模型 model = Word2Vec( LineSentence(inp), size = 400 , window = 5 , min_count = 5 , workers = multiprocessing.cpu_count() ) model.save(outp1) model.wv.save_word2vec_format(outp2, binary = False ) |
摘取了最后几行代码运行信息,代码运行完成后得到如下四个文件,其中wiki.zh.text.model是建好的模型,wiki.zh.text.vector是词向量,是每个词对应的词向量,可以在此基础上作文本特征的提取以及分类
其中wiki.zh.text.mode和wiki.zh.text.vector文件已经上传云盘:
wiki.zh.text.mode:https://pan.baidu.com/s/1mlZ_5-mY3GerWnvYADt3sA 提取码:7p83
wiki.zh.text.vector:https://pan.baidu.com/s/16vEVQ79FkmVFwMPrA3G5mg 提取码:aaa5
6)模型测试
模型训练好后,来测试模型的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | import warnings warnings.filterwarnings(action = 'ignore' , category = UserWarning, module = 'gensim' ) # 忽略警告 import sys import gensim model = gensim.models.Word2Vec.load( 'wiki.zh.text.model' ) #与足球最相似的 word = model.most_similar( "足球" ) for each in word: print (each[ 0 ], each[ 1 ]) print ( '*' * 20 ) word = model.most_similar(positive = [ '皇上' , '国王' ],negative = [ '皇后' ]) for t in word: print (t[ 0 ],t[ 1 ]) print (model.doesnt_match( '太后 妃子 贵人 贵妃 才人' .split( ' ' ))) print ( '*' * 20 ) print (model.similarity( '书籍' , '书本' )) print ( '*' * 20 ) print (model.similarity( '逛街' , '书本' )) |
7)致谢
至此,使用python对中文wiki语料的词向量建模就全部结束了,wiki.zh.text.vector中是每个词对应的词向量,可以在此基础上作文本特征的提取以及分类
本文参考:https://github.com/AimeeLee77/wiki_zh_word2vec
感谢作者的分享,为后续情感分析打下了基础