しきい値が指定された単語に一致するライブラリが必要です。スペルが間違っているか、別の単語のリーツピークのバリエーションです。たとえば、次のようAntoine
に一致します。
4ntoine
4toine
antoine
4t01n3
titoine
entoine
a n t o i n e
など。この問題にどのように取り組むことができますか?
しきい値が指定された単語に一致するライブラリが必要です。スペルが間違っているか、別の単語のリーツピークのバリエーションです。たとえば、次のようAntoine
に一致します。
4ntoine
4toine
antoine
4t01n3
titoine
entoine
a n t o i n e
など。この問題にどのように取り組むことができますか?
提案されているように、Levenstein またはトライグラムも試すことができます。http://en.m.wikipedia.org/wiki/Trigram_search
レーベンスタイン距離が役立つ場合がありますが、最初に AMHO にいくつかのヒューリスティック ルールが適用される場合があります。
以下のプログラムを体験してください。
public class LevenshteinDistance
{
public static int computeDistance( String s1, String s2 )
{
s1 = s1.toLowerCase();
s2 = s2.toLowerCase();
int[] costs = new int[s2.length() + 1];
for( int i = 0; i <= s1.length(); i++ )
{
int lastValue = i;
for( int j = 0; j <= s2.length(); j++ )
{
if( i == 0 ) {
costs[ j ] = j;
}
else
{
if( j > 0 )
{
int newValue = costs[ j - 1 ];
if( s1.charAt( i - 1 ) != s2.charAt( j - 1 ) ) {
newValue =
Math.min(
Math.min( newValue, lastValue ),
costs[ j ] ) + 1;
}
costs[ j - 1 ] = lastValue;
lastValue = newValue;
}
}
}
if( i > 0 ) {
costs[ s2.length() ] = lastValue;
}
}
return costs[ s2.length() ];
}
public static void main(String[] args) {
String ref = "Antoine";
String[] samples = {
"4ntoine", "4ntoine", "antoine", "4nt01n3", "titoine", "entoine",
"a n t o i n e" };
for( String sample : samples ) {
System.out.printf( "| %s | %-20s | %4d |\n",
ref, sample, computeDistance( ref, sample ));
}
}
}
結果:
| Antoine | 4ntoine | 1 |
| Antoine | 4ntoine | 1 |
| Antoine | antoine | 0 |
| Antoine | 4nt01n3 | 4 |
| Antoine | titoine | 2 |
| Antoine | entoine | 1 |
| Antoine | a n t o i n e | 6 |
ご覧のとおり、最後の単語を前処理して空白を削除し、4 番目の単語を前処理して 3 を E に、4 を A に置き換える必要があります。