最近在做输入法的词库,实现新的整句输入模型,(回头我会把之前的基于词的整句输入模型讲讲),新的整句输入模型是基于 HMM (也就是隐马尔可夫模型)来做的,当然了,由于我个人设备资金等有限,只做了二阶矩阵。不过即使如此,模型还是需要训练的。
当然,不是说用小说名著来训练就不好,只不过很难找到各行各业的相关小说,毕竟,它们覆盖的面积太单一了,这其实并不是高质量的语料库。说起高质量,那自然是非维基百科莫属,现在,我们就来获取维基百科的所有中文资料,并把它们导出为语料库,用以给模型训练。
下载数据
不用写爬虫来爬了,维基百科是开放的,所以他们自己提供了打包下载的链接,真的是很贴心。下载地址是:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 。
这是官方定期 dump 出来的 xml 格式数据,下载的话基本是 1GB 左右,中文的内容确实太少啊。如果你解压缩,那么是一个 6GB 多的 xml 文件,不过别去傻乎乎地解压缩,维基百科自己给你提供了方便的工具来导出内容。
数据导出
这里我们使用 python 来执行导出,首先下载维基百科提供的工具 gensim
1 |
pip3 install gensim |
安装成功后,大概这样来写python脚本
⚠️这里注意代码仅适用于 Python 3
1 2 3 4 5 6 7 |
import gensim input_file = "./article/zhwiki-latest-pages-articles.xml.bz2" f = open('./article/zhwiki.txt',encoding='utf8',mode='w') wiki = gensim.corpora.WikiCorpus(input_file, lemmatize=False, dictionary={}) for text in wiki.get_texts(): str_line = ' '.join(text) f.write(str_line+'\n') |
UserWarning: Pattern library is not installed, lemmatization won't be available. 对于这个警告,忽略即可,我们并不使用它。
在我 2015 年款的中配13寸rmbp上跑了大概十来分钟就好了,很慢,要耐心等待一段时间,大概半个小时左右,导出的数据是 950M 1.09G 文本,每篇文章一行。
文本整理
好吧,直接导出的文本太大已经难以用普通的文本编辑器打开了,但显然,我们所谓的中文包含了简体繁体……所以还是应该处理一下的,这里我是将繁体转换为简体,当然反过来也行,我们使用 OpenCC 来完成这个工作。
安装 OpenCC
当然了,我是 macOS 平台,直接使用命令一键安装: brew install opencc
安装好后,还需要给它写一个配置文件,就写在你的语料库同目录下即可:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
{ "name": "Traditional Chinese to Simplified Chinese", "segmentation": { "type": "mmseg", "dict": { "type": "ocd", "file": "TSPhrases.ocd" } }, "conversion_chain": [{ "dict": { "type": "group", "dicts": [{ "type": "ocd", "file": "TSPhrases.ocd" }, { "type": "ocd", "file": "TSCharacters.ocd" }] } }] } |
将其保存为 zht2zhs_config.json 备用。
转换
接下来在当前目录下执行命令
1 |
opencc -i zhwiki.txt -o zhswiki.txt -c zht2zhs_config.json |
这下就OK了。
结论
这样一来,我们就得到了一个内容为简体,没有标点符号和数字的中文维基百科语料库,把它扔到训练机器中读取吧~
延伸阅读
本文由 落格博客 原创撰写:落格博客 » 获取 中文 维基百科语料
转载请保留出处和原文链接:https://www.logcg.com/archives/2240.html
您好
我嘗試了您的程式
可是卻在第6行:
str_line = bytes.join(b’ ‘, text).decode()
發生了下列的錯誤
sequence item 0: expected a bytes-like object, str found
貌似是形態問題
上網找過相關的解答
但是稍做更改還是報出一樣的錯誤
請問該如何解決?
str_line = text
试试改成这样呢?
變成這樣的回報了
can only concatenate list (not “str”) to list
emmm不用担心,我现在去下载一份回来帮你测试下代码,然后我会更新这篇文章并通知你。
你好,我已经更正了代码,他们api行为变更了,现在直接吧内容处理成文本了,这样更方便,代价就是处理速度更慢了……
你现在应该能按照文中的代码导出了。
成功了 真是感謝您
熱心又有耐心的指導及協助