前回の記事にて、Wikipediaの全記事をMySQLにぶっこみました。しかし、あるカテゴリにおける全記事を取得したいときってどうするの?となったため、ごちゃごちゃいじったときのメモを残します。
Wikipediaデータをxml2sqlを利用しMySQLにぶっこむ
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のアニメの登場人物の一覧の記事が取得しました。
取得した記事から、キャラクタとその内容(存在すれば記事)を取得していく方法を次回以降まとめていきます。