web-dev-qa-db-ja.com

Javaでほとんど同じような文字列を比較する方法は? (ストリング距離測定)

2つの文字列を比較して、これらがどの程度似ているかスコアを取得します。たとえば、 "文はほとんど同じです"および "文は同じです"

私はJavaの既存のメソッドに精通していませんが、PHPの場合 levenshtein関数 は知っています。

Javaにはもっと良いメソッドがありますか?

37
hsmit

Levensthein距離文字列の類似性の尺度です。または、より正確には、同じであるためにいくつの変更を行わなければならないか。

algorithm は、Wikipediaの疑似コードで利用できます。これをJavaに変換することはあまり問題にはなりませんが、基本クラスライブラリに組み込まれていません。

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

20
Joey

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

  1. Apache Commons Lang 3https://commons.Apache.org/proper/commons-lang/
  2. Simmetricshttp://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);
}
54
FiveO

ええ、それは良い指標です。Apacheコモンズの StringUtil.getLevenshteinDistance() を使用できます

15
jspcal

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"));
  }
}
3

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

https://github.com/vickumar1981/stringdistance

これらのすべての機能に加えて、いくつかの音声類似性(1つの単語が別の単語に「似ている」場合-0〜1の数値である他のファジー類似性とは異なり、trueまたはfalseを返します)があります。

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

近い将来、これを文字列(文字の配列)だけでなく任意の配列で機能させることを計画しています。

2
Vaibhav Kumar