中文維基百科文字資料獲取與預處理

cyqian發表於2016-05-09

照例,先講下環境,Mac OSX 10.11.2 ,Python 3.4.3。

下載資料

方法1:使用官方dump的xml資料

最新打包的中文文件下載地址是:https://dumps.wikimedia.org/zhwiki/latest/zhwiki-latest-pages-articles.xml.bz2

方法2:也是官方,結構化資料(json)

下載地址是:https://dumps.wikimedia.org/wikidatawiki/entities/ 。目前尚未測試使用此資料,不多作介紹。但資料模型和已有的工具都可以在wikidata的站點上找到。

解壓與轉存

我使用方法1,下載後需要對該xml檔案的壓縮包作處理,所幸gensim的WikiCorpus已經預置了部分處理。幾行關鍵的python程式碼如下:

input_file = "zhwiki-latest-pages-articles.xml.bz2"
wiki = WikiCorpus(input_file, lemmatize=False, dictionary={})
    for text in wiki.get_texts():
        str_line = bytes.join(b` `, text).decode()
        #以下可以存入檔案或資料庫

更詳細的關於WikiCorpus的介紹可以看這裡。

在上面的程式碼中,補下自己的漏,python3裡,str和bytes是兩個不同的東西,有點類似python2中的str和unicode。下面是str和bytes的相互轉換方法:

# str轉bytes
data = ""  #string
data = "".encode()  #bytes
data = b""  #bytes

# bytes轉str
data = b""  #bytes
data = b"".decode()  #string
data = str(b"")  #string

除了用gensim,還有個哥們寫了一個wikiextractor工具來處理wiki的dump資料,若感興趣可拿來參考,詳見github地址。

根據我的資料,1.17G的原始資料處理所得的文字檔案845M,246497篇文章(這個數字隨時間往後是越來越大)。

繁簡轉換

這是個糟糕的話題,佔這麼大篇幅真得感嘆中華崛起之重要。中文維基資料繁簡混雜——大家都說存在這個問題,但wikipedia的網站是將繁體中文和簡體中文分開處理的,所以一直覺得從資料庫到dump結構都應有方法將兩者區分開,暫罷,待有空研究其資料時再議。關於繁簡轉換,來斯惟和52nlp的博文都用到了一個繁簡轉換工具——OpenCC,關於此,引官方介紹如下:

Open Chinese Convert(OpenCC)是一個中文簡繁轉換開源專案,提供高質量的簡繁轉換詞庫和可供呼叫的函式庫(libopencc)。還提供命令列簡繁轉換工具,人工校對工具,詞典生成程式,以及圖形使用者介面。

這裡使用的是命令列工具。至於安裝方法,可以看Google Code上的專案頁面。如在Mac下,直接:

brew install opencc

將繁體轉為簡體的命令如下:

opencc -i wiki_zh.text -o wiki_zhs.text -c zht2zhs_config.json
那個json是什麼鬼?OpenCC的配置檔案,現在已支援json寫法,如下:

{
  "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"
      }]
    }
  }]
}

中文分詞

OK,這是個大話題,有很多選擇,網上有不少推薦結巴分詞,其實是挺不錯的。但這裡使用哈工大的LTP,github地址,篇幅原因暫時不詳細介紹這個了,只講我認為的三點:

  1. 計算語言學的基本任務,解釋地比較透徹,無論是程式碼還是文件。

  2. 配套論文產量和質量都不錯。

  3. 良心的python封裝。

儘管,國內大學中不乏類似工作,清華、復旦等也做了不少。

LTP目前我使用release裡的3.3.2,模型檔案使用3.3.1,python封裝使用0.1.9。由於是Mac下使用原始檔編譯,所以由於OSX編譯器型別變遷,pyltp 0.1.9的setup.py中一定要記得修改這行:

extra_compile_args += [`-std=c++11`, `-Wno-c++11-narrowing`,"-mmacosx-version-min=10.8",`-stdlib=libc++`]

其重點是-mmacosx-version-min這個引數。當然,根據issue記錄,25天前這個問題已修復且合併進mater分支。所以據拍腦袋估計,git原始碼安裝也是可行:

$ git clone https://github.com/HIT-SCIR/pyltp
$ git submodule init
$ git submodule update
$ python setup.py install

具體分詞的寫法就比較簡單了,例子如下:

