我希望比较两个字符串,并得到它们相似程度的分数。
例如,"The sentence is almost similar"和"The sentence is similar"。
我不熟悉Java中现有的方法,但对于PHP,我知道levenshtein函数。
在Java中是否有更好的方法?
我希望比较两个字符串,并得到它们相似程度的分数。
例如,"The sentence is almost similar"和"The sentence is similar"。
我不熟悉Java中现有的方法,但对于PHP,我知道levenshtein函数。
在Java中是否有更好的方法?
//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);
}
Levenshtein距离是衡量两个字符串相似程度的一种方法。更确切地说,它表示要使两个字符串相等需要进行多少次修改。
在维基百科上提供了该算法的伪代码。将其转换为Java代码并不是太困难,但它没有内置在基础类库中。
维基百科还提供了一些衡量字符串相似度的其他算法。
是的,这是一个很好的指标,您可以使用来自Apache Commons的StringUtil.getLevenshteinDistance()。
您可以在https://github.com/tdebatty/java-string-similarity中找到Levenshtein和其他字符串相似度/距离测量的实现。
如果您的项目使用maven,安装就像这样简单:
<dependency>
<groupId>info.debatty</groupId>
<artifactId>java-string-similarity</artifactId>
<version>RELEASE</version>
</dependency>
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"));
}
}
不好意思,我要自我推销一下,我也写了一个库:
https://github.com/vickumar1981/stringdistance
它包含所有这些函数,还有一些用于音相似度的函数(如果一个单词“听起来像”另一个单词-返回true或false,而其他模糊相似度是0-1之间的数字)。
还包括DNA测序算法,如Smith-Waterman和Needleman-Wunsch,它们是Levenshtein的广义版本。
在不久的将来,我计划使其适用于任何数组,而不仅仅是字符串(字符数组)。