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

环境准备

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‑1.13.1+mkl‑cp27‑cp27m‑win_amd64.whlscipy‑0.19.1‑cp27‑cp27m‑win_amd64.whl并点击下载,然后在该文件目录下安装。

gensim库

在命令行输入pip install gensim,如果出错,试一试下载这个gensim文件,在命令行执行pip 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要训练一个语料库,我们需要首先准备好语料库数据。在这里,我们将使用中文维基百科作为我们的语料库。以下是训练word2vec模型的步骤: 1. 下载维基百科语料库 中文维基百科提供了一个XML格式的数据库备份,可以从这里下载:https://dumps.wikimedia.org/zhwiki/latest/。请注意,这个文件很大,大约有5GB左右。下载后,您需要解压缩并将XML文件存储在本地文件夹中。 2. 清理维基百科语料库 由于维基百科包含大量的HTML标记,我们需要对其进行清理。我们可以使用Python中的BeautifulSoup库来进行清理。以下是一些示例代码: ```python from bs4 import BeautifulSoup import codecs # 读取维基百科XML文件 wiki_file = codecs.open("zhwiki-latest-pages-articles.xml", 'r', 'utf-8') # 创建BeautifulSoup对象并查找所有的text标签 soup = BeautifulSoup(wiki_file, 'html.parser') docs = soup.find_all('text') # 清理标点符号和数字 import re def clean_text(text): # 去除标点符号和数字 text = re.sub(r'[^\u4e00-\u9fa5]', '', text) return text # 将所有文档添加到列表中 cleaned_docs = [] for doc in docs: cleaned_doc = clean_text(doc.get_text()) cleaned_docs.append(cleaned_doc) ``` 3. 分词 接下来,我们将对每个文档进行分词。我们可以使用jieba库来进行中文分词。以下是一个示例代码: ```python import jieba # 分词函数 def tokenize(text): words = jieba.cut(text) return [word for word in words] # 将每个文档分词并添加到列表中 tokenized_docs = [] for doc in cleaned_docs: tokenized_doc = tokenize(doc) tokenized_docs.append(tokenized_doc) ``` 4. 训练Word2Vec模型 我们现在已经准备好训练word2vec模型了。我们可以使用gensim库来进行训练。以下是一个示例代码: ```python from gensim.models import Word2Vec # 训练Word2Vec模型 model = Word2Vec(tokenized_docs, size=300, window=5, min_count=5, workers=4) # 保存模型 model.save("zhwiki_word2vec.model") ``` 在上面的代码中,我们指定了一些参数来训练模型。例如,我们将词向量的维度设置为300,窗口大小设置为5,最小计数设置为5等等。您可以根据您的需要进行设置。 5. 使用Word2Vec模型 现在我们已经训练好了Word2Vec模型,我们可以使用它来查找相似的词语或计算词语之间的距离。以下是一个示例代码: ```python # 加载模型 model = Word2Vec.load("zhwiki_word2vec.model") # 查找相似的词语 similar_words = model.wv.most_similar("中国") print(similar_words) # 计算词语之间的距离 distance = model.wv.distance("北京", "上海") print(distance) ``` 在上面的代码中,我们加载了训练的模型,并使用它来查找与“中国”最相似的词语,以及计算“北京”和“上海”之间的距离。 希望这个实践指南对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值