word2vec- -入门 2

本文介绍了如何在Ubuntu 16.04环境下,使用Python 2.7和gensim库处理2015年3月的英文维基百科XML数据,将其转化为text格式并训练word2vec模型。通过process_wiki.py脚本将XML数据预处理,然后用train_word2vec_model.py进行模型训练,最终得到词向量表示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

英文维基百科的数据,下载的是xml压缩后的最新数据(下载日期是2015年3月1号),大概14G,下载地址:

https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pages-articles.xml.bz2

环境:Ubuntu16.04下Python 2.7

参考: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/comment-page-1

1、处理包括两个阶段,首先将xml的wiki数据转换为text格式,通过下面这个脚本(process_wiki.py)实现:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Pan Yang (panyangnlp@gmail.com)
# Copyrigh 2017
 
from __future__ import print_function
 
import logging
import os.path
import six
import sys
import io
 
from gensim.corpora 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 = io.open(outp, 'w', encoding='utf-8')  #python3下可以不用io
    wiki = WikiCorpus(inp, lemmatize=False, dictionary={}) #将lemmatize设置为False的主要目的是不使用pattern模块来进行英文单词的词干化处理,无论你是否已经安装了pattern,因为使用pattern会严重影响这个处理过程,变得很慢
    for text in wiki.get_texts(): #通过get_texts将维基里的每篇文章转换位1行text文本,并且去掉了标点符号等内容
        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")

##  执行"python process_wiki.py enwiki-latest-pages-articles.xml.bz2 wiki.en.text"

注:利用了gensim里的维基百科处理类WikiCorpus,通过get_texts将维基里的每篇文章转换位1行text文本,并且去掉了标点符号等内容,注意这里“wiki = WikiCorpus(inp, lemmatize=False, dictionary={})”将lemmatize设置为False的主要目的是不使用pattern模块来进行英文单词的词干化处理,无论你的电脑是否已经安装了pattern,因为使用pattern会严重影响这个处理过程,变得很慢。

2、有了这个数据后,使用脚本train_word2vec_model.py进行模型训练如下:

#!/usr/bin/env python
# -*- 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) 
## 执行 "python train_word2vec_model.py wiki.en.text wiki.en.text.model wiki.en.text.vector"

获得词向量表示wiki.en.text.vector

3、通过gensim来加载和测试这个模型

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

import gensim

model = gensim.models.Word2Vec.load_word2vec_format("wiki.en.text.vector", binary=False)

result=model.most_similar("queen")
for e in result:
    print(e[0], e[1])
print('---------------------------------')
print(model.similarity("woman", "man"))
print('---------------------------------')
print(model.doesnt_match("breakfast cereal dinner lunch".split())
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值