WikipediaのSQLダンプから親カテゴリを含むカテゴリ情報をCSVで吐き出すツールをDockerhubで公開
動機
itemizerでは多数の商品を取り扱うため、商品をカテゴリごとに、階層的に分けたいと考えた。 そこで弊チームの一員に相談したところ、Wikipediaがカテゴリ情報を持っているので利用すればよいとの助言を受けたため、カテゴリ情報をCSVで吐き出すことにした ※オープンデータ関連の講演を聴講する機会が多々有ったが、自分の頭の中のテーブルには載っていなかったのではっとしたのは内緒。
手順
とりあえずwikipediaが公開しているSQLダンプファイルの一覧を探すと以下のサイトにあたった。
Wikipediaのダウンロードできるデータファイル一覧 | mwSoft
SQLファイルはテーブルごとに分割してダンプされており、各SQLファイルの概要とそのカラムの説明が記載されている非常に良心的なサイトで安心した。
categoryテーブルをCSVに書き出すだけで良いのかと思ったのもつかの間、categoryテーブルのカラムを見ると親カテゴリの記載がないことに気づいた。 こんな時にはstackoverflowの出番なのだが、今回は納得できる回答が見当たらず、DockerhubやGithubにもそれらしいリポジトリは見当たらなかったため自作することにした。
niwatolli3/wikipedia-category-csv
https://hub.docker.com/r/niwatolli3/wikipedia-category-csv/
以下のコマンドを実行すると、カテゴリ情報を持つCSVファイルが出力される。出力先は /opt/categories.csv である。
docker run -d -v /opt/:/opt/ --rm niwatolli3/wikipedia-category-csv
/home/tomi/repos/wikipedia-category-csv% docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 39a3f0ad16f0 niwatolli3/wikipedia-category-csv "/bin/sh -c '/usr/..." 2 minutes ago Up 2 minutes flamboyant_bhabha
IMAGEに自分のハンドルネームが載っていてこの上なく嬉しい。
カテゴリ一覧の生成
Wikipediaが公開しているSQLダンプファイルを用いてカテゴリ一覧を生成しようと考えている。
カテゴリの一覧は取得できるがサブカテゴリをcategoryテーブルからは取れないようなので、うまく取れる方法はないか模索した。
stackoverflowによれば、page, category, category_linksテーブルの3つが必要であると記載されているのでとりあえずmysql にimportしてデータを眺めてみる。
mediawiki - Wikipedia Category Hierarchy from dumps - Stack Overflow
どうやら以下のSQL文でカテゴリ一覧を取れるっぽい
カテゴリ
MariaDB [wikipedia]> select page.page_title from categorylinks join page on page.page_id = categorylinks.cl_from join category on categorylinks.cl_to = category.cat_title where categorylinks.cl_type = 'subcat' and category.cat_title like '学問'; +-----------------------------------+ | page_title | +-----------------------------------+ | 学問の分野 | | 科学 | | 学問スタブ | | 架空の思想・学問 | | 学者 | | 学術出版 | | 学術称号 | | 学術団体 | | 学生 | | 学派 | | 学問の賞 | | 研究 | | 高等教育 | | 知識 | | 問題 | | ルネサンス・ユマニスム | +-----------------------------------+ 16 rows in set (0.00 sec)
itemizer開発日記
itemizer開発日記を立ち上げました。