キーボードのnで進む、pで戻る

自然文章から日本の住所を頑張って出力

shibuya.pl / 大沢和宏(Yappo)

アジェンダ

  1. 日本の住所ルール
  2. 抽出方法考える
  3. Regexp::Assemble
  4. ノーマライズ
  5. 変った住所
  6. 最後に

アジェンダ

Geography::AddressExtract::Japan という日本の住所抽出モジュールを作った時の苦悩とかを話します。

開発のきっかけ

  1. 位置情報が活発だからなんかしたい
  2. ジオコーダ使いたい!
  3. 自然文から抽出したい!
  4. フリーなのが見当たらない!

ファック! 位置情報関連業界!

miss^^;

日本の住所ルール

素人が作るために

  1. 位置情報屋の資料漁る
    -> たいした情報ない
  2. 住所マニアのサイトあさり
    -> 変った表記沢山ある
  3. 郵便番号DBを読み漁る
    -> パターンつかむ

住所ルール 町村

  1. 都道府県 (東京都)
  2. 郡 (西多摩郡)
  3. 町村 (檜原村)
  4. 大字 (南郷)
  5. 小字 (無い場合もある)
  6. 番地

住所ルール 東京の島

  1. 都道府県 (東京都)
  2. 島 (小笠原諸島 とか 新島)
  3. 町村 (小笠原村)
  4. 大字 (父島 とか 末吉)
  5. 小字 (奥村 とか 無い場合もある)
  6. 番地

住所ルール 市

  1. 都道府県 (東京都)
  2. 市 (八王子市)
  3. 大字 (どっか町)
  4. 小字 (1丁目)
  5. 番地

住所ルール 政令指定都市

  1. 都道府県 (東京都)
  2. 市 (千葉市)
  3. 区 (美浜区)
  4. 大字 (どっか町)
  5. 小字 (1丁目)
  6. 番地

住所ルール 特別区

  1. 都道府県 (東京都)
  2. 区 (新宿区)
  3. 大字 (新宿)
  4. 小字 (1丁目)
  5. 番地

分ったこと

ほぼ全ての地域は
都道府県/郡市区町村/大字/小字/番地/号
で表せそう

抽出方法考える

正規表現 ?

  1. /(.+[都道府県])(.+[市区町村])hogehoge/
    みたいな正規表現いっぱい書く?
  2. ノイズ多そう
  3. でも正規表現を使うのよさそう

都道府県をキーにする

  1. (北海道|青森県|岩手県|..)のような正規表現を用意
  2. 都道府県にマッチした所から住所らしき文字列を抽出
  3. 市区町村から住所が書かれてたらダメ
  4. 架空の住所のノイズが

郵便番号DBから住所を引っ張って来る

  1. 正確な住所表記を抽出できる
  2. 問題はデータサイズ
  3. そもそも、住所全パターンで正規表現作れるのかよ

そうだRegexp::Assembleがあった

Regexp::Assemble

  1. 複数の文字列のいづれかにマッチする正規表現を作る
  2.   use Regexp::Assemble;
      my $ra = Regexp::Assemble->new;
      $ra->add( 'ab+c' );
      $ra->add( 'ab+-' );
      $ra->add( 'a\w\d+' );
      $ra->add( 'a\d+' );
      print $ra->re; # prints a(?:\w?\d+|b+[-c])
  3. See perldoc Regexp::Assemble

どうつかう?

  1. 住所DBのデータを全て使う 自動生成
  2. 都道府県、郡、市区町村、字の四つ
  3. 郡が無ければ三つ
  4. これらをあり得るパターンで結合して正規表現作成
    実物

パターン

  1. 千葉県千葉市美浜区ほげほげ
  2. 千葉県美浜区ほげほげ
  3. 千葉市美浜区ほげほげ
  4. 美浜区ほげほげ
  5. 千葉県千葉市美浜区
  6. 千葉県千葉市

最小マッチ / 最大マッチ

  1. 都道府県や市が抜けても抽出したい
  2. 抜けた所は、自動的に保管したい
  3. どの区が、何県何市に属してるかを別途HASHで保持する
    実物
  4. 港区の場合は?

同名地名の対応

  1. 東京都港区 名古屋市港区 の場合はどっちを選ぶ?
  2. 町の名前で選ぶ
  3. 港区六本木 なら 東京都港区六本木
  4. 港区大手町 なら 愛知県名古屋市港区大手町
  5. 自然に補完
  6. この対策もモジュール化!
    実物

その他

  1. 番地のパターン抽出にもR::Aでパターン作成
  2. 字の抽出もR::Aでパターン作成
  3. Regexp::Assemble大活躍

抽出レベル

  1. 市区町村名があれば抽出できる
  2. 番地とか無くてもいい
  3. 千葉県千葉市 だけでも引っかかる

ノーマライズ

正規化! 正規化!

  1. 人間の住所表記はゆらぎがおおい
  2. 1-2-3 とか 五の三の四 とか 1丁目4番地 とか
  3. 数値の正規化
  4. 番地 号の正規化
  5. 形式の統一

ノイズがいっぱい

  1. 町田市なんとか小学校 が抽出される
  2. 文章の内容によっては、ごみ文字列もでてくる
  3. 形態素とかもいるかもね

竜ヶ崎 竜ケ崎 竜崎 龍崎

  1. やってらんないのでスルー
  2. 異字体でもちゃんと認識させたいけど大変
  3. フィルタリングフレームワークで対応したい

変った住所

メジャーなとこ

  1. 京都市
  2. 北海道

京都市役所の恐怖

全部京都市役所の住所

  1. 京都市中京区寺町通御池上る上本能寺前町488
  2. 京都市中京区寺町通押小路下る上本能寺前町488
  3. 京都市中京区押小路通寺町東入上本能寺前町488
  4. 京都市中京区押小路通河原町西入上本能寺前町488
  5. 京都市中京区河原町通押小路下る上本能寺前町488
  6. 京都市中京区河原町通御池上る上本能寺前町488
  7. 京都市中京区御池通河原町西入上本能寺前町488
  8. 京都市中京区御池通寺町東入上本能寺前町488

もっと恐怖、これも同じ場所

  1. 高倉通六角下ル
  2. 高倉通蛸薬師上ル
  3. 六角通烏丸東入ル2筋目下ル
  4. 蛸薬師通烏丸東入ル2筋目上ル

京都市こわすぎ

  1. 角とか入るとか上るとか
  2. 普通の住所表記もあったりする
  3. 一応、Geography::AddressExtract::Japanで抽出可能

北海道

  1. 札幌市浜5−南1
  2. 札幌市神町営団大通り
  3. 札幌市太田5の通り23番地

北海道は通りが主体

  1. 札幌市中央区の北四条西とか
  2. /札幌市.+区.+条[西東]?.丁目/ とかでいけそう
  3. でもやらずに、先の説明のパターンで抽出可能

マイナーなとこ

  1. 大阪市中央区上町A番
  2. 大阪市鶴見区浜5−南1
  3. 静岡県下田市一丁目
  4. 静岡県伊豆の国市エメラルドタウン2312
  5. 地割りという表記

最後に

デモです

  1. 私的ハザードマップ
  2. 各種ニュースサイトの記事から本文抽出
  3. 本文から住所抽出
  4. 抽出した住所をジオコーダに渡して緯度経度取得
  5. google mapsに貼っ付ける
  6. どうぞ
  7. 何でやってるかは禁句

今後は

  1. ノイズ/適合立うp
  2. プラグインの仕組再整備
  3. 他の人の意見もっとほすぃ

Yahoo!で「京都市役所の住所」で検索

ご清聴ありがとうございました

secondlife++