私はC++のレーベンシュタイン距離アルゴリズムを使用して2つの文字列を比較し、それらが互いにどれだけ近いかを測定しています。ただし、プレーンなレーベンシュタイン距離アルゴリズムは、スペースで区切られた単語の境界を区別しません。これにより、距離の計算が私が望むよりも小さくなります。タイトルを比較して、それらが互いにどれだけ近いかを確認しています。アルゴリズムが、複数の単語にまたがる場合に文字が一致しているとカウントしないようにしたいと思います。
たとえば、これら2つの文字列を比較すると+
、一致を指定し、不一致を指定すると、次の結果が得られます-
。
Al Chertoff Et
Al Church Department of finance Et
+++++------+--++-----++-+------+++
Al Ch e rt of f Et
"Chertoff"
4つの単語間で単語が一致すると、距離は20に"Church Department of finance"
なりますが、複数の単語から文字が一致することを許可せず、単語との距離が25になるようにすることで、それらを互いにさらに離して検討する必要があります。"Chertoff"
1つの単語に最も一致し、"Department"
3つの文字が一致します。
Al Chertoff Et
Al Church Department of finance Et
+++--------+--++---------------+++
Al e rt Et
Ch off
これを達成するためにレーベンシュタイン距離をどのように適応させることができますか、またはこれにより適した別の距離アルゴリズムがありますか?おそらく、各単語のレーベンシュタイン距離を個別に使用して、単語の働きをし、距離が最も短い単語を選択しますか?ただし、1つの単語を文字列の奥深くまで一致させると、後続の単語の一致が文字列の最初の方で最も優れていたために、一致が不十分になった場合はどうなりますか?これは、レーベンシュタイン距離を単語レベルに適合させて、どういうわけか行うことができますか?
たとえば、次のより複雑な例のこのアイデアによる最短距離は20です。
Al Chertoff Deport Et
Al Church Department of finance Et
+++++----++++-++---------------+++
Al Ch Dep rt Et
ertoff o
の一致を最大化"Chertoff"
して24のより長い距離を取得する代わりに:
Al Chertoff Deport Et
Al Church Department of finance Et
+++--------+--++-----+---------+++
Al e rt o Et
Ch off
Dep rt
レーベンシュタイン距離の現在の実装は次のとおりです。
size_t
levenshtein_distance(const std::string& a_compare1,
const std::string& a_compare2) {
const size_t length1 = a_compare1.size();
const size_t length2 = a_compare2.size();
std::vector<size_t> curr_col(length2 + 1);
std::vector<size_t> prev_col(length2 + 1);
// Prime the previous column for use in the following loop:
for (size_t idx2 = 0; idx2 < length2 + 1; ++idx2) {
prev_col[idx2] = idx2;
}
for (size_t idx1 = 0; idx1 < length1; ++idx1) {
curr_col[0] = idx1 + 1;
for (size_t idx2 = 0; idx2 < length2; ++idx2) {
const size_t compare = a_compare1[idx1] == a_compare2[idx2] ? 0 : 1;
curr_col[idx2 + 1] = std::min(std::min(curr_col[idx2] + 1,
prev_col[idx2 + 1] + 1),
prev_col[idx2] + compare);
}
curr_col.swap(prev_col);
}
return prev_col[length2];
}