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

上次送书我选择了这四位:左小孙、正、慎读、孙湛林,请看到后联系我,若三天内未与我取得联系名额自动让给其他留言者。在此非常感谢参与留言活动的其他小伙伴,分别是 天籁之音、王者灵魂、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 格式,具体格式如下:


xxxxx



xxxxx



xxxxx

每个生成的文件包含若干个词条。要生成 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中文网,欢迎电脑端登入收藏,以备后面使用。

你可能感兴趣的:(python,java,json,linux,大数据)