zoukankan      html  css  js  c++  java
  • 词向量之word2vec实践

    首先感谢无私分享的各位大神,文中很多内容多有借鉴之处。本次将自己的实验过程记录,希望能帮助有需要的同学。

    一、从下载数据开始

        现在的中文语料库不是特别丰富,我在之前的文章中略有整理,有兴趣的可以看看。本次实验使用wiki公开数据,下载地址如下:

            wiki英文数据下载:https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2

            wiki中文数据下载:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

    二、英文数据处理

        1.抽取文本        wiki数据内容比较复杂,所以在处理之前需要做一些预处理。通过 process_wiki.py 将wiki数据中的每一篇文章转为1行文本。

         执行下行命令:

    '''
    process_wiki.py    处理程序
    enwiki-latest-pages-articles.xml.bz2    英文wiki数据
    wiki.en.text    输出的文本文件
    '''
    python process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text

    process_wiki.py

     1 #--*-- coding:utf-8 --*--
     2 
     3 from __future__ import print_function
     4 
     5 import logging
     6 import os.path
     7 import six
     8 import sys
     9 
    10 from gensim.corpora import WikiCorpus
    11 #import WikiCorpus
    12 
    13 if __name__ == '__main__':
    14     program = os.path.basename(sys.argv[0])
    15     logger = logging.getLogger(program)
    16 
    17     logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    18     logging.root.setLevel(level=logging.INFO)
    19     logger.info("running %s" % ' '.join(sys.argv))
    20 
    21     # check and process input arguments
    22     if len(sys.argv) != 3:
    23         print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
    24         sys.exit(1)
    25     inp, outp = sys.argv[1:3]
    26     space = " "
    27     i = 0
    28 
    29     output = open(outp, 'w')
    30     wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
    31     for text in wiki.get_texts():
    32         if six.PY3:
    33             output.write(bytes(' '.join(text), 'utf-8').decode('utf-8') + '
    ')
    34         #   ###another method###
    35         #    output.write(
    36         #            space.join(map(lambda x:x.decode("utf-8"), text)) + '
    ')
    37         else:
    38             output.write(space.join(text) + "
    ")
    39         i = i + 1
    40         if (i % 10000 == 0):
    41             logger.info("Saved " + str(i) + " articles")
    42 
    43     output.close()
    44 logger.info("Finished Saved " + str(i) + " articles")
    View Code

        2.训练词向量

        训练word2vec的开源代码非常多,使用的语言种类也很丰富,本实验使用gensim包训练词向量,其特点使用简便,训练速度快。

        执行下行命令:

    '''
    train_word2vec_model.py    训练程序
    wiki.en.text    wiki文本数据
    wiki.en.text.model    训练模型参数
    wiki.en.text.vector    输出的词向量文件
    '''
    python train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector

    train_word2vec_model.py

     1 #!/usr/bin/env python
     2 # -*- coding: utf-8 -*-
     3 
     4 from __future__ import print_function
     5 
     6 import logging
     7 import os
     8 import sys
     9 import multiprocessing
    10 
    11 from gensim.models import Word2Vec
    12 from gensim.models.word2vec import LineSentence
    13 
    14 if __name__ == '__main__':
    15     program = os.path.basename(sys.argv[0])
    16     logger = logging.getLogger(program)
    17 
    18     logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    19     logging.root.setLevel(level=logging.INFO)
    20     logger.info("running %s" % ' '.join(sys.argv))
    21 
    22     # check and process input arguments
    23     if len(sys.argv) < 4:
    24         print("Useing: python train_word2vec_model.py input_text "
    25               "output_gensim_model output_word_vector")
    26         sys.exit(1)
    27     inp, outp1, outp2 = sys.argv[1:4]
    28 
    29     model = Word2Vec(LineSentence(inp), size=128, window=5, min_count=5,
    30                      workers=multiprocessing.cpu_count())
    31 
    32     model.save(outp1)
    33     model.wv.save_word2vec_format(outp2, binary=False)
    View Code

        3.测试词向量

    import gensim    #导入包
    model = gensim.models.KeyedVectors.load_word2vec_format("wiki.en.text.vector", binary=False)
    model.most_similar('queen')    #测试相关词
    model.similarity("woman", "man")    #测试次间距

    三、中文数据处理

        1.抽取文本

        同英文处理类似,执行如下命令:

    python process_wiki.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text

        2.繁体字转简体字         

        wiki中文数据中存在很多繁体中文,因此首先需要将繁体字转为简体中文。

        本文使用开源工具 opencc,首先安装:

         (1) linux安装及执行

     yum install opencc-tools     #安装
    
    #执行命令
    '''
    wiki.zh.text    输入的为转化文本
    wiki.zh.text.jian    输出的简体中文文本
    -c    hk2s.json
           s2hk.json
           zhs2zht.json
           s2tw.json
           s2twp.json
           zht2zhs.json
           tw2s.json
           tw2sp.json
    '''
    opencc -i wiki.zh.text -o wiki.zh.text.jian -c zht2zhs.json

         (2)python安装及执行

    pip install OpenCC      #安装
    #执行
    import opencc
    opencc.convert(string, config='t2s.json')

        3.分词       

        本文使用结巴分词,使用方法比较简单,在这里不加赘述。

        4.编码处理

        将文本全部转为UTF-8编码

    iconv -c -t UTF-8 < wiki.zh.text.jian.seg > wiki.zh.text.jian.seg.utf-8

        5.训练词向量      

        执行下行命令(训练代码同英文训练):

    '''
    train_word2vec_model.py    训练程序
    wiki.zh.text    wiki文本数据
    wiki.zh.text.model    训练模型参数
    wiki.zh.text.vector    词向量文件
    '''
    python train_word2vec_model.py wiki.zh.text wiki.zh.text.model wiki.zh.text.vector

        6.测试词向量(同英文词向量测试)

    import gensim
    model = gensim.models.KeyedVectors.load_word2vec_format("wiki.zh.text.vector", binary=False)
    model.most_similar('女人')
    model.similarity("女人", "男人")

    四、其他

        除了使用上文中的process_wiki.py,还可以使用 Wikipedia Extractor,命令如下:

    '''
    参数 -b 1000M 表示以 1000M 为单位切分文件,
    默认是 500K。由于最后生成的正文文本不到 600M,
    把参数设置的大一些可以保证最后的抽取结果全部存在
    一个文件里
    '''
    bzcat zhwiki-latest-pages-articles.xml.bz2 | python WikiExtractor.py -b 1000M -o extracted >output.txt

     **********************************

    *         吃饱了踏实,努力了充实          *

     **********************************

       

       

       

        

  • 相关阅读:
    【模板】线段树
    【模板】快速幂
    【模板】SPFA
    【模板】链式前向星
    C语言博客作业--函数嵌套调用
    C语言博客作业--结构体
    C博客作业--指针
    C语言博客作业--字符数组
    C语言博客作业--一二维数组
    C语言博客作业--函数
  • 原文地址:https://www.cnblogs.com/Climbing-Snail/p/7729795.html
Copyright © 2011-2022 走看看