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_fromintpageの主キーであるpage_idが入る
cl_tovarchar(255)記事に対するカテゴリ名

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

categorylinksをMySQLにぶっこむ

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

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

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

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

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

category_links テーブル

カラム名説明
cl_fromintpageの主キーであるpage_idが入る
cl_tovarchar(255)記事に対するカテゴリ名

page テーブル

カラム名説明
page_idintpageの主キー(これでcategory_linksのcl_fromにJOIN)
page_titlevarchar(255)記事のタイトル

revision テーブル

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

text テーブル

カラム名説明
old_idintoldテーブルの主キー(revisionテーブルのrev_text_idに紐づく)
old_textblob記事のテキスト

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

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

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

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

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

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


もしよければ応援クリックお願いします
↓↓↓↓↓
にほんブログ村 IT技術ブログ IT技術メモへ

4 件のコメント

  • こんにちは,Miningooさん.
    この記事に書かれていることが私の今やろうとしていたことに合致していたので大変参考にさせていただきました.この記事に書かれている通りにやったところ上手く特定カテゴリにおける記事をすべて取得することが出来ました.
    しかし,取得した記事の本文を形態素解析なりしようと思ったのですが本文には,==概要==や[[…]]や*…などのゴミも入っていました.old_textにはそういう風に入っているので仕方ないのですが上手くこのゴミを取り除く方法はないのでしょうか?
    お忙しいところ恐縮ですが,あなたのお知恵を拝借出来たらと思います.

    • はじめまして、まちださん.
      記事の閲覧およびコメントありがとうございます!

      この記事、実は2014年に最初書いたもので記憶も薄れていますが、old_textに格納されているのはWikipediaのマークアップで書かれたものだった気がします。
      形態素解析等の文字列解析をする場合は、まちださんのおっしゃるとおりマークアップを外し、さらに正規化するのがよさそうです。

      もしかしたら変換用のライブラリがあるかもしれませんが、マークアップを外すには正規表現で取り除くのが良いかと思います。
      自然言語処理100本ノックという、東北大学のとある研究室が公開している問題集の第3章が参考になります。
      http://www.cl.ecei.tohoku.ac.jp/nlp100/#ch3

      Wikipediaのマークアップは、https://ja.wikipedia.org/wiki/Help:%E7%9B%AE%E6%AC%A1_%E3%83%9E%E3%83%BC%E3%82%AF%E3%82%A2%E3%83%83%E3%83%97を参考にしてください。

      その後の、正規化ですが、
      https://github.com/neologd/mecab-ipadic-neologd/wiki/Regexp.ja#python-written-by-hideaki-t–overlast
      が、参考になります!

      私自身形態素解析等するときはPythonを使っているので、Pythonよりのご紹介になってしまいました。。
      ご参考になれば幸いです!

      • お返事ありがとうございます!
        さっそくリンク先のURLを参考に作業に取り組んでいきたいと思います.
        またあなたの書かれた記事で気になるところがあればコメントさせていただきたいと思いますので,その時はよろしくお願いします.

        • コメントうれしいです!ありがとうございます!
          自然言語処理の記事も今後書いていきますので、コメントお待ちしております!

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    CAPTCHA