中英文维基百科语料上的Word2Vec实验

这篇作为完整的词向量模型训练过程记录~~~

一、数据获取

wiki中文:wiki中文

wiki英文:wiki英文

中文文件大小约1.3G,英文文件大小约13.8G。

二、将xml文件转换为text格式使用gensim.corpora中的WikiCorpus函数来处理维基百科的数据,具体方法是get_texts().

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 将xml的wiki数据转换为text格式

import logging
import os.path
import sys
import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')  # 忽略警告
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))

    if len(sys.argv) < 3:
        print(globals()['__doc__'] % locals())
        sys.exit(1)

    inp, outp = sys.argv[1:3]
    space = " "
    i = 0

    output = open(outp, 'w', encoding='utf-8')
    wiki =WikiCorpus(inp, lemmatize=False, dictionary=[])  # gensim里的维基百科处理类WikiCorpus
    for text in wiki.get_texts():  # 通过get_texts将维基里的每篇文章转换位1行text文本,并且去掉了标点符号等内容
        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.")

英文数据处理大约2个小时,中文大约30分钟。

中英文维基百科语料上的Word2Vec实验_第1张图片


三、中文繁体转简体

1)安装OpenCC

到以下链接地址下载对应版本的OpenCC,本人下载的版本是opencc-1.0.1-win64。https://bintray.com/package/files/byvoid/opencc/OpenCC 另外,资料显示还有python版本的,使用pip install opencc-python进行安装,未实践不做赘述。

2)使用OpenCC进行繁简转换

进入解压后的opencc的目录(opencc-1.0.1-win32),双击opencc.exe文件。在txt文件所在目录下打开dos窗口(Shift+鼠标右键->在此处打开命令窗口),输入如下命令行:

 opencc -i wiki.zh.txt -o wiki.zh.simp.txt -c t2s.json

则会得到文件wiki.zh.simp.txt,即转成了简体的中文。

中英文维基百科语料上的Word2Vec实验_第2张图片      中英文维基百科语料上的Word2Vec实验_第3张图片

四、中文分词

采用结巴分词对简体中文文件进行分词。由于此语料已经去除了标点符号,因此在分词程序中无需进行清洗操作,可直接分词。若是自己采集的数据还需进行标点符号去除和去除停用词的操作。

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 逐行读取文件数据进行jieba分词

import jieba
import jieba.analyse
import jieba.posseg as pseg #引入词性标注接口 
import codecs, sys


if __name__ == '__main__':
    f = codecs.open('wiki.zh.simp.txt', 'r', encoding='utf-8')
    target = codecs.open('wiki.zh.simp.seg.txt', 'w', encoding='utf-8')
    print('open files.')

    lineNum = 1
    line = f.readline()
    while line:
        print('---processing ', lineNum, ' article---')
        seg_list = jieba.cut(line, cut_all=False)
        line_seg = ' '.join(seg_list)
        target.writelines(line_seg)
        lineNum = lineNum + 1
        line = f.readline()

    print('well done.')
    f.close()
    target.close()

中英文维基百科语料上的Word2Vec实验_第4张图片

五、训练Word2Vec模型

接下来中文分完词的文档或英文文档可进行Word2Vec模型的训练。

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 使用gensim word2vec训练脚本获取词向量

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')  # 忽略警告
import logging
import os.path
import sys
import multiprocessing
from gensim.corpora import WikiCorpus
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence


if __name__ == '__main__':

    # print(open('/Users/sy/Desktop/pyRoot/wiki_zh_vec/cmd.txt').readlines())
    # sys.exit()
    
    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格式的模型
    fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
    inp = fdir + 'wiki.zh.simp.seg.txt'
    outp1 = fdir + 'wiki.zh.text.model'
    outp2 = fdir + 'wiki.zh.text.vector'

    # 训练skip-gram模型 sg=1
    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)

过程:

中英文维基百科语料上的Word2Vec实验_第5张图片

结果:(英文数据建模时间较长)

中英文维基百科语料上的Word2Vec实验_第6张图片     中英文维基百科语料上的Word2Vec实验_第7张图片

六、模型测试

#!/usr/bin/env python
# -*- coding: utf-8  -*-
# 测试训练好的模型

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告
import sys
# reload(sys)
# sys.setdefaultencoding('utf-8')
import gensim


if __name__ == '__main__':
    fdir = 'D:/file_download/BaiduNetdiskDownload/PyCharm_File/wiki_zh_word2vec-master/'
    model = gensim.models.Word2Vec.load(fdir + 'wiki.zh.text.model')

    word = model.most_similar(u"篮球")
    for t in word:
        print(t[0], t[1])

中英文维基百科语料上的Word2Vec实验_第8张图片

参考:

【1】https://github.com/AimeeLee77/wiki_zh_word2vec

【2】

http://www.52nlp.cn/%E4%B8%AD%E8%8B%B1%E6%96%87%E7%BB%B4%E5%9F%BA%E7%99%BE%E7%A7%91%E8%AF%AD%E6%96%99%E4%B8%8A%E7%9A%84word2vec%E5%AE%9E%E9%AA%8C

你可能感兴趣的:(NLP)