編集距離のライブラリ化
入力した単語と数万語の辞書とで総当りで編集距離を計算させてみたら,30秒以上掛かったので,cで書き直してライブラリ化してみた.
同じ処理で0.7秒前後まで縮まった.繰り返し使うなら,手間は掛かってもライブラリ化する価値はあるなあ.
参考にしたページ:
Ruby拡張ライブラリ作成チュートリアル
Rubyの拡張ライブラリの作り方 - アホメモ - Seesaa Wiki(ウィキ)
ただ,挙動を見ていると,編集距離ってナイーブすぎる気がする.
ぱっと思いつくのは,置き換える文字によって距離を変える(pとb,fとvの置換は距離0.7とする,母音同士の置き換えは距離0.5とする)とか脱落は追加より距離が小さい(distance(x,y)!=distance(y,x)となる可能性がある)とか.
編集距離
レーベンシュタイン距離または編集距離で検索をするとそのものズバリなWe retire raa.ruby-lang.orgが見つかる.
使い方は簡単:
require 'text' p Text::Levenshtein.distance( 'hello', 'hollow') #=> 2
2007-12-18 - 新言語 Xtalを作る日記から,丁稚な日々のゴルフサポート(goruby?)みたいにしたらどうか?と思って改造.
候補選択がバカすぎる.lengthの代わりにlenって打ったら,gemを呼び出すという恐ろしいことになった.打ち間違えても適当に補完して正しいメソッドを呼び出すというより,意図的に間違わない限り正しいメソッドを呼び出さない.
自分の足を撃ち抜きたい人向け.
require 'text/levenshtein' class Object def get_candidate( x, ys) return x if ys.index(x) ys.sort_by{|y| Text::Levenshtein.distance( x, y) }[0] end def method_missing m, *a, &b t = get_candidate(m.to_s, public_methods + private_methods) puts "[Did you mean: #{t}]" t ? __send__(t, *a, &b) : super end end a = %w[abc def hij klm] put a.siz #=>[Did you mean: size] #=>[Did you mean: puts] #=>4
追記:すでにやってる人がいたんですね→Matzにっき(2007-07-23)
ウィルス疑惑
念のために全ディスクを検索中だけど…
Jotti's malware scanでの検査結果:
I-worm/Nuwar.Lって出るのAVGだけだし誤検出で確定なような.
tccを動かすたびに,AVGを停止させているので不便でしょうがない.
もちろん,アンチウィルスソフトを止めるのは自己責任で.
tcc(2)
もしかして…と思ったら,やはりこれもコンパイルできない.
int main( void) { for(int i=0;i<10;i++) { printf("%d\n", i); } return 0; }
ANSI C grammar (Yacc)を見ると,forの初期化部には式だけで宣言は書けないことになってる.それが標準だったのか.
ちゃんとソースを読み込めば,そのくらいの拡張は簡単にできそうな気もするけど.
tcc
tccのnext_nomacro1を読んでいて気づいたんだけれど,
int foo; int main( void) { f\ o\ o = 1; printf("foo %d\n", foo); }
こんな書き方が許されていたのか…
以前にc.yを読んでいて気づいた変態的な書式
int main( void) { int i; for(i=0;i<5;i++) { for( static int j=0;j<i*2;j++) { printf("%d,%d\n", i,j); } } return 0; }
はコンパイルできなかった.
今日になって突然,tccでコンパイルした実行ファイルがウィルス認定を受けるようになってしまった.アンチウィルスソフトを変えないとダメかも.
vcでコンパイルしたtccは大丈夫だけど,そのtccでhello,world!とかをコンパイルしてもウィルス扱いされる.これが噂に聞くTrusting Trustアタックてやつ?