词向量之word2vec实践

摘要:
首先,我要感谢所有无私分享的大神。本文中的许多内容可供参考。这次,我将记录我的实验过程,希望能帮助有需要的学生。1、 自从数据被下载以来,目前的中文语料库并不是特别丰富。我已经在以前的文章中整理过了,如果你感兴趣的话可以看看。这个实验使用wiki来发布数据。下载地址如下:Wiki英文数据下载:https://dumps.wikimedia.org/enwiki/latest/enwiki-latest-pag

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

一、从下载数据开始

    现在的中文语料库不是特别丰富,我在之前的文章中略有整理,有兴趣的可以看看。本次实验使用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

词向量之word2vec实践第1张词向量之word2vec实践第2张
 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

词向量之word2vec实践第3张词向量之word2vec实践第4张
 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

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

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

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

   

   

   

    

免责声明:文章转载自《词向量之word2vec实践》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇物体检测丨Faster R-CNN详解NBI可视化集成clickhouse,实现百亿级数据分析能力下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

pyltp环境的搭建

1.简介     1.1    LTP     语言技术平台 (Language Technology Platform)中文语言处理系统 ,哈工大社会计算与信息检索研究中心独立研发,(官网)。2011年,LTP正式开源。 LTP提供了一系列中文自然语言处理工具,用户可以使用这些工具对于中文文本进行分词、词性标注、句法分析等等工作。从应用角度来看,LTP...

pytorch的Embedding使用

torch.nn.Embedding存储的是形如num_embeddings*embedding_dim的矩阵,以词向量为例,num_embeddings表示词向量的个数,embedding_dim表示词向量的维度。 初始化: 它提供了从已知Tensor进行初始化的方法:nn.Embedding.from_pretrained 配合torch.from_n...

自然语言处理--jieba和gensim的分词功能

一、jieba分词功能 1、主要模式 支持三种分词模式: 精确模式,试图将句子最精确地切开,适合文本分析; 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义; 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。 支持繁体分词 支持自定义词典  2、算法 基于前缀词典实现高效的词图扫描,生...

自然语言处理中的分词问题总结

众所周知,英文是以词为单位的,词和词之间是靠空格隔开,而中文是以字为单位,句子中所有的字连起来才能描述一个意思。把中文的汉字序列切分成有意义的词,就是中文分词,有些人也称为切词。本文转载自明略研究院的技术经理牟小峰老师讲授的语言处理中的分词问题。 如何界定分词   中文分词指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新...

keras使用word2vec pretrained vector注意事项

在使用预训练的embedding层的时候,一定要注意词表的index,在word2vec中, model.wv.index2word 这个是一个list, index就是词的index,这个是固定的,即便是换到linux平台,这个index也是不变的,所以使用这个。 w2v_for_s2s = Word2Vec.load('model/word2vec_6...

Unsupervised Open Domain Recognition by Semantic Discrepancy Minimization论文笔记

Unsupervised Open Domain Recognition by Semantic Discrepancy Minimization论文笔记 Abstract 本文的作者解决的是一个无监督的开放域识别(UODR)问题,而在开放域中的源域与目标域的情况中,⭐源域是目标域的一个子集,即一个未标记的目标域T和一个仅覆盖目标域分类子集的有差异的标记源...