当前位置:   article > 正文

维基百科中文语料库训练word2vec模型和使用总结_wiki_word2vec_50.bin 怎么得到的

wiki_word2vec_50.bin 怎么得到的

首先列明参考博文地址:
使用中文维基百科语料库训练一个word2vec模型并使用说明
windows使用opencc中文简体和繁体互转
使用中文维基百科训练word2vec模型

一、下载维基百科中文语料库

下载地址:https://dumps.wikimedia.org/zhwiki/
这里我选择的是20200801,下载第一个即可
在这里插入图片描述

二、语料库处理

1、使用WikiExtractor提取语料库文章

WikiExtractor项目git地址
直接根据说明安装,这里我直接pip
在这里插入图片描述
WikiExtractor是一个意大利人写的一个Python脚本专门用来提取维基百科语料库中的文章,将每个文件分割的大小为500M,它是一个通过cmd命令来设置一些参数提取文章。

在这里插入图片描述
先找出这个脚本,这个脚本是独立的,放于与语料库同一目录
在这里插入图片描述
然后cmd执行以下命令

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

提取会产生一个AA文件夹,可以打开查看里边是一些文章
在这里插入图片描述
包含714万词条,113万文章
在这里插入图片描述

2、繁体转简体

上图发现提取的文章是简体繁体混杂,使用opencc统一转换为简体中文
从文章开头的博文中下载windows下可用的opencc并解压
其中share文件夹下的json文件就是opencc的配置文件,用于简繁体转换
在这里插入图片描述
接着在bin目录下cmd
在这里插入图片描述
命令格式:

opencc -i 需要转换的文件路径 -o 转换后的文件路径 -c 配置文件路径
  • 1

这里我将转换后文件保存到BB目录下,t2s.json就是繁体转简体的文件

F:\opencc-1.0.4-win32\opencc-1.0.4\bin>opencc -i F:\wikibaike\zhwiki\AA\wiki_00 -o F:\wikibaike\zhwiki\BB\zh_wiki_00 -c F:\opencc-1.0.4-win32\opencc-1.0.4\share\opencc\t2s.json
  • 1

三个文件都需要转换
在这里插入图片描述

3、提取文章并分词

将多余字符使用正则表达式去除并分词,3个文件都要执行一次

import logging,jieba,os,re
from gensim.models import word2vec

def get_stopwords():
    logging.basicConfig(format='%(asctime)s:%(levelname)s:%(message)s',level=logging.INFO)
    #加载停用词表
    stopword_set = set()
    with open("./data/stop_words.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()

if __name__ == '__main__':
    parse_zhwiki('F:\wikibaike\zhwiki\BB\zh_wiki_00', 'F:\wikibaike\zhwiki\CC\wiki_corpus00')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

4、合并上边三个文件

'''
合并分词后的文件
'''
def merge_corpus():
    output = open("F:\wikibaike\zhwiki\CC\wiki_corpus","w",encoding="utf-8")
    input = "F:\wikibaike\zhwiki\CC"
    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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

三、word2vec模型训练

我的训练过程需要40分钟,迭代了5次

# 训练模型
def main():
    logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)
    sentences = word2vec.LineSentence("F:\wikibaike\zhwiki\CC\wiki_corpus")
    # size:单词向量的维度。
    model = word2vec.Word2Vec(sentences,size=250)
    #保存模型
    model.save("F:\wikibaike\model\wiki_corpus.bin")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

在这里插入图片描述
在这里插入图片描述
训练好的模型包含3个文件
在这里插入图片描述

四、模型使用

import logging
from gensim import models

# 使用word2vec模型
# 打印日志
logging.basicConfig(format="%(asctime)s:%(levelname)s:%(message)s",level=logging.INFO)
# 加载模型
model = models.Word2Vec.load("./model/wiki_corpus.bin")

# 找出 与指定词相似的词
#输入一个词找出相似的前10个词
def top10():
    one_corpus = ["人工智能"]

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

# 计算两个词的相似度
def similar():

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

if __name__ == '__main__':
    similar()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

参考博文

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/508396
推荐阅读
  

闽ICP备14008679号