最近在做輸入法的詞庫,實現新的整句輸入模型,(回頭我會把之前的基於詞的整句輸入模型講講),新的整句輸入模型是基於 HMM (也就是隱馬爾可夫模型)來做的,當然了,由於我個人設備資金等有限,只做了二階矩陣。不過即使如此,模型還是需要訓練的。
當然,不是說用小說名著來訓練就不好,只不過很難找到各行各業的相關小說,畢竟,它們覆蓋的面積太單一了,這其實並不是高質量的語料庫。說起高質量,那自然是非維基百科莫屬,現在,我們就來獲取維基百科的所有中文資料,並把它們導出為語料庫,用以給模型訓練。
下載數據
不用寫爬蟲來爬了,維基百科是開放的,所以他們自己提供了打包下載的鏈接,真的是很貼心。下載地址是:HTTPS://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2 。
這是官方定期 dump 出來的 xml 格式數據,下載的話基本是 1GB 左右,中文的內容確實太少啊。如果你解壓縮,那麼是一個 6GB 多的 xml 文件,不過別去傻乎乎地解壓縮,維基百科自己給你提供了方便的工具來導出內容。
數據導出
這裡我們使用 蟒蛇 來執行導出,首先下載維基百科提供的工具 GENSIM
1 |
pip3 install gensim |
安裝成功後,大概這樣來寫蟒蛇腳本
⚠️這裡註意代碼僅適用於 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: 模式 圖書館 是 不 安裝, 詞形還原 韓元“ŧ 是 可用的. 對於這個警告,忽略即可,我們並不使用它。
在我 2015 年款的中配13寸rmbp上跑了大概十來分鐘就好了,很慢,要耐心等待一段時間,大概半個小時左右,導出的數據是 950中號 1.09G 文本,每篇文章一行。
文本整理
好吧,直接導出的文本太大已經難以用普通的文本編輯器打開了,但顯然,我們所謂的中文包含了簡體繁體……所以還是應該處理一下的,這裡我是將繁體轉換為簡體,當然反過來也行,我們使用 OpenCC 來完成這個工作。
安裝 OpenCC
當然了,我是 macOS 平台,直接使用命令一鍵安裝: 釀造 安裝 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 = 文本
試試改成這樣呢?
變成這樣的回報了
can only concatenate list (not “str”) to list
emmm不用擔心,我現在去下載一份回來幫你測試下代碼,然後我會更新這篇文章並通知你。
你好,我已經更正了代碼,他們api行為變更了,現在直接吧內容處理成文本了,這樣更方便,代價就是處理速度更慢了……
你現在應該能按照文中的代碼導出了。
成功了 真是感謝您
熱心又有耐心的指導及協助