2009年10月4日日曜日

Emacs + Lookup で Wikipedia辞書を手軽に持ち歩く

Wikipedia の記事データをノートパソコンに入れ、どこでも気軽に素早く引けるようにしたい、という要望は結構、多いかと思います。ここでは、そんな方法の一つを紹介したいと思います。

Wikipedia の全記事データは、wikipedia.org の 公式サイト から圧縮XMLファイルとして、自由にダウンロードできます。

しかし、これをオフラインで読むために、自分のノートパソコンに Wikipedia サーバを構築する作業は、非常に多くの手間と時間を要します。MySQLサーバへの記事の読み込みだけで4・5日かかる場合 も珍しくありません。また数十Gbyteという膨大なHDDを消費します。これでは頻繁に記事データを更新する気力も失せてしまいます。

Wikipedia を辞書標準フォーマットEPwingに変換するツール等もあります。しかしこれらを使ったとしても、作業には半日ほどの時間かかり、また辞書サイズも4Gbyteを超えてしまい、さらにEPwingは日本独自の仕様であるため、JIS X 0208以外の文字が扱えない等の問題がありました。

ここでは、配布されている圧縮Wikipedia記事データをそのまま、解凍せずに手軽に検索して読む方法を紹介します。基本的なアイデアは記事 "Building a (fast) Wikipedia offline reader" に基づいています。

配布圧縮データをそのまま使う利点は、ディスク消費容量の少なさと、導入の容易さです。容量としては、配布圧縮データ+インデックスで、元ファイルの1.3〜 1.6倍程度(2009年10月時点の日本語版Wikipediaで1.3Gbyte, 英語版で8.5Gbyte)の容量しか必要としません。またセットアップも日本語版Wikipediaで1時間程度、英語版でも半日から1日程度(マシンの性能 に依存します)で完了するため、記事を最新版に更新するのも容易です。

この方式は、配布されている圧縮Wikipedia記事データ(日本語版の場合は jawiki-latest-pages-articles.xml.bz2 で、2009年10月時点でおよそ1Gbyteの容量がある)が、"bzip2" 形式で圧縮されていることを利用します。"bzip2" はブロックソート処理を行う都合上、約1Mbyte単位の独立したブロックの並びで構成されています。圧縮ファイルをブロック単位に分割してハードディス クにおいてしまえば、容量はほとんど変わらずに、Wikipediaの記事に対してランダムアクセスに近いことができます。

bzip2 ファイルを分割には "bzip2recover" を利用します。2009年10月時点の jawiki-latest-pages-articles.xml.bz2 を分割すると、およそ5,000近いファイルが生成されます。この分割ファイル群の総容量は、オリジナルとほぼ変わりません。分割後はオリジナルファイルは消去します。この作業は10数分程度でできます。

次に、分割 され、ランダムアクセスできるようになった Wikipedia の記事データに対して、インデックスを作成します。Wikipedia XML ファイルでは、項目タイトルは <title> .... </title> タグで囲まれています。このタイトルを(日本語版では)形態素解析に基づいて分解すると、検索性が高いインデックスを作ることができます。

この作業を高速に行うためのツールとして、"MeCab"と"Xapian" を使用します。この両者の組み合わせで、日本語版Wikipediaならば1時間程度でインデックスが作成できます。(英語版のWikipediaの場合、空白で単語を区切ってインデックス化する作業はおよそ1日ほどかかりました。)

Wikipediaの記事本文は、XMLファイルのtext タグ中にMediaWiki フォーマットで格納されています。MediaWikiフォーマットの記事を自分のノートパソコンで閲覧するには、ノートパソコンにApache Webサーバと、PHPで書かれたMediaWiki/HTML変換ツールを用意しなくてはなりません(上述のWebサイトはこの方法の説明がありま す)。ただ、この方式は処理が重く、テキストベースでさくさくと気軽に記事を読みたいという場合にはあまり向いていません。

MediaWiki (Wikipedia)もwikiの一種類であるため、その書式を plain text に変換するのは難しくありません。ただし MediaWiki をテキスト化するならば、「表組」と「数式」をどのように扱うかが問題になります。Wikipediaでは(しばしば複雑な)表が多用されるため、この 表示をおろそかにする訳にはいきませんし、また理系のリファレンスとしてWikipediaを使う場合、数式をきちんと表示するのは必須です。

「表組」をプレーンテキストに変換するツールとしては、HTMLのテーブルを奇麗に整形、テキスト化する "w3m"が有名です。Mediawikiの表組は容易にHTMLのテーブルに変換できますので、まずMeidaWikiの表をHTML化し、さらにそのHTMLをw3mに食わせることで、MediaWikiの表はプレーテキストにできます。

数式は基本的にはプレーンテキスト化は無理なので、これだけは画像化せざるを得ません。MediaWikiでは、数式は math タグで囲まれたLaTeX形式(のサブセット)で書かれています。この数式を解釈し、そのまま画像化する手軽なツールとして、MediaWikiのツールの一部である texvc がありますので、数式はこれで画像化し、それをテキストに埋め込むようにします。

以上の作業を、ひとまとめに行い、Emacsのバッファで気軽にWikipediaを引くためのツールを、Emacs 辞書検索ソフトウェア、"lookup" の中に組み込んでみました。Wikipediaをノートパソコンで気軽に持ち運びたい、という人はこのツールを検討してみるのはいかがでしょうか。

ただ、本ツールはまだ作り立てなので、CVSサーバからチェックアウトして試用することしかできません(使い方メモが、ndwikipedia.el ファイルのコメント部分にあります)。

本ツールは、Emacs, MeCab、Xapian、MediaWiki (texvc)、w3m、LaTex、bzip2, ruby などを組み合わせています。元サイトの中の人も言っていましたが、多様なツールを組み合わせれば、このような比較的複雑なシステムも簡単に構築できるの が、オープンソースソフトウェアの一つの魅力なのではないかな、と思います。


(数式のみ画像化して貼付けたサンプル画面)


(W3Mを使って、MediaWikiの表組をテキスト化して表示したサンプル画面)