Levenshtein距离对称?

时间:2012-03-15 14:39:04

标签: algorithm levenshtein-distance

我被告知Levenshtein距离是对称的。当我使用google的diffMatchPatch工具来计算Levenshtein距离时,其结果并不意味着Levenshtein距离是对称的。即Levenshtein(x1,x2)不等于Levenshtein(x2,x1)。 Levenshtein是不对称的还是特定实现存在问题?感谢。

4 个答案:

答案 0 :(得分:13)

只要看一下基本算法,它肯定是对称的给定相同的操作成本 - 从单词A到单词B的添加,删除和替换的数量是相同的从单词B到单词A。

如果在任何操作上有不同的成本,则可能存在差异,例如如果加法的成本为2,并且从ZombieZombies的删除成本为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());
    }

}

}