読者です 読者をやめる 読者になる 読者になる

【Python】日本語Wikipediaのダンプデータから本文を抽出する

日本語Wikipediaのダンプデータ中の本文を利用したい。
ただ、単純にパースするだけではWiki記法の記号等が邪魔である。
というわけでWikipedia Extractorを利用して本文だけテキストとして抽出します。

Wikipedia Extractorの他にもパースするためのライブラリはいくつかあるようなので、用途によっては別のライブラリを使用したほうが良さそう。

Alternative parsers - MediaWiki

環境

Mac OSX Yosemite
Python v2.7.11
Wikipedia Extractor v2.4
20GB程度のディスク空き容量

出力結果例

抽出処理後に生成されるXMLファイルは下記のようなdoc要素の集まりになります。

<doc>...</doc>
<doc>...</doc>
...
<doc>...</doc>

具体的な例としては下記のようになります。

<doc id="20612" url="https://ja.wikipedia.org/wiki?curid=20612" title="カブ">
カブ

カブ(蕪)はアブラナ科アブラナ属の越年草。代表的な野菜(根菜類)の一つで、別名はカブラ、カブナ、カブラナ、スズナ(鈴菜、菘)など数多い。
「カブ」の語源は諸説あり、頭を意味する「かぶり」、根を意味する「株」、またはカブラの女房詞である「オカブ」からとされている。
江戸時代は漢語で蕪菁(ブセイ、wuqing)、蔓菁(マンセイ、manqing)、扁蘿蔔(ヘンラフク、bianluobo)などと呼ばれていた。
かった。
(中略)
ロシアでは『おおきなかぶ』のように民話の題材になるほど馴染みのある野菜である。
一方、カブがあまり好まれないフランスでは、大根役者に相当する「カブ役者」という言い回しがある。
</doc>

ここで、doc要素の属性idおよびurlは、

  • id:ユニークシリアルナンバー
  • url:オリジナルのWikipediaページURL

となります。

準備

日本語Wikipediaダンプデータ

まずは日本語Wikipediaのダンプデータを下記から入手します。

Index of /jawiki/latest/

jawiki-latest-pages-articles.xml.bz2が記事本文を含むダンプデータですね。
当然ですがファイルサイズが大きいので注意。

Wikipedia Extractor

下記サイト内のDownloadsからWikipedia ExtractorのPythonスクリプトを直接ダウンロードします。

Wikipedia Extractor - Medialab

抽出作業

WikiExtractor.pyjawiki-latest-pages-articles.xml.bz2を同一ディレクトリに置き、下記のコマンドを実行するのみで基本的には終了です。

WikiExtractor.py -b 500K -o extracted jawiki-latest-pages-articles.xml.bz2

これで、extractedディレクトリ下に、500KB毎に区切られた抽出後ファイルが生成されていきます。
公式では-cオプションを設定して圧縮していました。
私はとりあえずそのままで構わないので、このオプションは外しました。

次に、このままではファイルが分割状態で使用が面倒なため、一つのファイルにまとめます。

find extracted -name 'wiki*' -exec cat {} \; > text.xml

これで全ての本文データがtext.xmlファイル内に格納されました。
私の試行時では、およそ2.5GBくらいのファイルになりました。

まとめ

というわけで、無事日本語Wikipediaのダンプデータから本文のパースおよび抽出が完了しました。
偉大なライブラリ製作者に感謝。

参考

GitHub - attardi/wikiextractor: A tool for extracting plain text from Wikipedia dumps

実行時のオプション等はこちらから。