在做文本情感分类的项目,研究到Word2Vec模型了。
自己来实践一下,网上大多数代码经过时间的流逝,多多少少都出了点小问题,为了方便自己之后的学术垃圾的制造,把自己跑出来的,修改过的代码和方法记录一下。
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
wiki官网下载中文语料,下载完成后会得到命名为zhwiki-latest-pages-articles.xml.bz2的文件,里面是一个XML文件。(有点大,2G+)(本代码实现不用解压!)
下载地址:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2
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模型构建 - 简书
等博文的内容,对其中部分进行修改。感谢各位前辈!