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

44

我希望比较两个字符串,并得到它们相似程度的分数。

例如,"The sentence is almost similar""The sentence is similar"

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

在Java中是否有更好的方法?


“similar”是什么意思?发音相似吗?视觉上相似吗? - Viktor Klang
@Astor,从这个例子来看,我觉得可视化相似性和发音相似性都不是所需要的度量标准。 - Joey
这是一个“好问题”的很好的例子,但那些想要关闭stackoverflow上所有类型问题的人应该看到这个问题很清晰。那么为什么要关闭它呢? - Brain
5个回答

59
以下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);
}

1
超级库,易于使用且结果良好。 - bluevoid
3
现在它已经在Apache commons-lang中提供:http://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/StringUtils.html#getJaroWinklerDistance%28java.lang.CharSequence,%20java.lang.CharSequence%29 - Ian Jones
1
基于此的库现在已经在GitHub上 https://github.com/Simmetrics/simmetrics 上了。它也可以在Maven Central上获得。 - peater

21

Levenshtein距离是衡量两个字符串相似程度的一种方法。更确切地说,它表示要使两个字符串相等需要进行多少次修改。

在维基百科上提供了该算法的伪代码。将其转换为Java代码并不是太困难,但它没有内置在基础类库中。

维基百科还提供了一些衡量字符串相似度的其他算法。


16

它在Java移动版中不可用,是吗?但感谢您的回复! - hsmit
你可以将它与ME一起使用,只需添加jar文件即可。 - jspcal
1
嗯,不,我不太确定它是否完全可用于J2ME,它是使用J2SE编译的。 - Valentin Rocher
1
它不使用ME不支持的任何东西。您可以在jar中创建和复制。 - jspcal

3

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

如果您的项目使用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"));
  }
}

2

不好意思,我要自我推销一下,我也写了一个库:

https://github.com/vickumar1981/stringdistance

它包含所有这些函数,还有一些用于音相似度的函数(如果一个单词“听起来像”另一个单词-返回true或false,而其他模糊相似度是0-1之间的数字)。

还包括DNA测序算法,如Smith-Waterman和Needleman-Wunsch,它们是Levenshtein的广义版本。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接