# -*- coding: utf-8 -*-
from pyltp import Segmentor
segmentor = Segmentor()
segmentor.load("/path/to/your/cws/model")
words = segmentor.segment("這句句子要分詞")
print "|".join(words)
segmentor.release()

找一篇語料對比下分詞前後,分詞前:

巨蟹座 是一顆環繞巨蟹座 a運轉的系外行星 軌道週期為 地球日 它是距離其中央恆星第三近的行星 其質量接近於土星 該行星於 日被發現 發現
和大多數系外行星一樣 而之前 巨蟹座 該恆星仍然會出現視向速度位移 進一步的探測發現在距中央恆星 但是即使摒除了這兩顆行星的影響
中央恆星仍然存在週期為 地球日的擾動現象 由於該週期接近於巨蟹座 a的自轉週期 儘管如此 在同一份報告中 科學家宣佈發現了巨蟹座 d和巨蟹座
對其中央恆星進行的長達 而且視向速度位移的幅度較大 無法為巨蟹座 a不大活躍的光球層活動所解釋 軌道和質量 在巨蟹座 行星系統中
迄今為止已經發現了 顆行星 顆行星中 巨蟹座 c的軌道屬於輕度偏心軌道 其遠拱點較之近拱點遠了 該行星的軌道週期要長於熱木星
但是其軌道與巨蟹座 模擬表明該行星與巨蟹座 的比值 由於視向速度法的侷限性 如果此預測無誤 那麼該行星的真實質量就為 倍木星質量 物理特性
由於科學家只能間接地探測該行星 所以至今還不知道其半徑 物質構成和表面溫度 該行星質量接近土星 所以它可能屬於類木行星 從而並不擁有固體表面
參考文獻 外部連結 extrasolar visions cancri

分詞後:

巨蟹座|是|一|顆|環繞|巨蟹座|a|運轉|的|系|外行星|軌道|週期|為|地球日|它|是|距離|其|中央|恆星|第三|近|的|行星|其|質量|接近|於|土星|該|行星|於|日|被|發現|發現|和|大多數|系外|行星|一樣|而|之前|巨蟹座|該|恆星|仍然|會|出現|視|向|速度|位移|進一步|的|探測|發現|在|距|中央|恆星|但是|即使|摒除|了|這|兩|顆|行星|的|影響|中央|恆星|仍然|存在|週期|為|地球日|的|擾動|現象|由於|該|週期|接近|於|巨蟹座|a|的|自轉|週期|儘管|如此|在|同一|份|報告|中|科學家|宣佈|發現|了|巨蟹座|d|和|巨蟹座|對|其|中央|恆星|進行|的|長|達|而且|視|向|速度|位移|的|幅度|較|大|無法|為|巨蟹座|a|不|大|活躍|的|光球層|活動|所|解釋|軌道|和|質量|在|巨蟹座|行星|系統|中|迄今為止|已經|發現|了|顆|行星|顆|行星|中|巨蟹座|c|的|軌道|屬於|輕度|偏心|軌道|其|遠|拱點|較之|近|拱點|遠|了|該|行星|的|軌道|週期|要|長|於|熱|木星|但是|其|軌道|與|巨蟹座|模擬|表明|該行星|與|巨蟹座|的|比值|由於|視|向|速度|法|的|侷限性|如果|此|預測|無誤|那麼|該行星|的|真實|質量|就|為|倍|木星|質量|物理|特性|由於|科學家|只能|間接|地|探測|該行|星所|以至今|還|不|知道|其|半徑|物質|構成|和|表面|溫度|該行|星|質量|接近|土星|所以|它|可能|屬於|類|木行星|從而|並|不|擁有|固體|表面|參考|文獻|外部|連結|extrasolar|visions|cancri

小結

這篇主要基於網路上的資料,重走了一遍資料下載到中文分詞的技術點,並彙總了已知的工具鏈。上述結果對比維基的原網頁,明顯還存在不少問題,例如語料中的數字均丟失了,對於其中數量、年份等資訊對於文字理解其實很重要。尚不確定是否是WikiCorpus造成的問題。

下一篇計劃嘗試用此語料做詞嵌入相關的部分實驗。

To be continued.

原文連結:http://qiancy.com/2016/05/08/wiki-text-analysis-prepare/

相關文章