まとめ

psi氏の元サイトでは20バイトでほぼ100%の成功率に飽和しているのに対して、私の実装では100バイトまで読んで99%なので、私のは辞書データもあまり良くないのかもしれない。青空文庫の文章は記号や数字はほとんど含まないし、カタカナも少ないと思われる。Wikipediaのほうが良さそう。

ちなみに、判定に失敗しているのは英文のサイトが多い。この文章を書いていて気がついたのだけど、私の実装では、判別関数の答えの選択肢の中にASCIIが入っていない。ASCIIをASCIIとして捕らえられれば成功率が一気に上がりそう。元サイトはそうしているのかな。それと、UTF-8の辞書データの見た目が結構元サイトと違う。私の辞書データが青空文庫から取ってきているので、記号やアルファベットがほとんど無く、カタカナも少ないことが影響しているかも。

異なるエンコード間での辞書の「形」の違いを保ったまま、特徴を上手く抽出してサイズを小さく出来れば良いのだけど。結局それは画像認識みたいな世界になってしまい、どんどんややこしくなってしまうのかもしれない。

追記:高次元行列の次元を、内積をあまり変えずに下げる、ランダムプロジェクションという方法があるそうだ。ただこれは判定対象の文字列にたいしても次元縮小の行列計算が必要なのでその行列を保持する必要がある。なので辞書サイズは小さくならないかな...。