TinySegmenter の学習モデルを自分でも作りたい

TinySegmenterjavascript だけで作られたコンパクトな分かち書き。これの学習機能は公開されていない。
いったいどうやってあの学習データを作ったのか。


とりあえず本家の説明を読んでみる。

機械学習を使うえでも、できあがったモデルのコンパクトさが重要になります。 SVMや Naive Bayes(ベイジアンフィルター)といった機械学習アルゴリズムを使うことは可能ですが、これらが出力するモデルはコンパクトではありません。一方、冗長な特徴量を極力使わずにモデルをコンパクトに表現できるトリックにL1ノルム正則化があります。 L1ノルム正則化もいろいろなアルゴリズムがありますが(たとえばLog-Linearだとこれ)、 TinySegmenterは、実装も容易でモデルの圧縮率もいいBoostingを使っています。

・・・・・、えーと、日本語でおkwww
⑨な私にはさっぱりわけわかんねー。

悔しいのでビクンビクンしながら調べてみる。

Boosting(ブースティング)
http://ja.wikipedia.org/wiki/%E3%83%96%E3%83%BC%E3%82%B9%E3%83%86%E3%82%A3%E3%83%B3%E3%82%B0

ブースティング(英: Boosting)とは、教師あり学習を実行するための機械学習メタアルゴリズムの一種。ブースティングは、Kearns の提示した「一連の弱い学習機をまとめることで強い学習機を生成できるか?」という疑問に基づいている[1]。弱い学習機は、真の分類と若干の相関のある分類器と定義される。対照的に、強い学習機とは真の分類とよく相関する分類器である。

あーなんか、分かった気がしたゾ。

ようするに同じデータを別々のアルゴリズムで計算させて結果を比較するようなもんかな。
両者が同時に間違う確立は低いから、これをやればほぼ間違いない。

コレと同じように、複数の学習機で判定した結果を寄せ集めれば、すべてがすべて同じ間違いをするわけではないので、より間違いが少ない結果を返すことができるわけね。
仮にある学習機が間違った結果を返したとしても、他の学習機が正しい答えを返してくれれば、間違った結果は薄められて、より正しい結果だけが残ると。なるほどね。

TinySegmenter が後半のループの中でスコア計算をしていたるのはこれなのかなぁと。
ようは単語がここできられるかを複数の学習機で学習させた結果を集めて、総合的に判別したわけかな。

学習機は、たぶん mecabとかで正しい形態素解析を行った教師データを元にして、単語が切られていればプラス。切られていなければプラスとかにしたんだと思う。(作者は同じ方だし、、、)

TC2__["HII"] とかは、 正規表現によって、漢字だったら H 、ひらがなだったら I になる。
このTC2__["HII"]は、漢字ひらがなひらがなの組み合わせだったらこのスコア(スコアがマイナスなら切れてない。プラスだったら切れてる)を返しているのかな。

後半部分の TW1__["東京都"] は分類ではなくてよく文字列が分割されたりされなかったりする単語を抜き出したんだと思う。

なるほど、確かに一つ一つを見ると非常に単純な結果を返す「弱い学習機」なんだな。。。
ただし、これを束ねることで強力な学習機になると、、、なるほど。。。すげぇーな。