2009/02/04(Wed)
ruby でレーベンシュタイン距離(編集距離)の計算
なんとなく暇だったので、ruby でレーベンシュタイン距離(編集距離)を求めるコードを書いてみた。編集距離とは、文字列間の類似度を求める方法のことらしいです。詳しくは、wikipedia:レーベンシュタイン距離を見てください。コードはこんな感じ↓。
# doctest: abc and abc # >> levenshtein_distance("abc", "abc") # => 0 # doctest: kitten and sitting # >> levenshtein_distance("kitten", "sitting") # => 3 # doctest: aaaaa and bbbbb # >> levenshtein_distance("aaaaa", "bbbbb") # => 5 def levenshtein_distance(str1, str2) col, row = str1.size + 1, str2.size + 1 d = row.times.inject([]){|a, i| a << [0] * col } col.times {|i| d[0][i] = i } row.times {|i| d[i][0] = i } str1.size.times do |i1| str2.size.times do |i2| cost = str1[i1] == str2[i2] ? 0 : 1 x, y = i1 + 1, i2 + 1 d[y][x] = [d[y][x-1]+1, d[y-1][x]+1, d[y-1][x-1]+cost].min end end d[str2.size][str1.size] end
で、、、この手のコードを書いたときに、ちょっとしたテストも書いときたいなあ、と思うんですよね。Python だと、doctest っていうコメントにテストを埋め込める便利なのがあるんですが、ruby にもないものかと思って探したらありました。rubydoctestってやつが。
sudo gem install rubydoctest
こんな感じ↑でインストールすると使えます。rubydoctest の書き方はここらへんにありました。実は冒頭のコードには既に rubydoctest 用のコメントを書いてあるので、test.rb って名前で保存して、こんな感じ↓でテスト。
/Users/kenkitii% rubydoctest test.rb === Testing 'test.rb'... OK | abc and abc OK | kitten and sitting OK | aaaaa and bbbbb 3 comparisons, 3 doctests, 0 failures, 0 errors
便利ですね。
トラックバック - http://d.hatena.ne.jp/kenkitii/20090204/ruby_levenshtein_distance
リンク元
- 22 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=AVj&q=虫愛でる姫君&btnG=検索&lr=lang_ja
- 15 http://images.google.co.jp/imgres?imgurl=http://f.hatena.ne.jp/images/fotolife/k/kenkitii/20080927/20080927021556.jpg&imgrefurl=http://d.hatena.ne.jp/kenkitii/20080927&usg=__0m9eBRLwnv8lWTeNfvd-RTgjw24=&h=1000&w=1000&sz=747&hl=ja&start=50&tbnid=BLTC5BQZW-
- 13 http://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rlz=1T4GGIH_jaJP248JP248&q=マイノリティーの拳
- 9 http://www.google.co.jp/search?hl=ja&lr=lang_ja&client=firefox-a&rls=org.mozilla:ja:official&hs=49E&q=macbook+hdd+交換+leopard&revid=222240382&sa=X&oi=revisions_inline&resnum=1&ct=broad-revision&cd=2
- 8 http://ezsch.ezweb.ne.jp/search/ezGoogleMain.php?query=AV女優+一覧&start-index=4&adpage=3&mode=02
- 7 http://www.google.com/search?hl=ja&lr=lang_ja&ie=UTF-8&oe=UTF-8&q=python+editor&num=50
- 6 http://d.hatena.ne.jp
- 6 http://reader.livedoor.com/reader/
- 6 http://www.google.com/reader/view/
- 5 http://perfume.tumblr.com/page/20
