我被告知Levenshtein距离是对称的。当我使用google的diffMatchPatch工具来计算Levenshtein距离时,其结果并不意味着Levenshtein距离是对称的。即Levenshtein(x1,x2)不等于Levenshtein(x2,x1)。 Levenshtein是不对称的还是特定实现存在问题?感谢。
答案 0 :(得分:13)
只要看一下基本算法,它肯定是对称的给定相同的操作成本 - 从单词A到单词B的添加,删除和替换的数量是相同的从单词B到单词A。
如果在任何操作上有不同的成本,则可能存在差异,例如如果加法的成本为2,并且从Zombie
到Zombies
的删除成本为1,则距离为2,反之则为1 - 不对称。
答案 1 :(得分:8)
经典的Levenshtein算法是对称的 - 从x1到x2的插入是从x2到x1的删除。
不幸的是,算法是O(长度(x1)*长度(x2))。在简要了解谷歌的库后,似乎尝试了一些启发式方法来确保运行时不会太大。我认为存在差异。
答案 2 :(得分:4)
是的,levenshtein距离是正确意义上的距离,即dist(a,b)==dist(b,a)
是距离定义的一部分。如果函数没有此属性,则它不是距离函数。这表明该实施存在问题。
答案 3 :(得分:-1)
请遵循我自己实现的代码 public class ReadTextFile {
static void readFile(String filepath){
CharSequence sequence1 = null;
CharSequence sequence2 = null;
int levenshteinDistance = 0;
String line1 = "";
String line2 = "";
int minLevenshteinDistance = -1;
try {
BufferedReader br = new BufferedReader(new FileReader(filepath));
String line = "";
while((line=br.readLine())!=null)
{
if(sequence1==null){
line = line.split(" ")[1];
sequence1 = line;
if((line=br.readLine())!=null){
line = line.split(" ")[1];
sequence2 = line;
}
}else{
sequence1 = sequence2;
line = line.split(" ")[1];
sequence2 = line;
}
if(null!=sequence1 && null!=sequence2){
levenshteinDistance = StringUtils.getLevenshteinDistance(sequence1,sequence2);
if(minLevenshteinDistance==-1){
minLevenshteinDistance = levenshteinDistance;
line1= sequence1.toString();
line2= sequence2.toString();
}else if(levenshteinDistance < minLevenshteinDistance){
minLevenshteinDistance = levenshteinDistance;
line1= sequence1.toString();
line2= sequence2.toString();
}
}
}
br.close();
System.out.println("line1 "+line1);
System.out.println("line2 "+line2);
System.out.println("minlevenshteinDistance "+minLevenshteinDistance);
}catch (IOException e) {
System.out.println(e.getMessage());
}
}
}