2009-05-25 12 views
9

名前が文字列として提供される2つの場所の間の物理的な距離を測定する必要があります。時には名前が若干異なって書かれることもあるので、私はその違いを測るのに役立つ図書館を探していて、それを緯度と経度の尺度と組み合わせて正しいマッチを選択しました。優先言語:JavaまたはPHP。2か所の物理的距離

提案がありますか?

+0

Hehは、間違った焦点を強調するためにタイトルを混同して編集しました。答えは、受け入れられた答えが示唆しているように、最終的にはまだ文字列距離です。 – icedwater

答えて

6

Levenshtein distanceをご覧ください。これは、異なる2つの文字列が互いにどのようになっているかを測定する方法です。

うまくいけば私はあなたの質問を正しく理解しました。 「緯度と経度」と同じ文章で「距離」を使用すると混乱する可能性があります。

+0

私の誤り..「距離」を使うと混乱します。緯度と経度が関係している限り、私は本当にフィジカルな距離を意味していました。文字列が関係する限り、私は2つの文字列の「相違」を意味していました。 Levenshteinの距離は遠くに見えるようですが、遠隔測定のための "ready to use"ライブラリがあれば完璧です... – PieroP

+3

PHPにはLevenshtein距離関数が組み込まれています:http://www.php.net/manual/en/function.levenshtein.php –

+0

入力ありがとうございました – PieroP

4

libdistanceは、文字列/データにいくつかの距離メトリックを適用するためのツールです(pythonとtclバインディングを使用)。

メトリックが含まれる:

  • ブルーム
  • damerau
  • ユークリッド
  • ジャカード
  • レーベンシュタインマンハッタンハミング
  • ミンコフスキー
  • needleman_wunsch
0

私はJavaでSumMetricsを見つけましたが、それを使用していません。

+0

私はLevenshtein実装をチェックアウトしました。私のポストで提供されるメモリは少ないですが(短い文字列ではそれほど問題になりません)。 –

0

私はLevenshtein距離を計算するために書いたC#コードをJavaコードに変換する自由を取った。これは、厳密なテストが、それは大丈夫動作しているようだされていない

public static int getDifference(String a, String b) 
{ 
    // Minimize the amount of storage needed: 
    if (a.length() > b.length()) 
    { 
     // Swap: 
     String x = a; 
     a = b; 
     b = x; 
    } 

    // Store only two rows of the matrix, instead of a big one 
    int[] mat1 = new int[a.length() + 1]; 
    int[] mat2 = new int[a.length() + 1]; 

    int i; 
    int j; 

    for (i = 1; i <= a.length(); i++) 
     mat1[i] = i; 

    mat2[0] = 1; 

    for (j = 1; j <= b.length(); j++) 
    { 
     for (i = 1; i <= a.length(); i++) 
     { 
      int c = (a.charAt(i - 1) == b.charAt(j - 1) ? 0 : 1); 

      mat2[i] = 
       Math.min(mat1[i - 1] + c, 
       Math.min(mat1[i] + 1, mat2[i - 1] + 1)); 
     } 

     // Swap: 
     int[] x = mat1; 
     mat1 = mat2; 
     mat2 = x; 

     mat2[0] = mat1[0] + 1; 
    } 

    // It's row #1 because we swap rows at the end of each outer loop, 
    // as we are to return the last number on the lowest row 
    return mat1[a.length()]; 
} 

:それは大きなギザギザの配列の代わりに交互に2つだけ1次元配列を使用しています。それは、私が大学の運動のために作ったPythonの実装に基づいていました。お役に立てれば!

1

phonetic algorithmを使用して、多少間違った結果が得られることがあります。

さらに機械的な編集距離を使用すると、キーボードのジオメトリを考慮した重み付け関数を使用したほうが良い結果が得られます(物理的に近いキーは遠いものよりも安い)。それは特許取得済みの方法ですので、あまりにも一般的になってしまうものを書かないように気を付けてください)

+0

このようなシンプルで(しかし輝かしい)アイデアはどのように特許を取得できますか? :Pそれともキーボードマッピングを尊重するのは正確なテクニックでしたか? –

+0

ソフトウェアアルゴリズムは、いくつかの合法的に後方の司法権で特許を取ることができるので、私はただのエンジニアなので、詳細を調べるのは苦労しませんでした。 – Christoffer

+0

発音アルゴリズムのアイデアはとてもいいです。この機能を実装するライブラリはありますか? – PieroP

関連する問題