使用中文维基百科语料库训练一个word2vec模型

转自:https://blog.csdn.net/sinat_29957455/article/details/81432846

本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模型。

相关资料下载:

中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/20180720/

WikiExtractor项目git地址:https://github.com/attardi/wikiextractor

OpenCC项目git地址:https://github.com/BYVoid/OpenCC

中文分词jieba项目git地址:https://github.com/fxsjy/jieba

gensim官网地址:https://radimrehurek.com/gensim/install.html

一、语料库的下载

我下载是zhwiki-20180720-pages-articles.xml.bz2文件,1.5G左右是一个压缩包,下载的时候需要注意文件的名称。

二、语料库文章的提取

下载完成之后,解压缩得到的是一个xml文件,里面包含了许多的文章,也有许多的日志信息。所以,我们只需要提取xml文件里面的文章就可以了。我们通过WikiExtractor来提取xml文件中的文章,它是一个意大利人写的一个Python脚本专门用来提取维基百科语料库中的文章,将每个文件分割的大小为500M,它是一个通过cmd命令来设置一些参数提取文章,提取步骤如下:

a、WikiExtractor的安装

将整个WikiExtractor项目clone或者下载到本地,打开cmd窗口,切换到WikiExtractor项目中的setup.py文件的路径中,执行以下命令安装WikiExtractor

python setup.py install
 
 

b、维基百科语料库文章的提取

使用WikiExtractor来提取语料库中的文章,还需要使用到WikiExtractor.py脚本,与setup.py文件在同级目录下,通过以下命令来提取语料库中的文章

python WikiExtractor.py -b 500M -o zhwiki zhwiki-20180720-pages-articles.xml.bz2
 
 

参数介绍:

-b,设置提取文章后的每个文件大小

-o,制定输出文件的保存目录

zhwiki-20180720-pages-articles.xml,下载的维基百科语料库文件

更多参数的使用,可以通过以下命令查看:

python WikiExtractor.py -h
 
 

使用WikiExtractor提取文章,会在指定目录下产生一个AA的文件夹,里面会包含很多的文件。使用WikiExtractor提取的文章格式如下:

其中省略号表示的就是文章的内容,所以后面我们还需要通过正则化表达式来去除不相关的内容。

c、中文简体和繁体的转换

因为维基百科语料库中的文章内容里面的简体和繁体是混乱的,所以我们需要将所有的繁体字转换成为简体。这里我们利用OpenCC来进行转换。

OpenCC的使用教程请参考:https://blog.csdn.net/sinat_29957455/article/details/81290356

d、正则表达式提取文章内容并进行分词

