75

文字列を比較して、それらが同じものを表すかどうかを判断する必要があります。これは、略語やその他の細かい詳細が異なる場合がある、人間が入力したケースタイトルに関連しています。たとえば、次の2つのタイトルについて考えてみます。

std::string first = "Henry C. Harper v. The Law Offices of Huey & Luey, LLP";

とは対照的に:

std::string second = "Harper v. The Law Offices of Huey & Luey, LLP";

人間は、これらが同じである可能性が最も高いことをすばやく判断できます。私が採用した現在のアプローチは、すべての文字を小文字にし、すべての句読点とスペースを削除して文字列を正規化することです。

std::string firstNormalized = "henrycharpervthelawofficesofhueylueyllp";

と:

std::string secondNormalized = "harpervthelawofficesofhueylueyllp";

この場合を比較すると、一方は他方のサブシーケンスですが、それが必ずしも発生しない他のより複雑なバリエーションを想像することができますが、それらには共通の重要なサブシーケンスがあります。また、文字の入れ替えやスペルミスなどの人的入力エラーが発生することもあります。

おそらく、ある種の文字差分プログラムが役立つでしょうか?チェックインするコードの違いを比較するための優れたライン差分プログラムを見てきましたが、キャラクターベースで、おそらくブーストでそのようなものはありますか?共通の連続する文字の数を数え、共有されていない文字に対する比率をとることができれば、おそらくそれは良いヒューリスティックでしょうか?

結局、それらを同じと見なすかどうかについてブール値の決定が必要です。完璧である必要はありませんが、理想的には間違っていることはめったにありません。

どのアルゴリズムを使用すれば、2つの文字列が互いにどれほど類似しているかを定量化でき、ヒューリスティックによってyes / noの答えに変換できますか?

4

5 に答える 5

99

あなたが探しているのはString Metricアルゴリズムと呼ばれるものです。それらのかなりの数があり、多くは同様の特性を持っています。より人気のあるものの中で:

  • レーベンシュタイン距離: 1 つの単語を別の単語に変更するために必要な 1 文字の編集の最小数。文字列は同じ長さである必要はありません
  • ハミング距離: 2 つの等しい長さの文字列で異なる文字の数。
  • Smith–Waterman : 可変サブシーケンスの類似性を計算するためのアルゴリズムのファミリー。
  • Sørensen–Dice Coefficient : 隣接する文字ペアの差分係数を計算する類似度アルゴリズム。

トピックに関するwiki ページで、これらと他のものを見てください。

于 2013-03-08T21:31:30.560 に答える