Windows作業系統環境下安裝Ruby_Wikipedia語料庫截取純文本wp2txt_WikiExtractor_gensim解析讀取wiki資料
(定位就跟微軟開發者在用的nuget差不多、或python的pip install....)
叫做gem
叫做gem
相關Ruby開源套件貢獻者會在此網站平台做釋出
在一些自然語言語料庫收集任務最為知名的就是維基百科
https://dumps.wikimedia.org/
當然要注意的是wikimedia有對下載者進行了速率限制,並將每個 IP 位址的連線數上限設為 3 個。目的是確保每個人都能以合理的下載速度存取檔案。
在這邊要從官方網站的Database backup dumps進去
也就是所有跨語言的公開WIKI媒體資料完整副本,以嵌入 XML 的維基文本來源檔案和元資料形式提供。
官方有釋出dumps出來的文本壓縮檔無法直接解析需要特殊前處理
比方說
日本語言的最新dumps資料網址
英文語言的最新dumps資料網址
https://dumps.wikimedia.org/enwiki/20260201/
中文語言的最新dumps資料網址
https://dumps.wikimedia.org/zhwiki/20260201/
舉例這邊針對英文和中文各自bz2做下載
enwiki-latest-pages-articles.xml.bz2
zhwiki-latest-pages-articles.xml.bz2
Solution1. wp2txt
剛好涉及到裝wp2txt
用來幫我們將 Wikipedia 這個網路上海量數據集給下載下來並轉換為文字的工具包
工欲善其事,必先利其器。
Ruby預設下載官方網站會自動推薦你反粗體的下載點
這邊用3.4.8-1(x64)他推薦的版本做下載
通常會評估套件相依來做下載導入,避免直接裝較不穩定且上下相容不太好的最新版。
產生Ruby34-X64目錄
執行以下指令
使用wp2txt 來將bz2檔案給轉換純文字檔,過程中會產生大量輸出檔案。
--input(或-i)就是指定傳入的bz2檔案
--output(或-o)就是指定轉出的檔案位置
要注意由於底層有引用到bunzip2.exe所以預設若電腦環境缺少就會失敗
https://github.com/yohasebe/wp2txt
Bzip2 for Windows
這邊實測
中文語意的解析花20分鐘,解壓出來總共是13.7GB。
英文的則要2小時多,解壓出來總共是107GB。
上面之前介紹直接對enwiki-latest-pages-articles.xml.bz2 做wp2txt指令解析有點不太正確。
應該要先對bz2檔案解壓轉換為單一一個超巨大的xml單一大檔案
cd /d E:\corpus
bzip2 -d zhwiki-latest-pages-articles.xml.bz2
bzip2 -d enwiki-latest-pages-articles.xml.bz2
轉變為zhwiki-latest-pages-articles.xml 約略13GB大
Solution2. WikiExtractor
其他備案就是透過以下github clone下來後作業
要注意Python版本至少3.6以上
wikiextractor 3.0.6 也可以透過pip install來安裝
pip install wikiextractor
這邊用git clone到本地方式
cd /d E:\NLP\Projects\wikiextractor
python setup.py install
python -m wikiextractor.WikiExtractor -b 1024M -o E:\corpus\zhwiki_extracted E:\corpus\zhwiki-latest-pages-articles.xml.bz2
WikiExtractor 有 --processes(或 -p)可調整進程數。設為 1 通常就不會走到 fork 邏輯
python -m wikiextractor.WikiExtractor --processes 1 -b 1024M -o E:\corpus\zhwiki_extracted E:\corpus\zhwiki-latest-pages-articles.xml.bz2
當改成上面作法後也會失敗
評估可能WikiExtractor 比較適用於Linux環境就不再實驗下去了
Solution3.gensim解析讀取wiki資料(推薦此方法)
下載套件
pip install gensim
並透過gensim來讀取.bz2 中文維基的資料
這邊要注意現在用WikiCorpus讀取會很久,原因在於起初背後會先掃描整個完整大語料資料建dictionary,會造成耗時久的問題。
程式碼範例ver1
from gensim.corpora import WikiCorpus # 將主要邏輯包裝在 if __name__ == '__main__': 裡面 if __name__ == '__main__': # 定義輸入路徑 inputfile = r"E:\corpus\zhwiki_data\zhwiki-latest-pages-articles.xml.bz2" # 這裡底層會呼叫多進程,所以必須要在 __main__ 保護傘下 #wiki = WikiCorpus(inputfile) # 加上 dictionary={},阻止它預先掃描整個檔案建字典! wiki = WikiCorpus(inputfile, dictionary={}) print("開始擷取前 100 筆資料:") print("-" * 30) for i, text in enumerate(wiki.get_texts()): if i >= 100: break #print(text) print(f"【第 {i + 1} 筆文章】") print(" ".join(text[:50]) + "...\n") # 為了避免畫面被塞爆,每篇文章我們只印前 50 個詞
訓練語料庫前置處理準備時候,由於像是Skip thought vector訓練前需要先備齊統一單一份語料庫文檔,這邊改寫程式ver2版本
程式碼範例ver2
import warnings from gensim.corpora import WikiCorpus # 忽略不影響執行的警告 warnings.filterwarnings("ignore", category=UserWarning, module='gensim') if __name__ == '__main__': # 定義輸入與輸出路徑 inputfile = r"E:\corpus\zhwiki_data\zhwiki-latest-pages-articles.xml.bz2" outputfile = r"E:\corpus\zhwiki_data\wiki_zh_corpus.txt" # 指定另存的 txt 檔名與路徑 print("正在載入維基百科檔案(請稍候)...") wiki = WikiCorpus(inputfile, dictionary={}) print(f"開始解析並寫入檔案:{outputfile}") print("-" * 30) # 開啟純文字檔準備寫入,設定 utf-8 編碼確保中文不會變成亂碼 with open(outputfile, 'w', encoding='utf-8') as f: for i, text in enumerate(wiki.get_texts()): # 將 list 中的詞彙用「空白」連接成一條完整的字串 article_text = " ".join(text) # 寫入檔案,並在每篇文章結尾加上換行符號 (\n) # 這樣每篇文章就會完整不斷行地佔據獨立的一行 f.write(article_text + "\n") # 每處理 10,000 篇文章印出一次進度,讓你知道程式還在努力運作 if (i + 1) % 10000 == 0: print(f"已處理 {i + 1} 篇文章...") print("轉換完成!所有資料已成功寫入單一 txt 檔。")
留言
張貼留言