# 基于 word2vec 使用 wiki 中文语料库实现词向量训练模型
之前做过一些自然语言处理的工作,主要是根据一些企业在互联网上的相关新闻进行分析,对其倾向性进行判断,最终目的是辅助国内某单位更好地对其管辖的企业进行监管工作。现在总结整理一下。这篇文章主要对**词向量训练阶段**进行阐述。
---
## 数据获取
使用的语料库是 wiki 百科的中文语料库,下载地址:[https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2](https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2)。另外,提供百度网盘下载链接:[https://pan.baidu.com/s/1eLkybiYOE_aVxsN0pALATg](https://pan.baidu.com/s/1eLkybiYOE_aVxsN0pALATg),提取码为:hmtn。
下载之后如下图(PyCharm 截图),大小为 1.16GB。
![](https://www.writebug.com/myres/static/uploads/2021/12/31/c6a623c5fefdd28f7c095943f17ae1ff.writebug)
---
## 将 XML 格式数据转为 txt
因为原始文件是 XML 格式,并且是压缩文件,所以做了一步数据解压并进行格式转换的工作。
具体使用了 gensim 库中的维基百科处理类 WikiCorpus,该类中的 get_texts 方法原文件中的文章转化为一个数组,其中每一个元素对应着原文件中的一篇文章。然后通过 for 循环便可以将其中的每一篇文章读出,然后进行保存。
![](https://www.writebug.com/myres/static/uploads/2021/12/31/6f24f1ac1780ba4f4ddfc6a8630e2110.writebug)
```
# coding; utf-8
"""
这个代码是将从网络上下载的xml格式的wiki百科训练语料转为txt格式
wiki百科训练语料
链接:https://pan.baidu.com/s/1eLkybiYOE_aVxsN0pALATg
密码:hmtn
"""
from gensim.corpora import WikiCorpus
if __name__ == '__main__':
print('主程序开始...')
input_file_name = 'zhwiki-latest-pages-articles.xml.bz2'
output_file_name = 'wiki.cn.txt'
print('开始读入wiki数据...')
input_file = WikiCorpus(input_file_name, lemmatize=False, dictionary={})
print('wiki数据读入完成!')
output_file = open(output_file_name, 'w', encoding="utf-8")
print('处理程序开始...')
count = 0
for text in input_file.get_texts():
output_file.write(' '.join(text) + '\n')
count = count + 1
if count % 10000 == 0:
print('目前已处理%d条数据' % count)
print('处理程序结束!')
output_file.close()
print('主程序结束!')
```
结果文件截图:
![](https://www.writebug.com/myres/static/uploads/2021/12/31/3cf0924666141c4b545e8cea076a43aa.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/31/3ce2ff402ff1f2e04220084e990ed17d.writebug)
---
## 繁体转为简体
为了方便后期处理,接下来对上面的结果进行简体化处理,将所有的繁体全部转化为简体。在这里,使用了另外一个库 zhconv。对上面结果的每一行调用 convert 函数即可。
![](https://www.writebug.com/myres/static/uploads/2021/12/31/ba3f4107fde5950eaca1d1a9b0497679.writebug)
```
# coding:utf-8
import zhconv
print('主程序执行开始...')
input_file_name = 'wiki.cn.txt'
output_file_name = 'wiki.cn.simple.txt'
input_file = open(input_file_name, 'r', encoding='utf-8')
output_file = open(output_file_name, 'w', encoding='utf-8')
print('开始读入繁体文件...')
lines = input_file.readlines()
print('读入繁体文件结束!')
print('转换程序执行开始...')
count = 1
for line in lines:
output_file.write(zhconv.convert(line, 'zh-hans'))
count += 1
if count % 10000 == 0:
print('目前已转换%d条数据' % count)
print('转换程序执行结束!')
print('主程序执行结束!')
```
结果截图:
![](https://www.writebug.com/myres/static/uploads/2021/12/31/089de963d78651a3840f41f5601c6764.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/31/64795521a2b3484f97ef0162ed116a00.writebug)
---
## 分词
对于中文来说,分词是必须要经过的一步处理,下面就需要进行分词操作。在这里使用了大名鼎鼎的 jieba 库。调用其中的 cut 方法即可。
![](https://www.writebug.com/myres/static/uploads/2021/12/31/a24caa49f8f9560067c56f72b6145961.writebug)
```
# coding:utf-8
import jieba
print('主程序执行开始...')
input_file_name = 'wiki.cn.simple.txt'
output_file_name = 'wiki.cn.simple.separate.txt'
input_file = open(input_file_name, 'r', encoding='utf-8')
output_file = open(output_file_name, 'w', encoding='utf-8')
print('开始读入数据文件...')
lines = input_file.readlines()
print('读入数据文件结束!')
print('分词程序执行开始...')
count = 1
for line in lines:
# jieba分词的结果是一个list,需要拼接,但是jieba把空格回车都当成一个字符处理
output_file.write(' '.join(jieba.cut(line.split('\n')[0].replace(' ', ''))) + '\n')
count += 1
if count % 10000 == 0:
print('目前已分词%d条数据' % count)
print('分词程序执行结束!')
print('主程序执行结束!')
```
结果截图:
![](https://www.writebug.com/myres/static/uploads/2021/12/31/f1392f7455ba53a5496da3dfbd54112a.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/31/f431f345c6ec043d8f755b642cd5c05c.writebug)
---
## 去除非中文词
可以看到,经过上面的处理之后,现在的结果已经差不多了,但是还存在着一些非中文词,所以下一步便将这些词去除。具体做法是通过正则表达式判断每一个词是不是符合汉字开头、汉字结尾、中间全是汉字,即“**^[\u4e00-\u9fa5]+$**”。
![](https://www.writebug.com/myres/static/uploads/2021/12/31/2e2bf13621429348f9c558c4cbf13542.writebug)
```
# coding:utf-8
import re
print('主程序执行开始...')
input_file_name = 'wiki.cn.simple.separate.txt'
output_file_name = 'wiki.txt'
input_file = open(input_file_name, 'r', encoding='utf-8')
output_file = open(output_file_name, 'w', encoding='utf-8')
print('开始读入数据文件...')
lines = input_file.readlines()
print('读入数据文件结束!')
print('分词程序执行开始...')
count = 1
cn_reg = '^[\u4e00-\u9fa5]+$'
for line in lines:
line_list = line.split('\n')[0].split(' ')
line_list_new = []
for word in line_list:
if re.search(cn_reg, word):
line_list_new.append(word)
print(line_list_new)
output_file.write(' '.join(line_list_new) + '\n')
count += 1
if count % 10000 == 0:
print('目前已分词%d条数据' % count)
print('分词程序执行结束!')
print('主程序执行结束!')
```
结果截图:
![](https://www.writebug.com/myres/static/uploads/2021/12/31/13f2e406b8a93b2e3cd22e345243fc0e.writebug)
![](https://www.writebug.com/myres/static/uploads/2021/12/31/5412bf66361e96fe55ef259cfea5c937.writebug)
---
## 词向量训练
上面的工作主要是对 wiki 语料库进行数据预处理,接下来才真正的词向量训练。
![](https://www.writebug.com/myres/static/uploads/2021/12/31/e56a9c305da10b9e508422367d8b1bef.writebug)
```
# coding:utf-8
import multiprocessing
from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
if __name__ == "__main__":
print('主程序开始执行...')
input_file_name = 'wiki.txt'
model_file_name = 'wiki.model'
print('转换过程开始...')
model = Word2Vec(LineSentence(input_file_name),
size=400, # 词向量长度为400
window=5,
min_count=5,
workers=multiprocessing.cpu_count())
print('转换过程结束!')
print('开始保存模型...')
model.save(model_file_name)
print('模型保存结束!')
print('主程序执行结束!')
```
也是使用了 gensim 库,通过其中的 Word2Vec 类进行了模型训练,并将最终的词向量保存起来。
![](https:
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
基于 word2vec 使用 wiki 中文语料库实现词向量训练模型.zip (12个子文件)
word2vec
orientation.py 6KB
xml2txt.py 977B
word2vec.py 727B
separate.py 808B
positive.txt 569B
LICENSE 1KB
negative.txt 1KB
remove.py 880B
tradition2simple.py 649B
README.md 9KB
stopwords.txt 5KB
fasttext.py 709B
共 12 条
- 1
资源评论
计算机毕设论文
- 粉丝: 1w+
- 资源: 399
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功