计算字符串间相似性的Java最佳算法

计算字符串间相似性的Java最佳算法,java,Java,我有大量来自不同来源的文件,我想使用元数据对双重文件进行分类。为了找到拼写不同的重复项,例如关于字母如ä、é或缺少逗号等的重复项,我想计算字符串的相似性,并报告那些超过适当阈值的重复项。有人能推荐一个好的算法来进行比较吗 对于这种情况,Levenshtein算法是最好的,因为它是将一个单词更改为另一个单词所需的最小单字符编辑数,因此返回一个对字符串长度敏感的整数 für和for之间的距离为1 这将让您在相同长度的两个单词之间找到n个字符的差异 还有三元比较和Jaro-Winkler算法,它们返回

我有大量来自不同来源的文件,我想使用元数据对双重文件进行分类。为了找到拼写不同的重复项,例如关于字母如ä、é或缺少逗号等的重复项,我想计算字符串的相似性,并报告那些超过适当阈值的重复项。有人能推荐一个好的算法来进行比较吗

对于这种情况,Levenshtein算法是最好的,因为它是将一个单词更改为另一个单词所需的最小单字符编辑数,因此返回一个对字符串长度敏感的整数

für和for之间的距离为1

这将让您在相同长度的两个单词之间找到n个字符的差异

还有三元比较和Jaro-Winkler算法,它们返回的阈值比简单的距离要多

Levenshtein算法:

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没有帮助,因为它根本不会产生合适的阈值来操作。