词向量之WORD2VEC实践

原文地址:https://www.cnblogs.com/Climbing-Snail/p/7729795.html

参考:基于 Gensim 的 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

#--*-- coding:utf-8 --*--

from __future__ import print_function

import logging
import os.path
import six
import sys

from gensim.corpora import WikiCorpus
#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))

    # check and process input arguments
    if len(sys.argv) != 3:
        print("Using: python process_wiki.py enwiki.xxx.xml.bz2 wiki.en.text")
        sys.exit(1)
    inp, outp = sys.argv[1:3]
    space = " "
    i = 0

    output = open(outp, 'w')
    wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
    for text in wiki.get_texts():
        if six.PY3:
            output.write(bytes(' '.join(text), 'utf-8').decode('utf-8') + '\n')
        #   ###another method###
        #    output.write(
        #            space.join(map(lambda x:x.decode("utf-8"), text)) + '\n')
        else:
            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.训练词向量

    训练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

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
#导入日志配置
import logging
import os
import sys
import multiprocessing
#引入word2vec
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

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

    # check and process input arguments
    if len(sys.argv) < 4:
        print("Useing: python train_word2vec_model.py input_text "
              "output_gensim_model output_word_vector")
        sys.exit(1)
    inp, outp1, outp2 = sys.argv[1:4]

    model = Word2Vec(LineSentence(inp), size=128, window=5, min_count=5,
                     workers=multiprocessing.cpu_count())

    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

Word2Vec 参数

  • min_count

model = Word2Vec(sentences, min_count=10) # default value is 5

在不同大小的语料集中,我们对于基准词频的需求也是不一样的。譬如在较大的语料集中,我们希望忽略那些只出现过一两次的单词,这里我们就可以通过设置min_count参数进行控制。一般而言,合理的参数值会设置在0~100之间。

  • size

size 是词向量维度

model = Word2Vec(sentences, size=200) # default value is 100
  • workers

workers参数用于设置并发训练时候的线程数,不过仅当Cython安装的情况下才会起作用:

model = Word2Vec(sentences, workers=4) # default = 1 worker = no parallelization

 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










猜你喜欢

转载自blog.csdn.net/u010417185/article/details/80969772