首先列明参考博文地址:
使用中文维基百科语料库训练一个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
提取会产生一个AA文件夹,可以打开查看里边是一些文章
包含714万词条,113万文章
2、繁体转简体
上图发现提取的文章是简体繁体混杂,使用opencc统一转换为简体中文
从文章开头的博文中下载windows下可用的opencc并解压
其中share文件夹下的json文件就是opencc的配置文件,用于简繁体转换
接着在bin目录下cmd
命令格式:
opencc -i 需要转换的文件路径 -o 转换后的文件路径 -c 配置文件路径
这里我将转换后文件保存到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
三个文件都需要转换
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')
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()
三、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")
训练好的模型包含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()
参考博文