• wiki中文语料的word2vec模型构建


    一、利用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

    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) + '
    ' )
        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窗口:

    opencc -i wiki.zh.txt -o wiki.zh.simp.txt -c t2s.json
    #注意可以添加上opencc的绝对路径,t2s.json也要加绝对路径
    

      

      则会得到文件wiki.zh.simp.txt,即转成了简体的中文,由于文件过大,无法直接打开查看,我们使用代码查看前2行:

    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
    

      可以看出有很多繁体字:

      我们再来看看繁体转简体后:

    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中文语料数据集进行分词。由于此语料已经去除了标点符号,因此在分词程序中无需进行清洗操作,可直接分词

      若是自己采集的数据还需进行标点符号去除和去除停用词的操作

    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+ '
    ')
        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

    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代码实现如下所示:

    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.modewiki.zh.text.vector文件已经上传云盘:

      wiki.zh.text.modehttps://pan.baidu.com/s/1mlZ_5-mY3GerWnvYADt3sA 提取码:7p83

      wiki.zh.text.vectorhttps://pan.baidu.com/s/16vEVQ79FkmVFwMPrA3G5mg 提取码:aaa5 

     

     6)模型测试

      模型训练好后,来测试模型的结果

    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

      感谢作者的分享,为后续情感分析打下了基础

  • 相关阅读:
    如何提高JavaScript代码质量
    移动端Web开发调试之Chrome远程调试(Remote Debugging)
    【Mybatis】Mybatis基本构成
    【基础】httpclient注意事项
    【线程】Thread中的join介绍
    【线程】Volatile关键字
    【Spring源码深度解析学习系列】Bean的加载(六)
    【前端积累】javascript事件
    【Spring源码深度解析学习系列】注册解析的BeanDefinition(五)
    【Nginx系列】Nginx之location
  • 原文地址:https://www.cnblogs.com/always-fight/p/10310418.html
Copyright © 2020-2023  润新知