function levenshtein(s1, s2, cost_ins, cost_rep, cost_del)
{
if (typeof cost_ins == "undefined") cost_ins = 1;
if (typeof cost_rep == "undefined") cost_rep = 1;
if (typeof cost_del == "undefined") cost_del = 1;
var l1 = s1.length, l2 = s2.length;
var p1, p2, tmp, i1, i2, j1, j2, cp1, cp2, c0, c1, c2, ch1, ch2;
if (l1 == 0) {
return l2 * cost_ins;
}
if (l2 == 0) {
return l1 * cost_del;
}
p1 = new Array(l2 + 1);
p2 = new Array(l2 + 1);
for (i2 = 0; i2 <= l2; i2++) {
p1[i2] = i2 * cost_ins;
}
for (i1 = 0, j1 = 0; i1 < l1; i1++) {
p2[0] = p1[0] + cost_del;
for (i2 = 0, j2 = 0; i2 < l2; i2++) {
c0 = p1[i2] + (s1.charAt(i1) == s2.charAt(i2) ? 0 : cost_rep);
c1 = p1[i2 + 1] + cost_del;
if (c1 < c0) {
c0 = c1;
}
c2 = p2[i2] + cost_ins;
if (c2 < c0) {
c0 = c2;
}
p2[i2 + 1] = c0;
}
tmp = p1;
p1 = p2;
p2 = tmp;
}
c0 = p1[l2];
return c0;
}
2009年07月13日
PHP の levenshtein を JavaScript に移植
海外にも JavaScript でレーベンシュタイン距離を計算するソースコードはいくつか見つかったんだけど、挿入、置換、削除のコストをそれぞれ指定できるようになっているソースは見つからなかったのでこれもPHPのソースコードを参照してそのまま移植。
PHP の similar_text を JavaScript に移植
PHPのソースコードを参照してそのまま移植したコード。
サーバサイドでやらなくてもいいようなケースに遭遇したら、
この負荷をクライアント側にやらせられるのはわりと意味があると思う。
サーバサイドでやらなくてもいいようなケースに遭遇したら、
この負荷をクライアント側にやらせられるのはわりと意味があると思う。
function similar_text(text1, text2)
{
function similar_char(text1, len1, text2, len2)
{
function similar_str(text1, len1, text2, len2)
{
var pos1 = 0, pos2 = 0, max = 0, i, j, l;
for (i = 0; i < len1; ++i)
{
for (j = 0; j < len2; ++j)
{
for (l = 0; (i + l < len1)&&(j + l < len2)&&
(text1.charAt(i+l) == text2.charAt(j+l)); ++l);
if (l > max)
{
max = l;
pos1 = i;
pos2 = j;
}
}
}
return {
'pos1': pos1,
'pos2': pos2,
'max': max
};
}
var r = similar_str(text1, len1, text2, len2);
var sum = r.max;
if (sum)
{
if (r.pos1 && r.pos2)
{
sum += similar_char(text1, r.pos1, text2, r.pos2);
}
if((r.pos1 + r.max < len1)&&(r.pos2 + r.max < len2))
{
sum += similar_char(
text1.substr(r.pos1 + r.max),
len1 - r.pos1 - r.max,
text2.substr(r.pos2 + r.max),
len2 - r.pos2 - r.max);
}
}
return sum;
}
var sim = similar_char(text1, text1.length, text2, text2.length);
return {
'similar': sim,
'percent': sim * 200.0 / (text1.length + text2.length)
};
}
2009年05月13日
CompactFMプラグイン「PlayingTitleGetter」を用いて foobar2000 のタイトル情報を反映させる方法について
CompactFM 用プラグイン PlayingTitleGetter は、CompactFM でラジオを配信中に WindowsMediaPlayer/Winamp/iTunes/Lilith で再生中のタイトル情報をタグとして送信するためのものです。
CompactFM ユーザさんからの要望で「foobar2000 のタイトル情報取得に対応して欲しい」との話があったので、その周辺の話を書いておきます。
続きを読む
CompactFM ユーザさんからの要望で「foobar2000 のタイトル情報取得に対応して欲しい」との話があったので、その周辺の話を書いておきます。
続きを読む
2009年05月10日
CompactFMのバグを修正
DJ名が表示されないバグレポートがあったため、修正版をリリースしました。
以前の仕様変更で x-ladio-info のみになっていたらしいのが原因でした。
以前の仕様変更で x-ladio-info のみになっていたらしいのが原因でした。