2 つの文字列を比較して、どれだけ似ているかスコアを取得したいと考えています。例えば「文章がほぼ似ている」「文章が似ている」など。
Java の既存のメソッドには詳しくありませんが、PHP の場合はレーベンシュタイン関数を知っています。
Javaにはより良い方法がありますか?
2 つの文字列を比較して、どれだけ似ているかスコアを取得したいと考えています。例えば「文章がほぼ似ている」「文章が似ている」など。
Java の既存のメソッドには詳しくありませんが、PHP の場合はレーベンシュタイン関数を知っています。
Javaにはより良い方法がありますか?
次の Java ライブラリは、複数の比較アルゴリズム (Levenshtein、Jaro Winkler など) を提供します。
どちらのライブラリにも Java ドキュメントがあります ( Apache Commons Lang Javadoc、Simmetrics Javadoc )。
//Usage of Apache Commons Lang 3
import org.apache.commons.lang3.StringUtils;
public double compareStrings(String stringA, String stringB) {
return StringUtils.getJaroWinklerDistance(stringA, stringB);
}
//Usage of Simmetrics
import uk.ac.shef.wit.simmetrics.similaritymetrics.JaroWinkler
public double compareStrings(String stringA, String stringB) {
JaroWinkler algorithm = new JaroWinkler();
return algorithm.getSimilarity(stringA, stringB);
}
ええ、それは良いメトリックです。Apache Commons のStringUtil.getLevenshteinDistance()を使用できます
https://github.com/tdebatty/java-string-similarityで、レーベンシュタインおよびその他の文字列の類似性/距離測定の実装を見つけることができ ます
プロジェクトがmavenを使用している場合、インストールは次のように簡単です
<dependency>
<groupId>info.debatty</groupId>
<artifactId>java-string-similarity</artifactId>
<version>RELEASE</version>
</dependency>
次に、たとえばレーベンシュタインを使用するには
import info.debatty.java.stringsimilarity.*;
public class MyApp {
public static void main (String[] args) {
Levenshtein l = new Levenshtein();
System.out.println(l.distance("My string", "My $tring"));
System.out.println(l.distance("My string", "My $tring"));
System.out.println(l.distance("My string", "My $tring"));
}
}
恥知らずなプラグですが、ライブラリも作成しました。
https://github.com/vickumar1981/stringdistance
これらすべての機能に加えて、音声類似性のためのいくつかの機能があります (ある単語が別の単語のように聞こえる場合、0 から 1 の間の数値である他のあいまいな類似性とは異なり、true または false を返します)。
また、Levenshtein の一般化されたバージョンである Smith-Waterman や Needleman-Wunsch などの DNA シーケンス アルゴリズムも含まれています。
近い将来、文字列 (文字の配列) だけでなく、任意の配列でこれを機能させる予定です。