如何比较Java中几乎相似的字符串? (字符串距离测量)

时间:2010-01-18 08:38:33

标签: java string comparison levenshtein-distance string-metric

我想比较两个字符串并获得一些评分看起来相似多少。 例如“句子几乎相似”“句子类似”

我不熟悉Java中的现有方法,但对于PHP,我知道levenshtein function

Java中有更好的方法吗?

5 个答案:

答案 0 :(得分:50)

以下Java库提供了多种比较算法(Levenshtein,Jaro Winkler,...):

  1. Apache Commons Lang 3 https://commons.apache.org/proper/commons-lang/
  2. Simmetrics http://sourceforge.net/projects/simmetrics/
  3. 这两个库都有一个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);
    }
    

答案 1 :(得分:20)

Levensthein距离 衡量字符串的相似程度。或者,更确切地说,必须进行多少次更改才能使它们相同。

维基百科上的伪代码中提供了algorithm。将它转换为Java不应该是一个很大的问题,但它并没有内置到基类库中。

Wikipedia有更多算法来衡量字符串的相似性。

答案 2 :(得分:14)

是的,这是一个很好的指标,你可以使用来自apache commons的StringUtil.getLevenshteinDistance()

答案 3 :(得分:1)

你可以找到Levenshtein和其他字符串相似度/距离度量的实现 https://github.com/tdebatty/java-string-similarity

如果您的项目使用maven,安装就像

一样简单
<dependency>
  <groupId>info.debatty</groupId>
  <artifactId>java-string-similarity</artifactId>
  <version>RELEASE</version>
</dependency>

然后,以Levenshtein为例

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

答案 4 :(得分:1)

无耻的插件,但我也写了一个库:

https://github.com/vickumar1981/stringdistance

它具有所有这些功能,还有一些用于语音相似性的功能(如果一个单词“听起来像”另一个单词,则返回true或false,而不是其他模糊相似性,它们之间的数字在0-1之间)。

还包括dna排序算法,例如Smith-Waterman和Needleman-Wunsch,它们是Levenshtein的通用版本。

我计划在不久的将来,使它适用于任何数组,而不仅仅是字符串(字符数组)。