mots quotidiens. | |
Daichi Mochihashi (持橋大地) daichi <at> ism.ac.jp | by hns, version 2.10-pl1. |
|
|||||||||||||||||||||||||||||||||||||||||||||||||
小町君のブログから来ている人が沢山いるようなので,
もし「日本語の文字が全部等確率」というのが気になった人がいたら, そうではない
ので安心して下さい, ということだけ書いておきます。
正確には文字の生起確率=文字1-gramのさらに事前分布が均一になっているという
意味で, どんな漢字や数字が出やすいか(文字1-gram), どんな文字の組み合わせが
単語になりやすいか(文字2-gram, 3-gram, 4-gram, …)はすべてモデル化されて
います。
なお, 発表では言わなかったのですが, 後ろ向き変数βを同様に導入すれば,
文字の間が切れる周辺確率も計算することが可能なはずで
*1
, 工藤君が前に出した
「ソフト分かち書き」
を, 今度は一切辞書等を使わずに実現することができると思います。
形態素解析が切れる/切れないの二値ではなく, 確率的であるべきだというのは,
工藤君の話と独立に僕もずっと思っていて,
今回それを生成モデルの立場から実現できて嬉しく思っています。
その日は東京の実家に泊まったら, 冷蔵庫のホワイトボードに
"flammable rubbish" とか書いてあって驚いた。ちょw
「燃えるゴミの日」という意味だと思うけど, パパン, あなた日本人でしょ‥(笑)。
今回の僕の話はディリクレ過程混合モデルでDMを推定する, という話
ですが, 結局Blei(2004)のDP混合モデルの変分ベイズ法をそのまま使った
感じになってしまったので, 正直書くのがかなり欝でした。
まぁDMをDPでやるという穴を埋めたかったのですが, かなり反省。
もちろん, 最適な混合数の所にEMを回すと収束するというのは面白いのですが,
「そんなの自明じゃん」というのはわかっておりますので.. という感じ。
実は, Blei(2004)を理解するためには, 測度論→DP→HDPと全部理解して,
さらに Ishwaran and James (2001)にも依存していて変分ベイズも使って..
と理解できる前には果てしなく長く思えた道のりがあったのに, 理解できてみると
すごい自明で, それ以上拡張もできなかったという話。うーん。
とはいえ, DPの話はずっと興味を持っていて時間を使っていたことでは
あるので, これでとりあえずは切りが付いたかなと。
このプログラムを使うと, 任意のテキストを真っ白に変換できる。
~/atelier/white% echo "Hello, world." | whiten > hello.white
とすると,
驚きの白さに!(ぉ
Hello, world.中身は予想通りで, 下のような感じで簡単に書けます。
/* * whiten.c * Mon Mar 20 16:18:15 JST 2006 dmochiha <at> slc.atr.jp * */ #include <stdio.h> #define white "\x20" #define WHITE "\xa1\xa1" #define BITS(c,n) ((c & (1 << n)) >> n) int main (int argc, char *argv[]) { int i, b, c; while ((c = getchar()) != EOF) { for (i = 0; i < 8; i++) { if ((b = BITS(c, i)) == 0) printf(white); else printf(WHITE); } } exit(0); }unwhite.c:
/* * unwhite.c * Mon Mar 20 16:34:50 JST 2006 dmochiha <at> slc.atr.jp * */ #include <stdio.h> #define SETBIT(c,n) (c |= 1 << n) int main (int argc, char *argv[]) { char b = 0; int c, i = 0; while ((c = getchar()) != EOF) { switch (c) { case 0x20 : break; case 0xa1 : SETBIT(b, i); c = getchar(); break; default : fprintf(stderr, "error: c = %d\n", c); exit(1); } if (i == 7) { putchar(b); b = 0; i = 0; } else i++; } exit(0); }0->半角スペース, 1->全角スペースなので, jpegや圧縮ファイルなどは 平均的にはほぼ(8+16)/2=12倍になります。 ちょっと面白かったのは, テキストなどは0が多いので10倍くらいなのかなと思っていたところ, せいぜい11倍くらいだったという結果。意外と1が多い。 man ascii すると, 英小文字はcharの後ろの方に割り当てられている ので, 比較的1が多いのだろう, という話でした。
タイトル一覧 |