私の実装と、計算結果
データ取得
日本語の辞書データ作成のための素材は青空文庫からダウンロードした。
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:ちなみに100バイトまで読めないうちにファイルの終わりに達してしまうケースがこの記事の後半の最適化では増えてくる。ちょっと考えても原因は不明。