データサイエンス

Wikipediaのある特定カテゴリにおける記事をすべて取得する方法

前回の記事にて、Wikipediaの全記事をMySQLにぶっこみました。しかし、あるカテゴリにおける全記事を取得したいときってどうするの?となったため、ごちゃごちゃいじったときのメモを残します。

Wikipediaデータをxml2sqlを利用しMySQLにぶっこむ

Wikipediaのある特定カテゴリにおける記事をすべて取得する方法

Categoryリンクってのがあるらしい?

前回の記事でも紹介しましたが、Wikipediaの記事以外にも配布されているデータがあります。
その中で、categorylinksというカテゴリの情報がありそうなデータをみつけました。
http://www.mediawiki.org/wiki/MediaWiki/jaというWikipediaのデベロッパ向けのサイトによると、

The categorylinks table stores entries corresponding to links of the form [[Category:Title]] or [[Category:Title|sortkey]]

とのことです。以下、大事なフィールドだけ解説します。

カラム名 説明
cl_from int pageの主キーであるpage_idが入る
cl_to varchar(255) 記事に対するカテゴリ名

このテーブルのデータをMySQLにぶっこみ、カテゴリごとの記事データを取得していく。

categorylinksをMySQLにぶっこむ

http://dumps.wikimedia.org/jawiki/latest/jawiki-latest-categorylinks.sql.gzを取得し、解凍する。

MySQLにぶっこむため、以下のコマンドを叩く。

mysql -u root -p wikipedia < jawiki-latest-categorylinks.sql

これで、MySQLにぶっこむところまで完了。

カテゴリごとの記事データを取得

ここからが本番で、今回は「アニメの登場人物の一覧」にあるページを取得していく。使うテーブルを以下にまとめる。

category_links テーブル

カラム名 説明
cl_from int pageの主キーであるpage_idが入る
cl_to varchar(255) 記事に対するカテゴリ名

page テーブル

カラム名 説明
page_id int pageの主キー(これでcategory_linksのcl_fromにJOIN)
page_title varchar(255) 記事のタイトル

revision テーブル

カラム名 説明
revision_id int キー
rev_page int 対応するpageのid(つまりその記事のpage_id)
rev_text_id int 記事が入っているtextのold_idに紐づく

text テーブル

カラム名 説明
old_id int oldテーブルの主キー(revisionテーブルのrev_text_idに紐づく)
old_text blob 記事のテキスト

これらの4つのテーブルを一つにSQLを使ってまとめます。
まず、「アニメの登場人物の一覧」にある記事のリストをcategory_linksから取得する

SELECT * FROM categorylinks
WHERE cl_to = 'アニメの登場人物の一覧'

このSQLにpageをINNER JOINさせる。

SELECT * FROM categorylinks c
INNER JOIN page p ON c.cl_from = p.page_id
WHERE cl_to = 'アニメの登場人物の一覧'

これで、「アニメの登場人物の一覧」にある記事のリストとそのタイトルを取得できます。次に、その記事内容を結合させていく。

SELECT * FROM categorylinks c
INNER JOIN page p ON c.cl_from = p.page_id
    INNER JOIN revision r ON p.page_id = r.rev_page
        INNER JOIN text t ON r.rev_text_id = t.old_id
WHERE cl_to = 'アニメの登場人物の一覧'

このSQLを叩くことで、「アニメの登場人物の一覧」にある記事のリストとそのタイトルと記事の内容を取得できる。最後に、無駄なカラムを引っ張ってきても意味が無いので、指定する。

SELECT cl_to, page_title, old_text FROM categorylinks c
INNER JOIN page p ON c.cl_from = p.page_id
    INNER JOIN revision r ON p.page_id = r.rev_page
        INNER JOIN text t ON r.rev_text_id = t.old_id
WHERE cl_to = 'アニメの登場人物の一覧'

Wikipediaのある特定カテゴリにおける記事をすべて取得する方法のまとめ

本記事では、Wikipediaのある特定カテゴリにおける記事をすべて取得する方法をまとめました。具体的には、全部で290のアニメの登場人物の一覧の記事が取得しました。
取得した記事から、キャラクタとその内容(存在すれば記事)を取得していく方法を次回以降まとめていきます。

-データサイエンス