前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用中文维基百科语料库训练一个word2vec模型并使用说明

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

作者头像
Python疯子
发布2019-05-07 14:28:11
2K0
发布2019-05-07 14:28:11
举报
文章被收录于专栏:Python疯子

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

image

相关资料下载:

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

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

一、语料库的下载

我下载是20190401文件,1.5G左右是一个压缩包,下载的时候需要注意文件的名称。

二、语料库文章的提取

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

a、WikiExtractor的安装

将整个WikiExtractor项目clone或者下载到本地,打开cmd窗口,

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

使用WikiExtractor来提取语料库中的文章,还需要使用到WikiExtractor.py脚本,通过以下命令来提取语料库中的文章

代码语言:javascript
复制
python WikiExtractor.py -b 500M -o zhwiki zhwiki-20190401-pages-articles-multistream.xml.bz2

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

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

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

OpenCC的使用教程请参考下篇:OpenCC中文简体和繁体互转

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

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

代码语言:javascript
复制
import logging,jieba,os,re

def get_stopwords():
    logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)
    #加载停用词表
    stopword_set = set()
    with open("../stop_words/stopwords.txt",'r',encoding="utf-8") as stopwords:
        for stopword in stopwords:
            stopword_set.add(stopword.strip("\n"))
    return stopword_set

'''
使用正则表达式解析文本
'''
def parse_zhwiki(read_file_path,save_file_path):
    #过滤掉<doc>
    regex_str = "[^<doc.*>$]|[^</doc>$]"
    file = open(read_file_path,"r",encoding="utf-8")
    #写文件
    output = open(save_file_path,"w+",encoding="utf-8")
    content_line = file.readline()
    #获取停用词表
    stopwords = get_stopwords()
     #定义一个字符串变量,表示一篇文章的分词结果
    article_contents = ""
    while content_line:
        match_obj = re.match(regex_str,content_line)
        content_line = content_line.strip("\n")
        if len(content_line) > 0:
            if match_obj:
                #使用jieba进行分词
                words = jieba.cut(content_line,cut_all=False)
                for word in words:
                    if word not in stopwords:
                        article_contents += word+" "
            else:
                if len(article_contents) > 0:
                    output.write(article_contents+"\n")
                    article_contents = ""
        content_line = file.readline()
    output.close()

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

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

代码语言:javascript
复制
'''
合并分词后的文件
'''
def merge_corpus():
    output = open("../dataset/zhwiki/BB/wiki_corpus","w",encoding="utf-8")
    input = "../dataset/zhwiki/BB"
    for i in range(3):
        file_path = os.path.join(input,str("wiki_corpus0%s"%str(i)))
        file = open(file_path,"r",encoding="utf-8")
        line = file.readline()
        while line:
            output.writelines(line)
            line = file.readline()
        file.close()
    output.close()

三、word2vec模型的训练

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

代码语言:javascript
复制
import logging
from gensim.models import word2vec

def main():
    logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)
    sentences = word2vec.LineSentence("../dataset/zhwiki/BB/wiki_corpus")
    # size:单词向量的维度。
    model = word2vec.Word2Vec(sentences,size=250)
    #保存模型
    model.save("../model/wiki_corpus.bin")
    # model.save("../model/wiki_corpus.model")
    # model.wv.save_word2vec_format("./sogou_word2vec/min_count-1/sogou.wor2vec.txt")

if __name__ == "__main__":
    main()

各种信息资料已上传百度云盘

链接:https://pan.baidu.com/s/1sxwpnGXj4SREcyBMP8HppQ 密码:9avd

image

四、word2vec模型的使用

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

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

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

代码语言:javascript
复制
logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)
    model = models.Word2Vec.load("../wiki_chinese/model/wiki_corpus.bin")
    #输入一个词找出相似的前10个词
    one_corpus = ["人工智能"]

    # ''' 词库中与one_corpus最相似的10个词'''
    result = model.most_similar(one_corpus[0],topn=10)
    print(result)

[('人工智慧', 0.8270298838615417),

('AI', 0.7743903994560242),

('专家系统', 0.6860651969909668),

('智能', 0.6649989485740662),

('虚拟现实', 0.6449255347251892),

('计算机', 0.6375125646591187),

('模式识别', 0.6328349113464355),

('人工神经网络', 0.6263511776924133),

('计算能力', 0.6243234276771545),

('认知科学', 0.6234999299049377)]

2、计算两个词的相似度

代码语言:javascript
复制
# 两个词的相似度
# #输入两个词计算相似度
two_corpus = ["腾讯","阿里巴巴"]
res = model.similarity(two_corpus[0],two_corpus[1])
print("similarity:%.4f"%res)

similarity:0.7268

3、新数据与已知数据类比,分类

例如:

已知数据(原数据) [{"intent":"天气", "words":"杭州天气怎么样"}, {"intent": "年龄", "words": "你今年几岁了"}]

新数据: 北京天气怎么样 和天气句子最相似,最后会分类问为:天气

001、用word2vec+平均词向量的方式生成句子向量

image.png

注意:单词向量的维度。与训练时保持一致(我用的是250维的)

句子对比使用

句子对比.png

相似度夹角:0.1741155833744904

分类:天气

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019.04.22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、语料库的下载
  • 二、语料库文章的提取
  • 四、word2vec模型的使用
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档