Java中如何比较几乎相似的字符串? (弦距测量)[关闭]

问题描述 投票:0回答:5

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

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

Java中有更好的方法吗?

java string comparison levenshtein-distance string-metric
5个回答
60
投票

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

  1. Apache Commons 文本https://commons.apache.org/proper/commons-text/
  2. Simmetricshttp://sourceforge.net/projects/simmetrics/

两个库都有 Java 文档(Apache Commons Lang JavadocSimmetrics Javadoc)。

//Usage of Apache Commons Text
import org.apache.commons.text.similarity.JaroWinklerDistance;
public double compareStrings(String stringA, String stringB) {
    return new JaroWinklerDistance().apply(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);
}

21
投票

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

算法可以在维基百科上以伪代码形式找到。将其转换为 Java 应该不是什么大问题,但它没有内置到基类库中。

维基百科还有更多衡量字符串相似度的算法。


16
投票

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


3
投票
您可以在以下位置找到 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")); } }
    

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

https://github.com/vickumar1981/stringdistance

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.