42

我想比较两个字符串并得到一些分数,它们看起来有多相似。例如“句子几乎相似”“句子很相似”

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

Java中有更好的方法吗?

4

5 回答 5

57

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

  1. Apache Commons 语言 3https ://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

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

算法在 Wikipedia 上以伪代码形式提供。将其转换为 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上找到 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"));
  }
}
于 2015-11-20T11:24:26.213 回答
2

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

https://github.com/vickumar1981/stringdistance

它具有所有这些功能,加上一些用于语音相似性的功能(如果一个词“听起来像”另一个词 - 返回真或假,这与其他模糊相似性是 0-1 之间的数字不同)。

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

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

于 2018-12-03T00:34:44.383 回答