WikiExtractor を使って Wikipediaの情報を収集するための備忘録
WikiExtractor
Wikipediaが持つ大規模なテキスト情報を利用すれば様々なサービスやツールを開発できると思われますが、WikiExtractorはWikipediaのテキスト部分だけを抽出することができるツールです。 以下から最新版を入手できます。 github.com
下準備 : Wikipediaをダウンロードする
Wikipediaでは負荷軽減のために直接クロールすることを禁じています。 代わりにミラーサイトからダウンロードできるようになっていて、以下からダウンロードできます。
色々あってよくわかりませんが、私は名前から判断してjawiki-latest-pages-articles.xml.bz2 をダウンロードしました。
実行
基本的には以下のようなコマンドで解析結果が出力されます。
python WikiExtractor.py ./jawiki-latest-pages-articles.xml.bz2 -o 出力先ディレクトリ
解析結果は以下のような形式です。
<doc id="5" url="https://ja.wikipedia.org/wiki?curid=5" title="アンパサンド"> アンパサンド アンパサンド (&、英語名:) とは並立助詞「…と…」を意味する記号である。ラテン語の の合字で、Trebuchet MSフォントでは、と 表示され "et" の合字であることが容易にわかる。ampersa、すなわち "and per se and"、その意味は"and [the symbol which] by itself [is] and"である。 その使用は1世紀に遡ることができ、5世紀中葉から現代に至るまでの変遷がわかる。 Z に続くラテン文字アルファベットの27字目とされた時期もある。 ... </doc> <doc id="10" url="https://ja.wikipedia.org/wiki?curid=10" title="言語"> 言語 ,,,
オプション 一覧
Wikipediaはある程度構造化されたデータなので欲しいデータの種類は色々考えられます。 WikiExtractorではオプションを追加するだけで色々な情報を取得できます。 WikiExtractorのREADMEを見れば何が利用できるかはわかるのですが、一部Wikipediaについての知識不足で戸惑ったので今後使いそうなものを選んで軽く説明を残しておきます。
--links リンクを残す。<a href=...></a>のようにhtmlタグと中身が保存されます。 --sections sectionを残す。 <h3></h3>のようなheddingタグが残ります。 --list listを残す。リストは箇条書きのことです。(https://ja.wikipedia.org/wiki/Help:箇条書き) --min_text_length 一定値以上のtextサイズの記事のみを処理します。 --filter_disambig_pages 曖昧さ回避のページは解析しません。例えば次のようなページです。(https://ja.wikipedia.org/wiki/109_(曖昧さ回避)) -de gallery,timeline,noinclude gallery,timeline,noinclude を除去します。
links, sections, lists って?
linksはリンク、sectionは小見出し、listsは箇条書きを表します。 例えばこれらを残すオプションをつけると、wikipedia記事「日本語」の中にあるsection「題述構造」の処理結果は以下のようになります。
Section::::題述構造. また、日本語文では、主述構造とは別に、「題目‐述部」からなる「題述構造」を採ることがきわめて多い。題目とは、話のテーマ( 主題)を明示するものである(<a href="%E4%B8%89%E4%B8%8A%E7%AB%A0">三上章</a>は「what we are talking about」と説明する) 。よく主語と混同されるが、別概念である。主語は多く「が」によって表され、動作や作用の主体を表すものであるが、題目は多く 「は」によって表され、その文が「これから何について述べるのか」を明らかにするものである。主語に「は」が付いているように 見える文も多いが、それはその文が動作や作用の主体について述べる文、すなわち題目が同時に主語でもある文だからである。その ような文では、題目に「は」が付くことにより結果的に主語に「は」が付く。一方、動作や作用の客体について述べる文、すなわち 題目が同時に目的語でもある文では、題目に「は」が付くことにより結果的に目的語に「は」が付く。たとえば、 BULLET::::- 4. 象は 大きい。 BULLET::::- 5. 象は おりに入れた。 BULLET::::- 6. 象は えさをやった。 BULLET::::- 7. 象は 鼻が長い。
gallery, timeline, noincludeとは?
gelleryについては以下に説明があります。 ja.wikipedia.org
timelineは以下のようなものです。
また、noincludeについては以下に説明があります。 https://ja.wikipedia.org/wiki/Help:テンプレート
いずれも普通の用途では必要がなさそうです。(この部分のテキスト情報だけあっても使いにくくないですか?)
その他のオプション
まだ使ったことがないので詳しくは書けませんが、カテゴリを限定できるfilter_categoryオプションやnamespaceを指定できるnamespacesは使うこともありそうです。 また追記します。