エンコード判定機

飲み会の話題にて。なんか、文字エンコード判定がしょぼくてどうこうというはなし。世の中のエンコード判定がどうなってるのか知らないけど、ルールベースでそのエンコードの範囲からはずれたら false とかしてるのかな。でも、やっぱりそこは、入力文字列: sエンコード: e に対して、 \arg\max_{e}P(e|s) = \arg\max_{e}P(s|e)P(e) なんてな方法で。N-gram 使って、データが長ければ適当にサンプリングすれば OK。

ということで、byte bigram、P(\mathrm{sjis})=P(\mathrm{euc})=P(\mathrm{utf8})(いいかげん)でそこら辺に落ちてた IRC のログをつかって学習。ひらがなはけっこう簡単に判別できる。出現頻度の低い文字列がダメで、「魑魅魍魎」を判定できなかった。ごちゃごちゃいじったが、結局 byte bigram が文字 unigram 程度の効果しかないのがあれだ。なんか悔しいので、trigramにしたらきれいに判定できるようになりましたと。代わりに係数データが 100 MB 超えて、なんか悲しい。疎行列として扱わないとダメですね。しかし、上の単語はトレーニングセット中に偶然出てきたので良かったが、未知熟語には弱そうだなぁとかそんな感じ。