Windows作業系統環境下安裝Ruby_Wikipedia語料庫截取純文本wp2txt_WikiExtractor_gensim解析讀取wiki資料




Ruby預設環境會有類似node.js的npm install的cli 
(定位就跟微軟開發者在用的nuget差不多、或python的pip install....)
叫做gem
相關Ruby開源套件貢獻者會在此網站平台做釋出


在一些自然語言語料庫收集任務最為知名的就是維基百科
https://dumps.wikimedia.org/
當然要注意的是wikimedia有對下載者進行了速率限制,並將每個 IP 位址的連線數上限設為 3 個。目的是確保每個人都能以合理的下載速度存取檔案。
在這邊要從官方網站的Database backup dumps進去
也就是所有跨語言的公開WIKI媒體資料完整副本,以嵌入 XML 的維基文本來源檔案和元資料形式提供。

官方有釋出dumps出來的文本壓縮檔無法直接解析需要特殊前處理

看 Wikipedia 網域抓語言代碼:
https://en.wikipedia.org/ → enwiki
https://zh.wikipedia.org/ → zhwiki
https://ja.wikipedia.org/ → jawiki
比方說
日本語言的最新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


wiki中文語料庫僅3GB相較英文WIKI的23.2G來的小很多



Solution1. wp2txt


剛好涉及到裝wp2txt
用來幫我們將 Wikipedia 這個網路上海量數據集給下載下來並轉換為文字的工具包
工欲善其事,必先利其器。

Ruby預設下載官方網站會自動推薦你反粗體的下載點
這邊用3.4.8-1(x64)他推薦的版本做下載
通常會評估套件相依來做下載導入,避免直接裝較不穩定且上下相容不太好的最新版。



接受License

選擇安裝指定路徑(這邊用默認)




這邊電腦用的是WIndows 64位元的預設路徑會在C槽
產生Ruby34-X64目錄
記得添加系統環境變數要勾選(這邊也是用默認)





當跳出來終端這邊按Enter往下走配置流程



當安裝完後就可在開始選單搜索欄位查找到Ruby

開啟 Start Command Prompt with Ruby
執行以下指令
gem install wp2txt
會自動裝截自2026年2月初最新版本的wp2txt


wp2txt當安裝好後可以透過-h (--help)先閱覽該CLI參數功能有哪些

wp2txt --input E:\corpus\enwiki-latest-pages-articles.xml.bz2 -o E:\corpus\enwiki
使用wp2txt 來將bz2檔案給轉換純文字檔,過程中會產生大量輸出檔案。
--input(或-i)就是指定傳入的bz2檔案
--output(或-o)就是指定轉出的檔案位置


要注意由於底層有引用到bunzip2.exe所以預設若電腦環境缺少就會失敗
https://github.com/yohasebe/wp2txt
Bzip2 for Windows
再去補下載安裝bzip2




系統環境變數要指定避免找不到



這邊實測
中文語意的解析花20分鐘,解壓出來總共是13.7GB。
英文的則要2小時多,解壓出來總共是107GB。


2026/2/22更正作法
上面之前介紹直接對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

英文wiki語料原始資料檔案會從enwiki-latest-pages-articles.xml.bz2
轉變為enwiki-latest-pages-articles.xml 約略105GB大


以下則是台灣繁體中文wiki語料庫會從zhwiki-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

報錯 ValueError: cannot find context for 'fork'

這是因為目前在Windows OS運行,但fork 是 Linux/macOS 才有的 multiprocessing 啟動方式。
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 檔。")















留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

外貿Payment Term 付款條件(方式)常見的英文縮寫與定義

鼎新ERP_會計系統_總帳管理_財務參數設定_傳票處理