我想比较两个字符串并获得一些评分看起来相似多少。 例如“句子几乎相似”和“句子类似”。
我不熟悉Java中的现有方法,但对于PHP,我知道levenshtein function。
Java中有更好的方法吗?
答案 0 :(得分:50)
以下Java库提供了多种比较算法(Levenshtein,Jaro Winkler,...):
这两个库都有一个java文档(Apache Commons Lang Javadoc,Simmetrics 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的通用版本。
我计划在不久的将来,使它适用于任何数组,而不仅仅是字符串(字符数组)。