一种获取NLP语料的基本方法
共 4412字,需浏览 9分钟
·
2021-03-12 09:51
上次送书我选择了这四位:左小孙、正、慎读、孙湛林,请看到后联系我,若三天内未与我取得联系名额自动让给其他留言者。在此非常感谢参与留言活动的其他小伙伴,分别是 天籁之音、王者灵魂、Hellboycc、山猫、小炮先生、三根葱、Pluto、林卫明、影子、小杨同学、Analyze statistics then die、沈杰、平凡、若水、胡健、沐雨、云梦泽、遗贤对酒、你是不是、I am、追风少年、Hua Bro、哈弗在等我呢、天经地义、益达、新安乌篷船、戍轮台、龙James、懂自己的Boy熊、苏先生、贾任远、罢去、兰若
你们的留言让我很感动,但数量真的有限,不过下次送书很快就会到来。
学习自然语言处理,语料获取是第一步,那么如何抓取和提取语料呢,本文提供一种思路。
维基百科语料库
维基百科会定期把各种语言的百科网页全部打包存储起来,这里我们选择其中的中文维基百科网页,这个文件可以作为中文语料库来使用。原始维基百科数据是压缩的 xml 文件,为了提取其中词条的纯文本内容,去掉众多 xml 标记,我们必须要对原始的压缩文件进行处理,提取有用信息。
语料库处理
首先下载原始的中文维基百科网页文件,下载地址为 https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2,文件大小在 1.5G 以上,
如果想要下载其他的小文件,可以使用 https://dumps.wikimedia.org/zhwiki 去自行挑选同时带有stream、xml和bz2的文件
在 Windows 系统下,推荐使用 Free Download Manager 下载。
下载其他语言
观察上面https://dumps.wikimedia.org/zhwiki,若我们把 zhwiki 替换为 enwiki,就能找到英文语料,如果替换为 frwiki,就能找到法语语料,依次类推。
可以参考 ISO 639-1语言列表
,相应替换便能找到对应语料。
代号 | 语言 | 代号 | 语言 | 代号 | 语言 | 代号 | 语言 |
---|---|---|---|---|---|---|---|
aa | 阿法尔语 | fr | 法语 | li | 林堡语 | se | 北萨米语 |
ab | 阿布哈兹语 | fy | 弗里西亚语 | ln | 林加拉语 | sg | 桑戈语 |
ae | 阿维斯陀语 | ga | 爱尔兰语 | lo | 老挝语 | sh | 塞尔维亚-克罗地亚语 |
af | 南非语 | gd | 苏格兰盖尔语 | lt | 立陶宛语 | si | 僧伽罗语 |
ak | 阿坎语 | gl | 加利西亚语 | lu | 卢巴语 | sk | 斯洛伐克语 |
am | 阿姆哈拉语 | gn | 瓜拉尼语 | lv | 拉脱维亚语 | sl | 斯洛文尼亚语 |
an | 阿拉贡语 | gu | 古吉拉特语 | mg | 马达加斯加语 | sm | 萨摩亚语 |
ar | 阿拉伯语 | gv | 马恩岛语 | mh | 马绍尔语 | sn | 修纳语 |
as | 阿萨姆语 | ha | 豪萨语 | mi | 毛利语 | so | 索马里语 |
av | 阿瓦尔语 | he | 希伯来语 | mk | 马其顿语 | sq | 阿尔巴尼亚语 |
ay | 艾马拉语 | hi | 印地语 | ml | 马拉雅拉姆语 | sr | 塞尔维亚语 |
az | 阿塞拜疆语 | ho | 希里莫图语 | mn | 蒙古语 | ss | 斯威士语 |
ba | 巴什基尔语 | hr | 克罗地亚语 | mo | 摩尔达维亚语 | st | 塞索托语 |
be | 白俄罗斯语 | ht | 海地克里奥尔语 | mr | 马拉地语 | su | 巽他语 |
bg | 保加利亚语 | hu | 匈牙利语 | ms | 马来语 | sv | 瑞典语 |
bh | 比哈尔语 | hy | 亚美尼亚语 | mt | 马耳他语 | sw | 斯瓦希里语 |
bi | 比斯拉马语 | hz | 赫雷罗语 | my | 缅甸语 | ta | 泰米尔语 |
bm | 班巴拉语 | ia | 因特语 | na | 瑙鲁语 | te | 泰卢固语 |
bn | 孟加拉语 | id | 印尼语 | nb | 书面挪威语 | tg | 塔吉克斯坦语 |
bo | 藏语 | ie | 西方国际语 | nd | 北恩德贝莱语 | th | 泰语 |
br | 布列塔尼语 | ig | 伊博语 | ne | 尼泊尔语 | ti | 提格雷尼亚语 |
bs | 波斯尼亚语 | ii | 四川彝语(诺苏语) | ng | 恩敦加语 | tk | 土库曼语 |
ca | 加泰隆语 | ik | 伊努皮克语 | nl | 荷兰语 | tl | 他加禄语 |
ce | 车臣语 | io | 伊多语 | nn | 新挪威语 | tn | 茨瓦纳语 |
ch | 查莫罗语 | is | 冰岛语 | no | 挪威语 | to | 汤加语 |
co | 科西嘉语 | it | 意大利语 | nr | 南恩德贝莱语 | tr | 土耳其语 |
cr | 克里语 | iu | 因纽特语 | nv | 纳瓦霍语 | ts | 宗加语 |
cs | 捷克语 | ja | 日语 | ny | 尼扬贾语 | tt | 塔塔尔语 |
cu | 古教会斯拉夫语 | jv | 爪哇语 | oc | 奥克语 | tw | 特威语 |
cv | 楚瓦什语 | ka | 格鲁吉亚语 | oj | 奥杰布瓦语 | ty | 塔希提语 |
cy | 威尔士语 | kg | 刚果语 | om | 奥罗莫语 | ug | 维吾尔语 |
da | 丹麦语 | ki | 基库尤语 | or | 奥里亚语 | uk | 乌克兰语 |
de | 德语 | kj | 宽亚玛语 | os | 奥塞梯语 | ur | 乌尔都语 |
dv | 迪维西语 | kk | 哈萨克语 | pa | 旁遮普语 | uz | 乌兹别克语 |
dz | 不丹语 | kl | 格陵兰语 | pi | 巴利语 | ve | 文达语 |
ee | 埃维语 | km | 高棉语 | pl | 波兰语 | vi | 越南语 |
el | 现代希腊语 | kn | 卡纳达语 | ps | 普什图语 | vo | 沃拉普克语 |
en | 英语 | ko | 朝鲜语、韩语 | pt | 葡萄牙语 | wa | 瓦隆语 |
eo | 世界语 | kr | 卡努里语 | qu | 克丘亚语 | wo | 沃洛夫语 |
es | 西班牙语 | ks | 克什米尔语 | rm | 罗曼什语 | xh | 科萨语 |
et | 爱沙尼亚语 | ku | 库尔德语 | rn | 基隆迪语 | yi | 依地语 |
eu | 巴斯克语 | kv | 科米语 | ro | 罗马尼亚语 | yo | 约鲁巴语 |
fa | 波斯语 | kw | 康沃尔语 | ru | 俄语 | za | 壮语 |
ff | 富拉语 | ky | 吉尔吉斯斯坦语 | rw | 卢旺达语 | zh | 中文、汉语 |
fi | 芬兰语 | la | 拉丁语 | sa | 梵语 | zu | 祖鲁语 |
fj | 斐济语 | lb | 卢森堡语 | sc | 撒丁语 | ||
fo | 法罗语 | lg | 卢干达语 | sd | 信德语 |
使用wikiextractor 工具提取语料
为了读取其中的文本信息,我们需要借助提取工具,WikiExtractor 是一款不错的开源提取工具,使用该工具,可以方便地处理语料库,输出为想要的存储格式。首先使用以下命令安装该工具:
git clone https://github.com/attardi/wikiextractor
cd wikiextractor
python setup.py install
wikiextractor 会把整个语料库分割为指定大小的文件,文件的格式默认为 xml 格式,具体格式如下:
<doc id="xxx" url="xxx" title="xxxx">
xxxxx
</doc>
<doc id="xxx" url="xxx" title="xxxx">
xxxxx
</doc>
<doc id="xxx" url="xxx" title="xxxx">
xxxxx
</doc>
每个生成的文件包含若干个词条。要生成 xml 格式的语料,可以使用以下命令:
WikiExtractor -o extracted_xml --process 2 -b 512K zhwiki-latest-pages-articles.xml.bz2
-o 用来指定输出目录,--process 用来指定使用的进程数目(默认为 1),-b 选项用来控制单个生成文件的大小(默认为 1M,文件越大,包含的词条也越多),最后的参数为要处理的原始压缩语料文件名称。程序运行完成以后,在输出目录下面会生成多个子目录,每个目录下面有一些生成的文件。
如果要生成 json 格式的语料文件,只需要加上 --json 选项:
WikiExtractor -o extracted_xml --process 2 -b 512K --json zhwiki-latest-pages-articles.xml.bz2
每个生成的文件中,每行对应一个以 JSON 格式存储的词条,格式如下:
{"id": "xxx", "url": "xxx", "title": "xxx", "text": "xxxxxx"}
其中 text 对应的是某个词条的真正内容。
如何提取 JSON 格式字符串中的 text 内容?可以使用json.loads()
方法将符合 JSON 格式的字符串转换为 Python 中的字典。例如
In [6]: s = '{"apple": 1, "bananas": 2, "pear": 2.5}'
In [7]: json.loads(s)
Out[7]: {'apple': 1, 'bananas': 2, 'pear': 2.5}
下面给出一个简单读取一个文件所有词条 text 并且整合的代码:
texts = ""
# file is a generated file
with open(file, encoding='utf-8') as f:
# each line in the file is a wiki page
for line in f:
# read the line as valid json and select text field
text = json.loads(line)['text']
texts += text
根据自己的需要,可以把每一行的 text 存为新的文件,或者把原来文件里面的所有词条的 text 合在一起存为一个新文件。
Refernces
https://zh.wikipedia.org/wiki/ISO_639-1 https://jdhao.github.io/2019/01/10/two_chinese_corpus/ https://jdhao.github.io/2019/01/10/two_chinese_corpus/
这些内容我已经同步整理到 Python中文网,欢迎电脑端登入收藏,以备后面使用。