メイン

住所抽出 アーカイブ

2008年01月15日

WebService::OkiLab::ExtractPlace

隣のチームの Tsukamoto さんが位置表現特定APIを Perl プログラムで利用するためのモジュールWebService::OkiLab::ExtractPlaceを作って CPAN に登録してくれたのでご紹介します。

使い方は以下の通り。

#!/usr/bin/perl
use WebService::OkiLab::ExtractPlace;
use Data::Dumper;
# must be UTF-8
my $text = '東京から名古屋駅を通過して大阪駅に着きました。';
$text .= '大阪市中央区本町に到着しました。';
my $explace = WebService::OkiLab::ExtractPlace->new;
my $result = $explace->extract($text);
print Dumper($result);
実行結果
debian:~ 1007 % perl extract_place.pl
$VAR1 = {
          'result_select' => [
                               [
                                 {
                                   'lat' => '34.702499',
                                   'text' => '大阪駅',
                                   'weight' => '1',
                                   'type' => 'spot',
                                   'lng' => '135.494982'
                                 },
                                 {
                                   'lat' => '34.686394',
                                   'text' => '大阪',
                                   'weight' => '1',
                                   'type' => 'spot',
                                   'lng' => '135.519994'
                                 },
                                 {
                                   'lat' => '34.683764',
                                   'text' => '大阪市中央区本町',
                                   'weight' => '1',
                                   'type' => 'address',
                                   'lng' => '135.509592'
                                 },
                                 {
                                   'lat' => '34.682015',
                                   'text' => '本町',
                                   'weight' => '1',
                                   'type' => 'spot',
                                   'lng' => '135.499095'
                                 }
                               ]
                             ]
        };

詳細は perldoc を参照してください。

2007年09月21日

MeCabで住所抽出

「MeCab 0.90 だけをつかって Auto Link」を参考に、MeCabを使って住所抽出してみます。

元データとして国土交通省国土計画局国土情報整備室の街区レベル位置参照情報を利用します。ダウンロードページから、今回は平成18年度版の大阪府全域のデータ(27000-05.1a.zip)をダウンロードしました。

$unzip 27000-05.1a.zip
Archive:  27000-05.1a.zip
  Length     Date   Time    Name
 --------    ----   ----    ----
    14907  04-10-07 16:07   md_27_2006.xml
 24563015  06-11-07 21:01   27_2006.csv
     3325  01-22-07 20:00   format_2006.html
 --------                   -------
 24581247                   3 files
$head -3 27_2006.csv | nkf -e
"都道府県名","市区町村名","大字・町丁目","街区符号・地番","座標系番号","X座標","Y座標","緯度","経度","住居表示フラグ","代表フラグ","平成17年度履歴フラグ","平成18年度履歴フラグ"
"大阪府","茨木市","鮎川一丁目","1",6,-131247.8,-37365.6,34.816231,135.591556,1,1,0,0
"大阪府","茨木市","鮎川一丁目","2",6,-131248.3,-37346.4,34.816227,135.591766,1,1,0,0

MeCab の辞書を作るために dic.csv, matrix.def, char.def, unk.def の4つのファイルを作ります。

dic.csv: 辞書ファイルです。27_2006.csv を基に以下のようなファイルを作ります。

大阪府茨木市鮎川一丁目1,0,0,-16627,大阪府茨木市鮎川一丁目1,34.816231,135.591556
大阪府茨木市鮎川一丁目2,0,0,-16627,大阪府茨木市鮎川一丁目2,34.816227,135.591766
大阪府茨木市鮎川一丁目3,0,0,-16627,大阪府茨木市鮎川一丁目3,34.816491,135.592014

変換用のスクリプト(make_dic_csv.pl)は以下の通りです。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use open ':encoding(shiftjis)';
binmode STDIN, ':encoding(shiftjis)';
binmode STDOUT, ":utf8";

while (<>) {
    next if (/^\"都道府県名/);
    my(@elm) = split(',', $_);
    my $address = $elm[0] . $elm[1] . $elm[2] . $elm[3];
    $address =~ s/\"//g;
    my $cost = int(-400 * (length($address)**1.5));
    $cost = -36000 if ($cost < -36000);
    print "$address,0,0,$cost,$address," . $elm[7] . "," .  $elm[8] . "\n";
}

matrix.def: 連接表です。元記事と同様にします。

1 1
0 0 0

char.def: 文字セットの定義ファイルです。これも元記事と同じ。

DEFAULT 1 0 0
SPACE     0 1 0
0x0020 SPACE

unk.def: 未知語に対する品詞リスト。これも元記事と同じ。

DEFAULT,0,0,0,*
SPACE,0,0,0,*

dicrc: address というフォーマットを作成し、それがデフォルトの出力になるようにします。住所文字列の部分(と緯度経度)だけを出力するようにしています。

dictionary-charset = utf-8
cost-factor = 800
bos-feature = BOS/EOS
output-format-type=address
node-format-address = %H\n
unk-format-address =
eos-format-address  =

実行します。

$ls
char.def  dicrc  make_dic_csv.pl  matrix.def  src/  unk.def
$ls src
27_2006.csv
$ ./make_dic_csv.pl src/27_2006.csv > dic.csv
$/usr/lib/mecab/mecab-dict-index -f utf-8 -c utf-8
reading ./unk.def ... 2
emitting double-array: 100% |###########################################|
reading ./dic.csv ... 279452
emitting double-array: 100% |###########################################|
reading ./matrix.def ... 1x1

done!
$echo 昨日、大阪府大阪市中央区本町二丁目5に行った | nkf -w | mecab -d . | nkf  -e
大阪府大阪市中央区本町二丁目5,34.683834,135.504052

ここまでは結構簡単です。ただし、実用するには

  • 丁目、番地等の表記の正規化
  • 市レベル、区レベルから始まるエントリの追加
などの工夫が必要になります。

2007年02月23日

住所抽出APIの使用例を公開しました

住所抽出APIを使った簡単なサンプルサービスを公開しました。
URL を入力すると、そのページに含まれる住所文字列を一覧表示し、そのうちどれかをクリックすると地図上に表示します。

2007年02月10日

住所抽出API

URL を指定すると、そのページに含まれる住所の一覧をJSON 形式で返します。callback パラメータを指定することで JSONP 形式で返すこともできます。

 リクエストURL

http://okilab.jp/address/address.do

 リクエストパラメータ

パラメータ説明
url住所文字列を探すウェブページのURL
callbackJSONP 形式で結果を返す場合のコールバックの名前

 レスポンス

JSON(callbackを指定した場合はJSONP)形式による住所文字列の配列

 リクエスト例

http://okilab.jp/address/address.do?url=http://www.oki.com/jp/Home/JIS/Profile/subsid.html

 レスポンス例

["埼玉県本庄市小島南4-1-1",
"東京都江東区南砂2-1-12",
"東京都品川区北品川1-19-4",
...]