基于Gensim的维基百科语料库中文词向量训练
原文地址:https://blog.csdn.net/weixin_40400177/article/details/79366065
转载说明:按照文章思路,调用实际代码,能够还原出结果。部分材料和工具版本可能会比文中的要新一些,这些并不影响实际的测试和运行。
原文如下
环境:
Win10 +Anaconda(自带Python3.6)
IDE:
Pycharm (其Interperter使用的是Anaconda自带的Python3.6)
安装Gensim库:
在Anaconda Prompt中输入:
pip install gensim
等待其显示安装完毕即可
1.首先获取维基百科语料库资源
https://dumps.wikimedia.org/zhwiki/20171220/
我是在其中下载的当时最新的压缩文件
注:文件名在网站中的结尾为xml.bz2
2.将wiki的xml文件处理成正常的txt文件
需要用特殊的脚本处理而不能直接压缩(与维基百科保存格式有关)
github中有更为全面的WikiExtractor
有兴趣可以去研究一下
此处直接使用普通压缩文件to txt处理脚本即可
代码如下:
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 = b' '
i = 0
output = open(outp, 'w',encoding='utf-8')
wiki = WikiCorpus(inp, lemmatize=False, dictionary={})
for text in wiki.get_texts():
s = space.join(text)
s = s.decode('utf8') + "\n"
output.write(s)
i = i + 1
if (i % 10000 == 0):
logger.info("Saved " + str(i) + " articles")
output.close()
logger.info("Finished Saved " + str(i) + " articles")
使用process.py脚本(即以上代码) 将维基百科的下载文件转化成text文件
在命令行中输入
python process.py zhwiki-latest-pages-articles.xml.bz2 wiki.zh.text
就可以看到正在解压的过程了,过程还是需要不少时间的
部分生成结果:
需要注意
文件可能过大而无法打开
3.使用opencc将繁体txt转换为简体txt
下载地址:
https://bintray.com/package/files/byvoid/opencc/OpenCC
无需安装,解压即可使用
将我们前面生成的wiki.zh.text拖动至opencc-1.0.1-win64文件夹中,打开cmd并在当前文件夹中输入如下指令:
opencc -i wiki.zh.text -o wiki.zh.jian.text -c t2s.json
这一步骤非常快,我只用了1分钟不到
然后可以看到目录中生成了wiki.zh.jian.text文件
打开后可以查看其中内容
可以看到已经成功全部转化为了简体字
但是做词向量训练之前仍缺少最后一步,就是分词
4.分词
英文中空格就已经将其句子分词完毕
而中文就相对复杂,但我们可以借助jieba库来分词
在Testjieba.py中分词
打开wiki.zh.jian.text,从该文件中一行行读取简体字并进行分词,分词结果放在zh.jian.wiki.seg.txt中
代码如下:
import jieba
import jieba.analyse
import jieba.posseg as pseg
import codecs, sys
def cut_words(sentence):
#print sentence
return " ".join(jieba.cut(sentence)).encode('utf-8')
f = codecs.open('wiki.zh.jian.text', 'r', encoding="utf8")
target = codecs.open("zh.jian.wiki.seg.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()
每一行读入后进行每一行的分词
直接运行该py文件即可(注意将 在opencc文件夹中生成的wiki.zh.jian.text放入Testjieba.py所在文件夹)
查看分词结果如下:
5.进行词向量训练
创建词向量结果模型代码如下:
from __future__ import print_function
import logging
import os
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("Useing: python train_word2vec_model.py input_text "
"output_gensim_model output_word_vector")
sys.exit(1)
inp, outp1, outp2 = sys.argv[1:4]
model = Word2Vec(LineSentence(inp), size=200, window=5, min_count=5,
workers=multiprocessing.cpu_count())
model.save(outp1)
model.wv.save_word2vec_format(outp2, binary=False)
其中
model = Word2Vec(LineSentence(inp), size=200, window=5, min_count=5,
workers=multiprocessing.cpu_count())
代码是训练词向量的关键,定义了滑动窗口大小与最小有效词数量
并在下方保存word2vec格式的模型
在命令行中输入
python word2vec_model.py zh.jian.wiki.seg.txt wiki.zh.model wiki.zh.text.vector
源文件为zh.jian.wiki.seg.txt
目标文件为wiki.zh.model
训练时间大致为25分钟(1080Ti训练结果下)
6.测试训练模块成果
代码如下
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)
首先导入gensim.models中的Word2Vec模块
然后使用Word2Vec模块中方法加载模块,之后便可以使用其中的most_similar方法进行词向量寻找并打印结果
测试结果展示:
总结:
可以看到还是大部分make sense的
但是也有一些词不太相近或者更相近的答案而并非首选。
很大一部分原因是因为语料库的不足,因为语料库中资料仅有1.3G,对于中文训练来说是大大不足的。
---------------------
作者:DrogoKhal4373
来源:CSDN
原文:https://blog.csdn.net/weixin_40400177/article/details/79366065
版权声明:本文为博主原创文章,转载请附上博文链接!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南