基于WIKI中文语料·Word2Vec模型训练·Python

在做文本情感分类的项目,研究到Word2Vec模型了。

自己来实践一下,网上大多数代码经过时间的流逝,多多少少都出了点小问题,为了方便自己之后的学术垃圾的制造,把自己跑出来的,修改过的代码和方法记录一下。

1.环境

1.1环境配置

Python3.9,Pycharm2021

1.2需要的库(搭建的虚拟环境,直接通过File->Settings引入)

import logging
from gensim.corpora import WikiCorpus
import jieba
import logging
from gensim.models import word2vec
import warnings
import os.path
import sys
import multiprocessing
from gensim.models.word2vec import LineSentence

1.3Opencc简繁置换插件

根据以下这篇博文的内容进行安装和操作即可。

windows使用opencc中文简体和繁体互转_修炼之路-CSDN博客_opencc

2.数据下载

wiki官网下载中文语料,下载完成后会得到命名为zhwiki-latest-pages-articles.xml.bz2的文件,里面是一个XML文件。(有点大,2G+)(本代码实现不用解压!)
下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

3.代码实现

3.1将xml格式文件转换成txt格式



import logging
from gensim.corpora import WikiCorpus


def main():
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    logging.info("------------ the program is running -------------")
    path_to_wiki_dump = "zhwiki-latest-pages-articles.xml.bz2"
    wiki_corpus = WikiCorpus(path_to_wiki_dump, dictionary={})
    num = 0
    with open('wiki.zh.txt', 'w', encoding='utf-8') as output:
        for text in wiki_corpus.get_texts():  # get_texts() 将 wiki的一篇文章转为textd的一行
            output.write(' '.join(text) + '\n')
            num += 1
            if num % 10000 == 0:
                logging.info("已处理 %d 文章" % num)


if __name__ == '__main__':
    main()

得到文件:wiki.zh.txt 

3.2此文件是一个繁体字形式,需要用Opencc转换成简体字。安装好Opencc之后在cmd按照以下格式输入:

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

得到文件:wiki.zh.simp.txt 

3.3将简体字文件进行分词,得到文件:wiki_seg.txt

import jieba
import logging


def main():
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    stopword_set = set()
    output = open('wiki_seg.txt', 'w', encoding='utf-8')
    with open('wiki.zh.simp.txt', 'r', encoding='utf-8') as content:
        for texts_num, line in enumerate(content):  # enumerate 给 line前加序号
            line = line.strip('\n')
            words = jieba.cut(line, cut_all=False)
            for word in words:
                if word not in stopword_set:
                    output.write(word + ' ')
            output.write('\n')
            if (texts_num + 1) % 10000 == 0:
                logging.info("已完成前 %d 行的断词" % (texts_num + 1))
    output.close()


if __name__ == '__main__':
    main()

3.4模型训练

获得模型:chinese_wiki_word2vec.model

from gensim.models import word2vec
import logging


def main():
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences = word2vec.LineSentence("wiki_seg.txt")
    model = word2vec.Word2Vec(sentences, size=250, min_count=5)  # size 用来设置神经网络的层数
    model.save("chinese_wiki_word2vec.model")


if __name__ == "__main__":
    main()

获得向量文件:wiki.zh.text.vector

import warnings
warnings.filterwarnings(action='ignore', category=UserWarning, module='gensim')# 忽略警告

import logging
import os.path
import sys
import multiprocessing

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


if __name__ == '__main__':

    #print open('/Users/sy/Desktop/pyRoot/wiki_zh_vec/cmd.txt').readlines()
    #sys.exit()
    
    program = os.path.basename(sys.argv[0])
    logger = logging.getLogger(program)

    logging.basicConfig(format='%(asctime)s: %(levelname)s: %(message)s',level=logging.INFO)
    logger.info("running %s" % ' '.join(sys.argv))

    # inp为输入语料, outp1 为输出模型, outp2为原始c版本word2vec的vector格式的模型
    #fdir = '/Users/sy/Desktop/pyRoot/wiki_zh_vec/'
    inp = 'wiki.zh.simp.txt'
    #outp1 = fdir + 'wiki.zh.text.model'
    outp2 = 'wiki.zh.text.vector'

    # 训练skip-gram模型
    model = Word2Vec(LineSentence(inp), size=400, window=5, min_count=5,
                     workers=multiprocessing.cpu_count())

    # 保存模型
    #model.save(outp1)
    model.wv.save_word2vec_format(outp2, binary=False)

---------------------------------------------------------------------------------------------------------------------------------

以上代码和过程参考了



基于wiki的中文语料进行word2vec模型训练_Mrhan的博客-CSDN博客

利用Python实现wiki中文语料的word2vec模型构建 - 简书

 

等博文的内容,对其中部分进行修改。感谢各位前辈!

你可能感兴趣的:(python,word2vec,自然语言处理)