Damerau-Levenshtein distance Implementation

后端 未结 1 1419

I\'m trying to create a damerau-levenshtein distance function in JS.

I\'ve found a description off the algorithm on WIkipedia, but they is no implementation off it.

1条回答
  •  终归单人心
    2021-01-14 20:00

    The gist @doukremt gave: https://gist.github.com/doukremt/9473228

    gives the following in Javascript.

    You can change the weights of operations in the weighter object.

    var levenshteinWeighted= function(seq1,seq2)
    {
        var len1=seq1.length;
        var len2=seq2.length;
        var i, j;
        var dist;
        var ic, dc, rc;
        var last, old, column;
    
        var weighter={
            insert:function(c) { return 1.; },
            delete:function(c) { return 0.5; },
            replace:function(c, d) { return 0.3; }
        };
    
        /* don't swap the sequences, or this is gonna be painful */
        if (len1 == 0 || len2 == 0) {
            dist = 0;
            while (len1)
                dist += weighter.delete(seq1[--len1]);
            while (len2)
                dist += weighter.insert(seq2[--len2]);
            return dist;
        }
    
        column = []; // malloc((len2 + 1) * sizeof(double));
        //if (!column) return -1;
    
        column[0] = 0;
        for (j = 1; j <= len2; ++j)
            column[j] = column[j - 1] + weighter.insert(seq2[j - 1]);
    
        for (i = 1; i <= len1; ++i) {
            last = column[0]; /* m[i-1][0] */
            column[0] += weighter.delete(seq1[i - 1]); /* m[i][0] */
            for (j = 1; j <= len2; ++j) {
                old = column[j];
                if (seq1[i - 1] == seq2[j - 1]) {
                    column[j] = last; /* m[i-1][j-1] */
                } else {
                    ic = column[j - 1] + weighter.insert(seq2[j - 1]);      /* m[i][j-1] */
                    dc = column[j] + weighter.delete(seq1[i - 1]);          /* m[i-1][j] */
                    rc = last + weighter.replace(seq1[i - 1], seq2[j - 1]); /* m[i-1][j-1] */
                    column[j] = ic < dc ? ic : (dc < rc ? dc : rc);
                }
                last = old;
            }
        }
    
        dist = column[len2];
        return dist;
    }
    

    0 讨论(0)
提交回复
热议问题