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

声明

本文作为个人学习笔记使用,考虑到有些网上教程即使收藏也存在一段时间后被删贴的可能,因此本人习惯把看到的学到的摘抄下来,以供需要的时候查阅。根据参考帖子在实践中具体使用的部分,本文摘要的部分与其他人的帖子重复程度也不同,参考引用均在最后标注,如有异议,请与本人联系。

下载原始数据

语料库数据下载地址:https://dumps.wikimedia.org/zhwiki/
也可以直接使用下面的连接下载最新的预料库:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
我下载的文件名:zhwiki-latest-pages-articles.xml.bz2,大概2.6G

在后续处理过程中会遇到缺少库的问题,建议直接使用以下命令安装,例如gensim库的安装:

pip install gensim -i https://pypi.tuna.tsinghua.edu.cn/simple

处理数据

将下载后的文件转为txt文件

使用extractor.py提取文件为txt

python extractor.py zhwiki-latest-pages-articles.xml.bz2 wiki_zh.txt

extractor.py文件代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 修改后的代码如下:
import logging
import os.path
import sys
from gensim.corpora import WikiCorpus

if __name__ == '__main__':

    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)
    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))
    # check and process input arguments
    if len(sys.argv) < 3:
        print(globals()['__doc__'] % locals())
        sys.exit(1)
    inp, outp = sys.argv[1:3]
    space = " "
    i = 0
    output = open(outp, 'w', encoding='utf-8')
    # wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
    wiki = WikiCorpus(inp, dictionary={})
    for text in wiki.get_texts():  # 通过get_texts将维基里的每篇文章转换位1行text文本,并且去掉了标点符号等内容
        output.write(space.join(text) + "\n")
        i = i + 1
        if (i % 10000 == 0):
            logger.info("Saved " + str(i) + " articles.")
    output.close()
    logger.info("Finished Saved " + str(i) + " articles.")
# python process.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text

由于文件比较大,一般的编辑器打不开,可以使用python脚本打开

import codecs

f = codecs.open('wiki_zh.txt', 'r', encoding="utf8")
line = f.readline()
print(line)

打开后会输出txt文件内容,此时文件时繁体,需要将文件转化为简体中文

将繁体中文转化为简体中文

下载github的项目:https://github.com/Day-yong/NLP/tree/master,找到其中的个04_word2vec,在这个项目里面

或者百度云连接下载:https://pan.baidu.com/s/1L209y1cFBcPgVpOSzqJJGw?pwd=ps5i,提取码:ps5i

找到其中的:opencc-1.0.1-win64,将wiki_zh.txt拷贝到该文件夹下,在opencc-1.0.1-win64文件夹下使用如下命令

opencc -i wiki_zh.txt -o wiki_zh_jian.txt -c t2s.json

命令执行一会,执行结束后会产生一个文件wiki_zh_jian.txt,这个文件就是简体的文本。

jieba 分词

使用写好的文本执行

python jieba_cut.py

wiki_zh_jian.txt需要和jieba_cut.py在同一目录下,jieba_cut.py如下:

import jieba
import jieba.analyse
import codecs


def cut_words(sentence):
    # print(sentence)
    return " ".join(jieba.cut(sentence)).encode('utf-8')


f = codecs.open('wiki_zh_jian.txt', 'r', encoding="utf8")  # 待分词文件
target = codecs.open("wiki_zh_jian_cut.txt", 'w', encoding="utf8")  # 分词后的文件
print('open files')
line_num = 1
line = f.readline()
while line:
    print('---- processing ', line_num, ' article----------------')
    line_seg = " ".join(jieba.cut(line))
    target.writelines(line_seg)
    line_num = line_num + 1
    line = f.readline()
f.close()
target.close()
exit()
while line:
    curr = []
    for oneline in line:
        # print(oneline)
        curr.append(oneline)
    after_cut = map(cut_words, curr)
    target.writelines(after_cut)
    print('saved', line_num, 'articles')
    exit()
    line = f.readline1()
f.close()
target.close()

执行结束后生成一个文件wiki_zh_jian_cut.txt

训练模型

将wiki_zh_jian_cut.txt与word2vec_model.py文件置于同一目录,在word2vec_model.py文件目录下执行命令:

python word2vec_model.py wiki_zh_jian_cut.txt wiki_zh.model wiki_zh.vector

训练结束后会产生三个模型文件wiki_zh.model、wiki_zh.model.wv.vectors.npy、wiki_zh.model.syn1neg.npy,
word2vec_model.py内容:

import logging
import os.path
import sys
import multiprocessing

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence

if __name__ == '__main__':

    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)
    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s')
    logging.root.setLevel(level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))
    # check and process input arguments
    if len(sys.argv) < 4:
        print(globals()['__doc__'] % locals())
        sys.exit(1)
    inp, outp1, outp2 = sys.argv[1:4]
    model = Word2Vec(LineSentence(inp), vector_size=400, window=5, min_count=5, workers=multiprocessing.cpu_count())
    model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

测试模型

测试模型直接运行以下代码即可:

python test_model.py

test_model.py文件内容:

from gensim.models import Word2Vec

en_wiki_word2vec_model = Word2Vec.load('wiki_zh.model')

testwords = ['苹果', '数学', '学术', '白痴', '篮球']
for i in range(5):
    res = en_wiki_word2vec_model.most_similar(testwords[i])
    print(testwords[i])
    print(res)
    # 输出指定词的词向量
    print(en_wiki_word2vec_model.wv[word])
    # DrawVector(en_wiki_word2vec_model.wv[word])

也可以使用已经训练好的模型:https://blog.csdn.net/Artoria_QZH/article/details/103299140
或者直接在我百度网盘下载:
https://pan.baidu.com/s/14C2xKuisuXpwddJtVlrgDg?pwd=d405,提取码:d405

还可以使用DrawVector()函数将词向量画成条形码的样式,函数如下,调用格式在上一段代码的最后一行。

import matplotlib.pyplot as plt
from matplotlib import cm
import numpy as np

def DrawVector(Y):
    X = np.array([ys for ys in range(1, len(Y) + 1)])
    Ymax = max(abs(Y))
    YY_Color = []
    for i in range(0, len(Y)):
        if Y[i] < 0:
            Co = cm.Greens(- float(Y[i] / Ymax))
        else:
            Co = cm.Blues(float(Y[i] / Ymax))
        # print(float(Y[i] / Ymax))
        YY_Color.append([Co[0], Co[1], Co[2], Co[3]])
    YY_Color = np.array(YY_Color)

    plt.figure(figsize=(0.25 * len(Y), 3.82))

    plt.bar(X, 2, 1, color=YY_Color)

    plt.xlabel("X-axis")  # 设置X轴Y轴名称
    plt.ylabel("Y-axis")
    # plt.title("bar chart")
    plt.ylim(0, 2)  # 设置Y轴上下限
    plt.xlim(-0.5, len(Y)+0.5)  # 设置Y轴上下限
    plt.show()
    return 0

效果如图所示:
词向量的可视化显示

参考

1、https://blog.csdn.net/Daycym/article/details/88993828
2、https://blog.csdn.net/Artoria_QZH/article/details/103299140
3、https://blog.csdn.net/vivian_ll/article/details/89914219

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值