私の実装と、計算結果

データ取得

日本語の辞書データ作成のための素材は青空文庫からダウンロードした。
aozoraget.rb

ASCIIは、以下のサイトからrfcのデータ(RFCs 5001-5500)をダウンロードし、解凍。
http://www.rfc-editor.org/download.html

辞書データ作成

青空文庫の元データがSHIFT JISなので、そこからRubyのiconvで他のエンコード(EUC-JP, UTF-8, ISO-2022-JP (JIS))のテキストを作成した。iバイト目と(i+1)バイト目の相関図を作り規格化して保存。
aozora.rb

ASCIIデータも解析。
rfcascii.rb

日本語の辞書データからASCIIのデータを差し引く。(ASCIIで0でない値を持つ点を、日本語データではすべて0にする)。
subtract.rb

テスト

テスト用のテキストデータはGoogleの検索結果(日本語サイト限定;ただし時々英文が混じる)からのリンク先HTMLを取得。webget.rb
例えば

ruby webget.rb AKB48
でAKB48の検索結果を200件保存。

metaタグで文字コードが指定されていないHTMLは除外し、指定された文字コードを正解として、プログラムが推定した文字コードと比べる。読み込みバイト数(非ASCII)は100バイトにした。ASCIIが多い/テキストが短いという理由で100バイト非アスキー文字を読めないケースがあるが、そういうケースは除外してから失敗率を計算した。*1
encode_test.rb



失敗率は、1.1%であった。

*1:ちなみに100バイトまで読めないうちにファイルの終わりに達してしまうケースがこの記事の後半の最適化では増えてくる。ちょっと考えても原因は不明。