专栏首页Python疯子使用中文维基百科语料库训练一个word2vec模型并使用说明

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

​本篇主要介绍如何通过中文维基百科语料库来训练一个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脚本,通过以下命令来提取语料库中的文章

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对文章进行分词,在分词的时候还需要将一些没有实际意义的词进行去除,所以在分词的之后加了一个停用词的去除。将分割之后的文章保存到文件中,每一行表示一篇文章,每个词之间使用空格进行分隔。

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模型的训练

'''
合并分词后的文件
'''
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个小时,具体训练时间与电脑的配置相关。

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、找出与指定词相似的词

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

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、计算两个词的相似度

# 两个词的相似度
# #输入两个词计算相似度
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

分类:天气

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 服务器压力测试工具:wrk 和 jmeter

    两个都很简单,只要=安装,启动起来了,就好操作。 难点是参数的配置,以及其他更多功能,能满足简单的要求,如果需要复杂功能,还需要自己手动定义。 wrk的安装...

    Python疯子
  • IOS 学习笔记 快速解决is running iOS 12.3 (16F156), which may not be supported by this version of Xcode.

    is running iOS 12.3 (16F156), which may not be supported by this version of Xcod...

    Python疯子
  • python最全画地图,可视化数据

    有时我们会很希望把数据展示在地图上,来做数据可视化,使数据更加清晰明了,可谓一图胜百文。先说说我用地图做什么了:微信好友全国分布,显示票房省份数据,全国评分显示...

    Python疯子
  • PL/SQL-->UTL_FILE包的使用介绍

        在PL/SQL中,UTL_FILE包提供了文本文件输入和输出互功能。也就是说我们可以通过该包实现从操作系统级别来实现文件读取输入或者是写入到操作系统文件...

    Leshami
  • Julia语言初体验

    最近MIT发布的julia 1.0.0版,据传整合了C、Python、R等诸多语言特色,是数据科学领域又一把顶级利器。

    数据小磨坊
  • 10.socket网络编程

    套接字工作流程 ? 先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端...

    zhang_derek
  • 全面总结机器学习项目和面试中几乎绕不开的决策树

    决策树是一种常见的机器学习算法,它的思想十分朴素,类似于我们平时利用选择做决策的过程。

    double
  • 剑指Offer的学习笔记(C#篇)-- 从上往下打印二叉树

    了解过二叉树就应该知道,二叉树存在三种遍历方法:前序遍历(根→左→右)、中序遍历(左→根→右)、后续遍历(左→右→根)。

    WeiMLing
  • 韩国黑客电影《幽灵》顶尖骇客竟然和你用的工具一样?

    小编自己都难以想象竟然能在一部韩剧里挖到这样一部既有长腿欧巴、软萌妹子的~\(≧▽≦)/~,还是讲网络犯罪和信息安全事件的佳作。

    HACK学习
  • 数据结构和算法——快速排序

    快速排序也是一种分治算法,类似于合并排序。它通过从列表中选择一个元素(轴)并在其左侧放置小于轴的元素,在其右侧放置大于轴的元素来工作。我们对左侧和右侧重复上述步...

    Lemon黄

扫码关注云+社区

领取腾讯云代金券