计算字符串间相似性的Java最佳算法
我有大量来自不同来源的文件,我想使用元数据对双重文件进行分类。为了找到拼写不同的重复项,例如关于字母如ä、é或缺少逗号等的重复项,我想计算字符串的相似性,并报告那些超过适当阈值的重复项。有人能推荐一个好的算法来进行比较吗 对于这种情况,Levenshtein算法是最好的,因为它是将一个单词更改为另一个单词所需的最小单字符编辑数,因此返回一个对字符串长度敏感的整数 für和for之间的距离为1 这将让您在相同长度的两个单词之间找到n个字符的差异 还有三元比较和Jaro-Winkler算法,它们返回的阈值比简单的距离要多 Levenshtein算法:计算字符串间相似性的Java最佳算法,java,Java,我有大量来自不同来源的文件,我想使用元数据对双重文件进行分类。为了找到拼写不同的重复项,例如关于字母如ä、é或缺少逗号等的重复项,我想计算字符串的相似性,并报告那些超过适当阈值的重复项。有人能推荐一个好的算法来进行比较吗 对于这种情况,Levenshtein算法是最好的,因为它是将一个单词更改为另一个单词所需的最小单字符编辑数,因此返回一个对字符串长度敏感的整数 für和for之间的距离为1 这将让您在相同长度的两个单词之间找到n个字符的差异 还有三元比较和Jaro-Winkler算法,它们返回
import std.stdio, std.algorithm;
int distance(in string s1, in string s2) pure nothrow {
auto costs = new int[s2.length + 1];
foreach (immutable i; 0 .. s1.length + 1) {
int lastValue = i;
foreach (immutable j; 0 .. s2.length + 1) {
if (i == 0)
costs[j] = j;
else {
if (j > 0) {
int newValue = costs[j - 1];
if (s1[i - 1] != s2[j - 1])
newValue = min(newValue, lastValue, costs[j]) + 1;
costs[j - 1] = lastValue;
lastValue = newValue;
}
}
}
if (i > 0)
costs[$ - 1] = lastValue;
}
return costs[$ - 1];
}
希望这比前面的答案更能帮助你,我正在努力变得更好。我将从levenshtein距离开始,然后从那里开始工作,只需从java.text.Normalizer开始分解重音,并将非重音字母保留到e即可。soundex用于类似的发音名称,但语言特定,imho不太令人满意。首先,该解释不完全正确,因为返回值远不止-1、0、1;其次,这对OP没有帮助,因为它根本不会产生合适的阈值来操作。