一種獲取NLP語(yǔ)料的基本方法
上次送書(shū)我選擇了這四位:左小孫、正、慎讀、孫湛林,請(qǐng)看到后聯(lián)系我,若三天內(nèi)未與我取得聯(lián)系名額自動(dòng)讓給其他留言者。在此非常感謝參與留言活動(dòng)的其他小伙伴,分別是 天籟之音、王者靈魂、Hellboycc、山貓、小炮先生、三根蔥、Pluto、林衛(wèi)明、影子、小楊同學(xué)、Analyze statistics then die、沈杰、平凡、若水、胡健、沐雨、云夢(mèng)澤、遺賢對(duì)酒、你是不是、I am、追風(fēng)少年、Hua Bro、哈弗在等我呢、天經(jīng)地義、益達(dá)、新安烏篷船、戍輪臺(tái)、龍James、懂自己的Boy熊、蘇先生、賈任遠(yuǎn)、罷去、蘭若
你們的留言讓我很感動(dòng),但數(shù)量真的有限,不過(guò)下次送書(shū)很快就會(huì)到來(lái)。
學(xué)習(xí)自然語(yǔ)言處理,語(yǔ)料獲取是第一步,那么如何抓取和提取語(yǔ)料呢,本文提供一種思路。
維基百科語(yǔ)料庫(kù)
維基百科會(huì)定期把各種語(yǔ)言的百科網(wǎng)頁(yè)全部打包存儲(chǔ)起來(lái),這里我們選擇其中的中文維基百科網(wǎng)頁(yè),這個(gè)文件可以作為中文語(yǔ)料庫(kù)來(lái)使用。原始維基百科數(shù)據(jù)是壓縮的 xml 文件,為了提取其中詞條的純文本內(nèi)容,去掉眾多 xml 標(biāo)記,我們必須要對(duì)原始的壓縮文件進(jìn)行處理,提取有用信息。
語(yǔ)料庫(kù)處理
首先下載原始的中文維基百科網(wǎng)頁(yè)文件,下載地址為 https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2,文件大小在 1.5G 以上,
如果想要下載其他的小文件,可以使用 https://dumps.wikimedia.org/zhwiki 去自行挑選同時(shí)帶有stream、xml和bz2的文件
在 Windows 系統(tǒng)下,推薦使用 Free Download Manager 下載。
下載其他語(yǔ)言
觀察上面https://dumps.wikimedia.org/zhwiki,若我們把 zhwiki 替換為 enwiki,就能找到英文語(yǔ)料,如果替換為 frwiki,就能找到法語(yǔ)語(yǔ)料,依次類推。
可以參考 ISO 639-1語(yǔ)言列表,相應(yīng)替換便能找到對(duì)應(yīng)語(yǔ)料。
| 代號(hào) | 語(yǔ)言 | 代號(hào) | 語(yǔ)言 | 代號(hào) | 語(yǔ)言 | 代號(hào) | 語(yǔ)言 |
|---|---|---|---|---|---|---|---|
| aa | 阿法爾語(yǔ) | fr | 法語(yǔ) | li | 林堡語(yǔ) | se | 北薩米語(yǔ) |
| ab | 阿布哈茲語(yǔ) | fy | 弗里西亞語(yǔ) | ln | 林加拉語(yǔ) | sg | 桑戈語(yǔ) |
| ae | 阿維斯陀語(yǔ) | ga | 愛(ài)爾蘭語(yǔ) | lo | 老撾語(yǔ) | sh | 塞爾維亞-克羅地亞語(yǔ) |
| af | 南非語(yǔ) | gd | 蘇格蘭蓋爾語(yǔ) | lt | 立陶宛語(yǔ) | si | 僧伽羅語(yǔ) |
| ak | 阿坎語(yǔ) | gl | 加利西亞語(yǔ) | lu | 盧巴語(yǔ) | sk | 斯洛伐克語(yǔ) |
| am | 阿姆哈拉語(yǔ) | gn | 瓜拉尼語(yǔ) | lv | 拉脫維亞語(yǔ) | sl | 斯洛文尼亞語(yǔ) |
| an | 阿拉貢語(yǔ) | gu | 古吉拉特語(yǔ) | mg | 馬達(dá)加斯加語(yǔ) | sm | 薩摩亞語(yǔ) |
| ar | 阿拉伯語(yǔ) | gv | 馬恩島語(yǔ) | mh | 馬紹爾語(yǔ) | sn | 修納語(yǔ) |
| as | 阿薩姆語(yǔ) | ha | 豪薩語(yǔ) | mi | 毛利語(yǔ) | so | 索馬里語(yǔ) |
| av | 阿瓦爾語(yǔ) | he | 希伯來(lái)語(yǔ) | mk | 馬其頓語(yǔ) | sq | 阿爾巴尼亞語(yǔ) |
| ay | 艾馬拉語(yǔ) | hi | 印地語(yǔ) | ml | 馬拉雅拉姆語(yǔ) | sr | 塞爾維亞語(yǔ) |
| az | 阿塞拜疆語(yǔ) | ho | 希里莫圖語(yǔ) | mn | 蒙古語(yǔ) | ss | 斯威士語(yǔ) |
| ba | 巴什基爾語(yǔ) | hr | 克羅地亞語(yǔ) | mo | 摩爾達(dá)維亞語(yǔ) | st | 塞索托語(yǔ) |
| be | 白俄羅斯語(yǔ) | ht | 海地克里奧爾語(yǔ) | mr | 馬拉地語(yǔ) | su | 巽他語(yǔ) |
| bg | 保加利亞語(yǔ) | hu | 匈牙利語(yǔ) | ms | 馬來(lái)語(yǔ) | sv | 瑞典語(yǔ) |
| bh | 比哈爾語(yǔ) | hy | 亞美尼亞語(yǔ) | mt | 馬耳他語(yǔ) | sw | 斯瓦希里語(yǔ) |
| bi | 比斯拉馬語(yǔ) | hz | 赫雷羅語(yǔ) | my | 緬甸語(yǔ) | ta | 泰米爾語(yǔ) |
| bm | 班巴拉語(yǔ) | ia | 因特語(yǔ) | na | 瑙魯語(yǔ) | te | 泰盧固語(yǔ) |
| bn | 孟加拉語(yǔ) | id | 印尼語(yǔ) | nb | 書(shū)面挪威語(yǔ) | tg | 塔吉克斯坦語(yǔ) |
| bo | 藏語(yǔ) | ie | 西方國(guó)際語(yǔ) | nd | 北恩德貝萊語(yǔ) | th | 泰語(yǔ) |
| br | 布列塔尼語(yǔ) | ig | 伊博語(yǔ) | ne | 尼泊爾語(yǔ) | ti | 提格雷尼亞語(yǔ) |
| bs | 波斯尼亞語(yǔ) | ii | 四川彝語(yǔ)(諾蘇語(yǔ)) | ng | 恩敦加語(yǔ) | tk | 土庫(kù)曼語(yǔ) |
| ca | 加泰隆語(yǔ) | ik | 伊努皮克語(yǔ) | nl | 荷蘭語(yǔ) | tl | 他加祿語(yǔ) |
| ce | 車臣語(yǔ) | io | 伊多語(yǔ) | nn | 新挪威語(yǔ) | tn | 茨瓦納語(yǔ) |
| ch | 查莫羅語(yǔ) | is | 冰島語(yǔ) | no | 挪威語(yǔ) | to | 湯加語(yǔ) |
| co | 科西嘉語(yǔ) | it | 意大利語(yǔ) | nr | 南恩德貝萊語(yǔ) | tr | 土耳其語(yǔ) |
| cr | 克里語(yǔ) | iu | 因紐特語(yǔ) | nv | 納瓦霍語(yǔ) | ts | 宗加語(yǔ) |
| cs | 捷克語(yǔ) | ja | 日語(yǔ) | ny | 尼揚(yáng)賈語(yǔ) | tt | 塔塔爾語(yǔ) |
| cu | 古教會(huì)斯拉夫語(yǔ) | jv | 爪哇語(yǔ) | oc | 奧克語(yǔ) | tw | 特威語(yǔ) |
| cv | 楚瓦什語(yǔ) | ka | 格魯吉亞語(yǔ) | oj | 奧杰布瓦語(yǔ) | ty | 塔希提語(yǔ) |
| cy | 威爾士語(yǔ) | kg | 剛果語(yǔ) | om | 奧羅莫語(yǔ) | ug | 維吾爾語(yǔ) |
| da | 丹麥語(yǔ) | ki | 基庫(kù)尤語(yǔ) | or | 奧里亞語(yǔ) | uk | 烏克蘭語(yǔ) |
| de | 德語(yǔ) | kj | 寬亞瑪語(yǔ) | os | 奧塞梯語(yǔ) | ur | 烏爾都語(yǔ) |
| dv | 迪維西語(yǔ) | kk | 哈薩克語(yǔ) | pa | 旁遮普語(yǔ) | uz | 烏茲別克語(yǔ) |
| dz | 不丹語(yǔ) | kl | 格陵蘭語(yǔ) | pi | 巴利語(yǔ) | ve | 文達(dá)語(yǔ) |
| ee | 埃維語(yǔ) | km | 高棉語(yǔ) | pl | 波蘭語(yǔ) | vi | 越南語(yǔ) |
| el | 現(xiàn)代希臘語(yǔ) | kn | 卡納達(dá)語(yǔ) | ps | 普什圖語(yǔ) | vo | 沃拉普克語(yǔ) |
| en | 英語(yǔ) | ko | 朝鮮語(yǔ)、韓語(yǔ) | pt | 葡萄牙語(yǔ) | wa | 瓦隆語(yǔ) |
| eo | 世界語(yǔ) | kr | 卡努里語(yǔ) | qu | 克丘亞語(yǔ) | wo | 沃洛夫語(yǔ) |
| es | 西班牙語(yǔ) | ks | 克什米爾語(yǔ) | rm | 羅曼什語(yǔ) | xh | 科薩語(yǔ) |
| et | 愛(ài)沙尼亞語(yǔ) | ku | 庫(kù)爾德語(yǔ) | rn | 基隆迪語(yǔ) | yi | 依地語(yǔ) |
| eu | 巴斯克語(yǔ) | kv | 科米語(yǔ) | ro | 羅馬尼亞語(yǔ) | yo | 約魯巴語(yǔ) |
| fa | 波斯語(yǔ) | kw | 康沃爾語(yǔ) | ru | 俄語(yǔ) | za | 壯語(yǔ) |
| ff | 富拉語(yǔ) | ky | 吉爾吉斯斯坦語(yǔ) | rw | 盧旺達(dá)語(yǔ) | zh | 中文、漢語(yǔ) |
| fi | 芬蘭語(yǔ) | la | 拉丁語(yǔ) | sa | 梵語(yǔ) | zu | 祖魯語(yǔ) |
| fj | 斐濟(jì)語(yǔ) | lb | 盧森堡語(yǔ) | sc | 撒丁語(yǔ) | ||
| fo | 法羅語(yǔ) | lg | 盧干達(dá)語(yǔ) | sd | 信德語(yǔ) |
使用wikiextractor 工具提取語(yǔ)料
為了讀取其中的文本信息,我們需要借助提取工具,WikiExtractor 是一款不錯(cuò)的開(kāi)源提取工具,使用該工具,可以方便地處理語(yǔ)料庫(kù),輸出為想要的存儲(chǔ)格式。首先使用以下命令安裝該工具:
git clone https://github.com/attardi/wikiextractor
cd wikiextractor
python setup.py install
wikiextractor 會(huì)把整個(gè)語(yǔ)料庫(kù)分割為指定大小的文件,文件的格式默認(rèn)為 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>
每個(gè)生成的文件包含若干個(gè)詞條。要生成 xml 格式的語(yǔ)料,可以使用以下命令:
WikiExtractor -o extracted_xml --process 2 -b 512K zhwiki-latest-pages-articles.xml.bz2
-o 用來(lái)指定輸出目錄,--process 用來(lái)指定使用的進(jìn)程數(shù)目(默認(rèn)為 1),-b 選項(xiàng)用來(lái)控制單個(gè)生成文件的大?。J(rèn)為 1M,文件越大,包含的詞條也越多),最后的參數(shù)為要處理的原始?jí)嚎s語(yǔ)料文件名稱。程序運(yùn)行完成以后,在輸出目錄下面會(huì)生成多個(gè)子目錄,每個(gè)目錄下面有一些生成的文件。
如果要生成 json 格式的語(yǔ)料文件,只需要加上 --json 選項(xiàng):
WikiExtractor -o extracted_xml --process 2 -b 512K --json zhwiki-latest-pages-articles.xml.bz2
每個(gè)生成的文件中,每行對(duì)應(yīng)一個(gè)以 JSON 格式存儲(chǔ)的詞條,格式如下:
{"id": "xxx", "url": "xxx", "title": "xxx", "text": "xxxxxx"}
其中 text 對(duì)應(yīng)的是某個(gè)詞條的真正內(nèi)容。
如何提取 JSON 格式字符串中的 text 內(nèi)容?可以使用json.loads()方法將符合 JSON 格式的字符串轉(zhuǎn)換為 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}
下面給出一個(gè)簡(jiǎn)單讀取一個(gè)文件所有詞條 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
根據(jù)自己的需要,可以把每一行的 text 存為新的文件,或者把原來(lái)文件里面的所有詞條的 text 合在一起存為一個(gè)新文件。
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/
這些內(nèi)容我已經(jīng)同步整理到 Python中文網(wǎng),歡迎電腦端登入收藏,以備后面使用。
