Wikipediaダンプから地名を抽出

↓このへんの記事の続き
Wikipedia記事データのローカルDBへの取り込み - 泥縄トラップ
「日本の妖怪一覧」からリンクされたページIDを抽出 - 泥縄トラップ
妖怪の生息地 - 泥縄トラップ

  • Wikipediaの本文のデータを落としてMySQLの中へ取り込む
  • 落としたデータから「日本の妖怪の一覧」に含まれる妖怪のページを抽出
  • 折角なので「妖怪」のページへリンクしている項目は全部抽出してみる
  • 項目本文のテキストから地名を抽出して、項目と地名を関連付ける
  • 地名を地理情報のデータと関連付けて、「妖怪の生息地図」的な物を作る

出力結果

左の数字がpageテーブルとtextテーブルの内容を繋げるID「text.old_id」。右がそのテキスト内に含まれる都道府県名。テーブル構造についてはText table/ja - MediaWikiなどを参照。

これだけ見てもあまり面白くはない。このままだと扱うのが面倒なのでMySQLに取り込みたいところ。

31161681,兵庫県
31161681,大阪府
31161681,奈良県
…
28607176,新潟県
28607176,福井県
28607176,福島県

コード例

require 'rubygems'
require 'mysql'
require 'sqlite3'

#sqliteで地名準備
db_location = "F:\\tools\\spatialite-gui-win-x86-1.3.0_beta\\20100318.sqlite"

#都道府県の一覧
sqlite = SQLite3::Database.new(db_location)
sql = "select distinct PRN from japan"
loc_names = sqlite.query(sql)

#mysqlのdbを開く
hostname = "localhost"
user = "****"
password = "****"
dbname = "yokai_wiki"

#yokai_wikiの本文テーブルを見る
mysql = Mysql::new(hostname, user, password, dbname)
res = mysql.query("select old_id, old_text from yokai_wiki.text")

#本文中の都道府県名検索
res.each do |ms_row|
  #都道府県を全部回す
  loc_names.each do |name|
    name = name.to_s
    puts ms_row[0]+","+name if ms_row[1].to_s.include?(name) #=>"0001,北海道"
  end
  
  #loc_namesのカーソルリセット
  loc_names.reset
end

mysql.close

*1:手元にあるのが現代の行政区分のデータだけなので別にデータが必要になる