一种获取NLP语料的基本方法

Python与算法社区

共 4412字,需浏览 9分钟

 · 2021-03-12

上次送书我选择了这四位:左小孙、正、慎读、孙湛林,请看到后联系我,若三天内未与我取得联系名额自动让给其他留言者。在此非常感谢参与留言活动的其他小伙伴,分别是 天籁之音、王者灵魂、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中文网,欢迎电脑端登入收藏,以备后面使用。

浏览 90
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报