美文网首页
英文维基百科语料上的word2vec实验

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

作者: 李傲龍 | 来源:发表于2017-09-15 16:06 被阅读180次

环境准备

python

先安装python,2.7和3的版本都可以。

pip

用pip来下载python各种库非常方便,在命令行输入入pip,如果不出错说明已经存在。如果没有的话,先下载pip安装文件,在该.whl文件所在目录打开命令行,输入python install pip-9.0.1-py2.py3-none-any.whl

numpy库 + scipy库

在命令行分别输入pip install numpypip install scipy来安装,如果出错看出错原因具体问题具体解决,可以试一试下载这个numpy文件scipy文件,然后在该文件目录下安装。

gensim库

在命令行输入pip install gensim,如果出错,试一试下载这个gensim文件,在命令行执行python install gensim-2.3.0-cp27-cp27m-win_amd64

pattern库

下载pattern文件,解压后进入文件目录执行python setup.py install

获取数据

要先获取英文维基百科的数据,可以在这个网站下载所需数据,这里下载一个1G多的bz2文件,通过process_wiki.py程序将该数据转换为txt格式,在命令行键入python process_wiki.py enwiki-latest-pages-articles1.xml-p10p30302.bz2 wiki.en.txt("wiki.en.txt"为输出文件,默认是当前路径)。得到的文件内容大致如图所示:

这个步骤是从语料库中进行分词,将句子分割成有意义的单词,用空格隔开。

代码如下:

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

import logging
import os.path
import six
import sys

from __future__ import print_function
from gensim.corpora import WikiCorpus

if __name__ == '__main__':
    reload(sys)
    sys.setdefaultencoding("utf-8")

    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(b' '.join(text).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")

对分词进行词向量处理

通过train_word2vec_model.py程序对wiki.en.txt进行处理,在命令行执行python train_word2vec_model.py wiki.en.txt wiki.en.txt.model wiki.en.txt.vector,得到wiki.en.txtwiki.en.txt.vector两个文件。

该步骤是将所得到的分词进行处理,得到对应的词向量,即用向量来表示每个分词,向量结果如图所示:

代码如下:

# -*- coding: utf-8 -*-
import logging
import os
import sys
import multiprocessing

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(globals()['__doc__'] % locals())
        sys.exit(1)
    inp, outp1, outp2 = sys.argv[1:4]

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

    # trim unneeded model memory = use(much) less RAM
    # model.init_sims(replace=True)
    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

分析词向量

通过output.py对得到的词向量模型进行分析,直接运行该文件得到result.txt文件。

该步骤对上一步得到的.model文件进行分析,.vector文件暂时不用,在该程序中,输入的关键词会被转换成词向量形式,然后与其它分词的词向量进行比较,所得到的结果即为该语料库中与输入关键词关联度较高的词语。

代码如下:

# -*- coding: utf-8 -*-
from gensim.models import word2vec

# 读取词向量
model = word2vec.Word2Vec.load("wiki.en.txt.model")

# 设置关键词
keywords = ["Nanoparticle", "Nanocluster", "cluster", "nanorod", "graphene", "carbon", "nanotube"]

for item in keywords:
    print '和%s最相关的词:' % item
    try:
        y = model.most_similar(item, topn=20)  # 20个最相关的
    except:
        print("无")
        continue
    for i in y:
        print('{0:20} {1}'.format(i[0] , i[1]))
    print "==================================="

参考:
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

相关文章

网友评论

      本文标题:英文维基百科语料上的word2vec实验

      本文链接:https://www.haomeiwen.com/subject/nlzssxtx.html