转自: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
  • 1

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

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

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

参数介绍:

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

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

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

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

python WikiExtractor.py -h
  • 1

使用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)))
  • 1

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()
  • 1

三、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")
  • 1

四、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)
  • 1

2、计算两个词的相似度

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

最后计算出来的相似度有,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)
  • 1

五、资源下载地址

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

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

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

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

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

                                </div>

使用中文维基百科语料库训练一个word2vec模型 12.1相关推荐

  1. 把一个dataset的表放在另一个dataset里面_使用中文维基百科语料库训练一个word2vec模型并使用说明...

    ​本篇主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/ WikiExtr ...

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

    本篇文章主要介绍如何通过中文维基百科语料库来训练一个word2vec模型. 相关资料下载: 中文维基百科下载地址:https://dumps.wikimedia.org/zhwiki/20180720 ...

  3. python训练自己中文语料库_word2vec+维基百科语料库训练中文模型

    训练中文词向量word2vec模型 1.准备数据 中文维基百科地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-arti ...

  4. 中文维基百科语料上的Word2Vec实验

    说明:此文主要参考52nlp-中英文维基百科语料上的Word2Vec实验,按照上面的步骤来做的,略有改动,因此不完全是转载的.这里,为了方便大家可以更快地运行gensim中的word2vec模型,我提 ...

  5. NLP实战 | 使用《人民的名义》的小说原文训练一个word2vec模型

    <人民的名义>的小说原文下载地址 https://github.com/jxq0816/algorithm-model/blob/master/word2vec-gensim/in_the ...

  6. 使用中文维基百科训练word2vec模型

    一.下载原始数据 数据下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 ,或者在这 ...

  7. 预训练词向量中文维基百科,英文斯坦福glove预训练的词向量下载

    中文预训练词向量--基于中文维基百科语料训练 英文预训练词向量--斯坦福glove预训练的词向量 百度云分享:https://pan.baidu.com/s/1UpZeuqlNMl6XtTB5la53 ...

  8. NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量

    NLP之word2vec:利用 Wikipedia Text(中文维基百科)语料+Word2vec工具来训练简体中文词向量 目录 输出结果 设计思路 1.Wikipedia Text语料来源 2.维基 ...

  9. 使用中文维基百科训练word2vec模型的最新方法!

    网上看了很多其他博客,发现有些部分都太老旧了,以至于现在套用都错误百出...这里总结了一下使用中文维基百科训练word2vec模型的最新方法. 参考链接: https://blog.csdn.net/ ...

最新文章

  1. manjaro 火焰截图添加快捷键_Linux中功能强大的截图工具 - Flameshot
  2. 数学之美 系列十 有限状态机和地址识别
  3. 蓝桥杯 - 牌型种数(dfs)
  4. 自定义的注解校验器的实现
  5. 《SAS编程与数据挖掘商业案例》学习笔记之十六
  6. android 实现SSL握手协商
  7. Chrome本地安装vue-devtools调试工具的问题
  8. 技术人如何转型产品?
  9. 元气开工!这里有一份礼包待领取
  10. 带农历日期的html代码,网页日历代码 包含日期时间 阴历
  11. ResNet网络结构搭建
  12. 百度把黑科技发布会开到央视,主持人连连感叹:文科生都看懂了
  13. runaction 旋转_使用cc.tween(缓动系统)代替runAction
  14. ppt to html c,PPTC参数.pdf
  15. 对数组做交换(swap)会发生什么?
  16. GEM5中运行parsec 2.1
  17. C语言与数据库操作入门
  18. JQuery data方法的使用-遁地龙卷风
  19. Web.xml分模块
  20. everything搜到不到文件的设置问题

热门文章

  1. Android获取系统启动器、电话、短信和相机包名
  2. 测试分类方法(含常见面试题)
  3. 论文笔记《Combining Events and Frames Using Recurrent Asynchronous Multimodal Networks for Monocular ...》
  4. PDF分割成两页怎么弄?来看看这3个工具
  5. LeetCode算法题-镜面反射(Mirror Reflection)
  6. java实现ln10_Java数学函数
  7. matlab基础----复数表示
  8. 生产实践中的经典算法(四)-BitMap
  9. 【Oracle】ORA-06553: PLS-306: wrong number or types of arguments in call to ‘存储过程‘
  10. 如何在计算机上增加一个磁盘分区,win10系统额外新增加一个硬盘分区的详细办法...