Skip to content

Instantly share code, notes, and snippets.

@tjcelaya
Created February 27, 2016 00:26
Show Gist options
  • Save tjcelaya/c5cc3599e7a4eae15fd0 to your computer and use it in GitHub Desktop.
Save tjcelaya/c5cc3599e7a4eae15fd0 to your computer and use it in GitHub Desktop.
function leven(a, b){if(a.length == 0) return b.length; if(b.length == 0) return a.length; var matrix = []; /* increment along the first column of each row */ var i; for(i = 0; i <= b.length; i++){matrix[i] = [i]; } /* increment each column in the first row */ var j; for(j = 0; j <= a.length; j++){matrix[0][j] = j; } /* Fill in the rest of the matrix */ for(i = 1; i <= b.length; i++){for(j = 1; j <= a.length; j++){if(b.charAt(i-1) == a.charAt(j-1)){matrix[i][j] = matrix[i-1][j-1]; } else {matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, /* substitution */ Math.min(matrix[i][j-1] + 1, /* insertion */ matrix[i-1][j] + 1)); /* deletion */ } } } return matrix[b.length][a.length]; }
function cross(l1, l2, fn) { return l1.map(function (v1) { return l2.map(function (v2) { return fn(v1, v2); }) }) }
function zip(l1, l2) { var shorter = l1.length < l2.length ? l1 : l2; return shorter.map(function (v, k) { return [l1[k], l2[k]] }) }
function minIdx(l) { return l.indexOf(Math.min.apply(null, l)) }
/* throw away the "tags" */
/* $('font').remove() */
components = ["words", "and", "more words"]
var termsWithDistances;
(termsWithDistances = zip(components, cross(components, components, leven)))
.map(function (v, k, arr) { return [v[0], arr[minIdx(v[1])][0]] })
.reduce(function (m, e, i, arr) { m[e[0]] = e[1]; return m }, {})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment