42

2 つの文字列を比較して、どれだけ似ているかスコアを取得したいと考えています。例えば「文章がほぼ似ている」文章が似ている」など。

Java の既存のメソッドには詳しくありませんが、PHP の場合はレーベンシュタイン関数を知っています。

Javaにはより良い方法がありますか?

4

5 に答える 5

57

次の Java ライブラリは、複数の比較アルゴリズム (Levenshtein、Jaro Winkler など) を提供します。

  1. Apache Commons Lang 3 : https://commons.apache.org/proper/commons-lang/
  2. Simmetrics : http://sourceforge.net/projects/simmetrics/

どちらのライブラリにも Java ドキュメントがあります ( Apache Commons Lang JavadocSimmetrics 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);
}
于 2011-10-07T10:12:44.157 に答える
21

レーベンシュタイン距離、文字列がどの程度似ているかを示す尺度です。または、より正確には、それらが同じであるために何回の変更を加える必要があるか.

このアルゴリズムは、ウィキペディアで疑似コードで入手できます。それを Java に変換することは大した問題ではありませんが、基本クラス ライブラリには組み込まれていません。

ウィキペディアには、文字列の類似性を測定するアルゴリズムがいくつかあります。

于 2010-01-18T08:44:34.987 に答える
16

ええ、それは良いメトリックです。Apache Commons のStringUtil.getLevenshteinDistance()を使用できます

于 2010-01-18T08:43:56.210 に答える
3

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"));
  }
}
于 2015-11-20T11:24:26.213 に答える
2

恥知らずなプラグですが、ライブラリも作成しました。

https://github.com/vickumar1981/stringdistance

これらすべての機能に加えて、音声類似性のためのいくつかの機能があります (ある単語が別の単語のように聞こえる場合、0 から 1 の間の数値である他のあいまいな類似性とは異なり、true または false を返します)。

また、Levenshtein の一般化されたバージョンである Smith-Waterman や Needleman-Wunsch などの DNA シーケンス アルゴリズムも含まれています。

近い将来、文字列 (文字の配列) だけでなく、任意の配列でこれを機能させる予定です。

于 2018-12-03T00:34:44.383 に答える