JavaScriptでレーベンシュタイン距離を求めるプログラムを書いてみたので、ここにメモしておきます。レーベンシュタイン距離とは、文字列同士の編集距離を表します。スペルチェックなどにも用いられるものです。
参考) レーベンシュタイン距離(Wikipedia)(英語版)
#!/usr/bin/env rhino // レーベンシュタイン距離を求める関数 function calcDist(a, b) { if (a == b) return 0; if (a.length == 0) return b.length; if (b.length == 0) return a.length; var matrix = new Array(a.length + 1); for (var i = 0; i <= a.length; i++) matrix[i] = new Array(b.length + 1); for (var i = 0; i <= a.length; i++) matrix[i][0] = i; for (var j = 0; j <= b.length; j++) matrix[0][j] = j; for (var i = 1; i <= a.length; i++) { for (var j = 1; j <= b.length; j++) { var x = a[i - 1] == b[j -1] ? 0 : 1; matrix[i][j] = Math.min( matrix[i - 1][j] + 1, matrix[i][j - 1] + 1, matrix[i - 1][j- 1] + x ); } } return matrix[a.length][b.length]; } // --- // テスト var base = "今日は猫がよくなく。"; var list = [ base, "こたつで猫が丸くなる。", "今猫がなく。", "昨日は猫がよくないた。", "今日は孫がよくなく。", "昨日孫の調子がよくなく。", "イタリアにも猫がよくいる。" ]; list.sort(function (a, b) { return calcDist(base, a) - calcDist(base, b); }); for (var i in list) { var dist = calcDist(base, list[i]); print(dist + "\t" + list[i]); }
実行結果:
0 今日は猫がよくなく。 1 今日は孫がよくなく。 3 昨日は猫がよくないた。 4 今猫がなく。 5 昨日孫の調子がよくなく。 6 こたつで猫が丸くなる。 8 イタリアにも猫がよくいる。