辞書からほぼ一致する文字列を提供する文字列一致コードまたはアルゴリズムはありますか (定義済みの文字列セットを含む)?
例: 辞書 (文字列のセット) に 10 個の文字列がある場合、ユーザーが何らかの文字列を入力すると、アルゴリズムは辞書から最も近い文字列を通知する必要があります。一致した値(またはパーセンテージ)で一致した文字列を取得できれば、それは素晴らしいことです。
辞書からほぼ一致する文字列を提供する文字列一致コードまたはアルゴリズムはありますか (定義済みの文字列セットを含む)?
例: 辞書 (文字列のセット) に 10 個の文字列がある場合、ユーザーが何らかの文字列を入力すると、アルゴリズムは辞書から最も近い文字列を通知する必要があります。一致した値(またはパーセンテージ)で一致した文字列を取得できれば、それは素晴らしいことです。
org.apache.lucene.search.spell
簡単に使える lucene というパッケージがあるライブラリを使ったほうがいいと思います。NGramDistance、LevensteinDistance、JaroWinklerDistance の3 つのアルゴリズムを提供します 。これを試して
最も近い一致を見つけるために、文字列と辞書内の文字列の間のレーベンシュタイン距離を計算できます。これは、文字が入れ替わったり、音声的に類似した単語には有利にならないため、スペル チェックには最適ではない可能性があります。たとえば、質問は kwizchum よりも休息に近いです。
その他の例については、http://en.wikipedia.org/wiki/Approximate_string_matchingを参照してください。
バージョン 3.0 以降、StringUtils にも便利なレーベンシュタイン距離メソッドがあることを追加したかっただけです。
public static int getLevenshteinDistance(CharSequence s,
CharSequence t)
その後は、コレクションを反復処理して最も近い一致を記憶するのと同じくらい簡単です。
public static Object findClosestMatch(Collection<?> collection, Object target) {
int distance = Integer.MAX_VALUE;
Object closest = null;
for (Object compareObject : collection) {
int currentDistance = StringUtils.getLevenshteinDistance(compareObject.toString(), target.toString());
if(currentDistance < distance) {
distance = currentDistance;
closest = compareObject;
}
}
return closest;
}
上記のメソッドでは、コレクションが null セーフである必要があり、toString() が適切に実装されている必要があることに注意してください。
レーベンシュタイン距離テクニックを試すことができます。
4 つの基本的な操作がある単純なアイデア:
アルゴリズムは、単語と辞書内のすべての単語の間の距離を計算する必要があります。最小の距離は、この単語が特定の入力とより正確に一致することを意味します。