4

私はこのアドレスを持っています:

Grimshaw Lane, Bollington, Macclesfield SK10 5JB,

このアドレスを探して、私はこれを(APIから)取得します:

Bollington Wharf, Grimshaw Lane, Bollington, United Kingdom

preg_matchがどのように機能するかは知っていますが、2つの類似したテキスト(類似している、同じではない)を比較し、それらが同じアドレスであるかどうかを判断する必要があると思います(少し異なっていても)。

4

3 に答える 3

6

100%信頼できる結果を得る解決策は明らかにありませんが、これを試してみませんか。両方の文字列をwget経由でGoogleマップに送信し、結果を比較します。グーグルはあなたが見ている問題を解決するために少なくとも何万時間も投資してきました、なぜ彼らにそれを処理させないのですか?

于 2013-01-07T22:08:57.920 に答える
2

これが役立つかどうかはわかりませんが、explodeを使用して配列内に複数の文字列を作成し、levenshtein()を使用してarray()のさまざまな要素を比較することを検討します。

比較する必要のあるアレイの数によって異なりますが、数が少ない場合(数千ではない)

疑似コードは次のようになります。

$search_address = "Bollington Wharf, Grimshaw Lane, Bollington, United Kingdom";

$my_addresses = Array("Grimshaw Lane, Bollington, Macclesfield SK10 5JB", 
                         "Different Lane, YabbaDabbaDoo, Otherfield SK12 6BJ", 
                         ...);
$search_array = explode(',', $search_address);

$best_address = array();
$lowest_compare_value = 1000;
$lowest_compare_address = array();
foreach($my_addresses as $key => $my_address) {
   $current_address_array = explode(',', $value);
   $compare_value = 0;

   foreach(<elements in $my_address>) {

      $lowest_value = 1000;      
      foreach(<elements in $search_array) {
          $new_value = levenshtein($search_element, $my_element);
          if ($new_value < $lowest_value) { $lowest_value = $new_value; }
      }
      $compare_value += $lowest_value;
   }
   if($compare_value < $lowest_compare_value) {
      $lowest_compare_value = $compare_value
      $lowest_compare_address = $my_address;
   }

}

ここで、比較されたアドレスが遠すぎるかどうかを確認するために、もっともらしいレーベンシュタイン値の最大値も考慮する必要があります。

前述のように、この方法は時間がかかるため、速度が必要なアプリケーションやローカルアドレスが多い場合は使用しないでください。

于 2013-01-07T22:55:39.153 に答える
1

私はこのユーティリティを作成しました、そしてそれは私のためにしばらくの間働いていました。もちろん、GoogleマップがAPIインターフェースを変更した場合は、それを変更する必要があります。

<?php
// Queries google maps for the address components
function utl_GetAddressComponents( $location )
{
    $components = file_get_contents('http://maps.google.com/maps/api/geocode/json?address='.urlencode($location).'&sensor=false');
    $output = json_decode($components);

    return $output->results[0];
}
?>

これは、コマンドラインから実行するために使用したテストファイルです。

tst_MatchingAddresses.php:

<?php
require_once( "utl_GetAddressComponents.php" );
$addr1 = $argv[1];
$addr2 = $argv[2];

$gmapsResult1 = utl_GetAddressComponents( $addr1 );
$gmapsResult2 = utl_GetAddressComponents( $addr2 );

$gmapsAddr1 = $gmapsResult1->formatted_address;
$gmapsAddr2 = $gmapsResult2->formatted_address;

print("Gmap1: ".$gmapsAddr1." ----- argv[1]: ".$argv[1]."\n");
print("Gmap2: ".$gmapsAddr2." ----- argv[2]: ".$argv[2]."\n");

if ( strcmp($gmapsAddr1,$gmapsAddr2) )
{
    print("==> Addresses match!\n");
}
else
{
    print("==> Addresses DO NOT MATCH!\n");
}
?>

コマンドラインの例を次に示します。

php tst_MatchingAddresses.php "1600 Pennsylvania Ave, Washington DC" "1600 Pennsylvania Avenue, 20500"

出力例:

Gmap1: 1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA ----- argv[1]: 1600 Pennsylvania Ave, Washington DC
Gmap2: 1600 Pennsylvania Avenue Northwest, President's Park, Washington, DC 20500, USA ----- argv[2]: 1600 Pennsylvania Avenue, 20500
==> Addresses match!

注:file_get_contentsの引数を入力し、urlencodeなどをアドレスに置き換えると、ブラウザーに直接入力すると、jsonの結果が表示されます。

于 2013-06-25T23:59:57.950 に答える