使用WikiExtractor提取的文章,会包含许多的<doc></doc>,所以我们需要将这些不相关的内容通过正则表达式来去除。然后再通过jieba对文章进行分词,在分词的时候还需要将一些没有实际意义的词进行去除,所以在分词的之后加了一个停用词的去除。将分割之后的文章保存到文件中,每一行表示一篇文章,每个词之间使用空格进行分隔。


 
 
  1. import logging,jieba,os,re
  2. def get_stopwords():
  3. logging.basicConfig(format= '%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)
  4. #加载停用词表
  5. stopword_set = set()
  6. with open( "../stop_words/stopwords.txt", 'r',encoding= "utf-8") as stopwords:
  7. for stopword in stopwords:
  8. stopword_set.add(stopword.strip( "\n"))
  9. return stopword_set
  10. '''
  11. 使用正则表达式解析文本
  12. '''
  13. def parse_zhwiki(read_file_path,save_file_path):
  14. #过滤掉<doc>
  15. regex_str = "[^<doc.*>$]|[^</doc>$]"
  16. file = open(read_file_path, "r",encoding= "utf-8")
  17. #写文件
  18. output = open(save_file_path, "w+",encoding= "utf-8")
  19. content_line = file.readline()
  20. #获取停用词表
  21. stopwords = get_stopwords()
  22. #定义一个字符串变量,表示一篇文章的分词结果
  23. article_contents = ""
  24. while content_line:
  25. match_obj = re.match(regex_str,content_line)
  26. content_line = content_line.strip( "\n")
  27. if len(content_line) > 0:
  28. if match_obj:
  29. #使用jieba进行分词
  30. words = jieba.cut(content_line,cut_all= False)
  31. for word in words:
  32. if word not in stopwords:
  33. article_contents += word+ " "
  34. else:
  35. if len(article_contents) > 0:
  36. output.write(article_contents+ "\n")
  37. article_contents = ""
  38. content_line = file.readline()
  39. output.close()
  40. '''
  41. 将维基百科语料库进行分类
  42. '''
  43. def generate_corpus():
  44. zhwiki_path = "D:/dataset/NLP/zhwiki/AA"
  45. save_path = "D:/dataset/NLP/zhwiki/AA"
  46. for i in range( 3):
  47. file_path = os.path.join(zhwiki_path,str( "zh_wiki_0%s_jt"%str(i)))
  48. parse_zhwiki(file_path,os.path.join(save_path, "wiki_corpus0%s"%str(i)))

e、将分词后的文件合并为一个

将分词后的多个文件合并为一个文件,便于word2vec模型的训练


 
 
  1. '''
  2. 合并分词后的文件
  3. '''
  4. def merge_corpus():
  5. output = open( "D:/dataset/NLP/zhwiki/AA/wiki_corpus", "w",encoding= "utf-8")
  6. input = "D:/dataset/NLP/zhwiki/AA"
  7. for i in range( 3):
  8. file_path = os.path.join(input,str( "wiki_corpus0%s"%str(i)))
  9. file = open(file_path, "r",encoding= "utf-8")
  10. line = file.readline()
  11. while line:
  12. output.writelines(line)
  13. line = file.readline()
  14. file.close()
  15. output.close()

三、word2vec模型的训练

训练word2vec模型的时候,需要使用到gensim库,安装教程请参考官网,通过pip命令就可以进行安装。训练过程需要30分钟到1个小时,具体训练时间与电脑的配置相关。


 
 
  1. import logging
  2. from gensim.models import word2vec
  3. def main():
  4. logging.basicConfig(format= "%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)
  5. sentences = word2vec.LineSentence( "D:/dataset/NLP/zhwiki/AA/wiki_corpus")
  6. model = word2vec.Word2Vec(sentences,size= 250)
  7. #保存模型
  8. model.save( "model/wiki_corpus.model")

四、word2vec模型的使用

训练完成之后,我们可以利用训练好的模型来做一些词的预测,主要包括三个方面的应用。

1、找出与指定词相似的词

返回的结果是一个列表,列表中包含了制定个数的元组,每个元组的键是词,值这个词语指定词的相似度。


 
 
  1. import logging
  2. from gensim import models
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. from wordcloud import WordCloud
  6. '''
  7. 获取一个圆形的mask
  8. '''
  9. def get_mask():
  10. x,y = np.ogrid[: 300,: 300]
  11. mask = (x -150) ** 2 + (y -150)** 2 > 130 ** 2
  12. mask = 255 * mask.astype(int)
  13. return mask
  14. '''
  15. 绘制词云
  16. '''
  17. def draw_word_cloud(word_cloud):
  18. wc = WordCloud(background_color= "white",mask=get_mask())
  19. wc.generate_from_frequencies(word_cloud)
  20. #隐藏x轴和y轴
  21. plt.axis( "off")
  22. plt.imshow(wc,interpolation= "bilinear")
  23. plt.show()
  24. def test():
  25. logging.basicConfig(format= "%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)
  26. model = models.Word2Vec.load( "model/wiki_corpus.model")
  27. #输入一个词找出相似的前10个词
  28. one_corpus = [ "人工智能"]
  29. result = model.most_similar(one_corpus[ 0],topn= 100)
  30. #将返回的结果转换为字典,便于绘制词云
  31. word_cloud = dict()
  32. for sim in result:
  33. # print(sim[0],":",sim[1])
  34. word_cloud[sim[ 0]] = sim[ 1]
  35. #绘制词云
  36. draw_word_cloud(word_cloud)

2、计算两个词的相似度


 
 
  1. # #输入两个词计算相似度
  2. two_corpus = [ "腾讯", "阿里巴巴"]
  3. res = model.similarity(two_corpus[ 0],two_corpus[ 1])
  4. print( "similarity:%.4f"%res)

最后计算出来的相似度有,similarity:0.7241

3、根据前三个词来类比


 
 
  1. #输入三个词类比
  2. three_corpus = [ "北京", "上海", "广州"]
  3. res = model.most_similar([three_corpus[ 0],three_corpus[ 1],three_corpus[ 2]],topn= 100)
  4. #将返回的结果转换为字典,便于绘制词云
  5. word_cloud = dict()
  6. for sim in res:
  7. # print(sim[0],":",sim[1])
  8. word_cloud[sim[ 0]]=sim[ 1]
  9. #绘制词云
  10. draw_word_cloud(word_cloud)

五、资源下载地址

git项目下载地址:https://github.com/steelOneself/NLP_learn/tree/master/zhwiki_chinese

git项目中没有包含模型文件,因为模型文件比较大,我上传到百度云了,下载地址:

链接:https://pan.baidu.com/s/1o-7H-0h9fGCsdCyjmxJPUQ 密码:javh

下载后,将解压的模型文件放到项目中的model文件夹中。

小提示:对于百度云下载速度比较慢的同学,可以在浏览器中装一个Tampermonkey插件,然后获取百度云的下载链接,在通过IDM或者迅雷下载可以提高不少的速度。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值