文書分類器で単語分類をしてみる
keywords: 文書分類 (document classification), 単語分類(word classification), Pointwise mutual information
はじめに
文書へのラベリングと単語へのラベリングはどちらが簡単だろう? 例えば多くのニュースサイトではすでに文書は分類されている. しかし,単語が分類されているのは見たことがない. というより,そんなものを表に出してもあまり意味がないので表に出ていないのだろう. この状況を踏まえると,データをクロールする側からすると,ラベル付き文書データを入手するのは容易で, ラベル付き単語データを入手するのは困難だと言える.
いま,文書データをクロールして,検索エンジンを作ることを考えよう. 各文書にはラベルが付いている. このラベル情報を活かせないか? 例えばクエリにラベルが付いていれば,クエリと文書のラベルを見て,一致するものを出せばよい,あるいはそういう場合にスコアが高くなるように,検索エンジンのスコアを設計すれば良い. このように,単語へのラベリングはある程度需要があると推測される.
定式化
さて,今回やるのは,ラベル付き文書データを使って,単語分類をしようというもの. つまり,持っているものは,と, ただし,は文書,は文書に対するラベル, は単語を意味する.
ここで,もし単語と文書が同じ空間に存在すれば,文書分類器を使って単語分類ができると思われる. つまり,とし,なんらかの変換を定義すればよい. ここまで来れば,とし, とを得る.ただし. こうして見てみると,単語と文書を同じ空間に写像すれば,これは半教師付き分類問題に帰着することがわかる.
簡単のために,とする. 今回は,「文書は単語の線形結合で表される」という仮定を置いてみる.つまり, となる.さらに,「は線形写像である」という仮定を置くと, となる.というわけで,ではなくて,コーパスからを学習することにする.
さて,やらなければならないのは,
-
コーパスからを学習する
-
の決定
である.だいぶシンプルになったな.1に関しては死ぬほど研究されているので,その中から適用な手法を使うことにする. ここでは,PPMIを使って単語ベクトルを決定してみる.この辺は特に珍しくもないので,例えば以下を参照してください.
残る問題は2だ.とりあえずシンプルさを追求して,単語の出現回数を使うことにする.つまり,とする. ただし,は,文書における単語の出現回数である. これで全ての問題が一応解決した.さあ,あとは実装するだけ.
実装
実験
データはnaverまとめからクロールしたものを使う. カテゴリとそれに対応するクロールした文書数を以下の表に示す. これが今回の訓練データ.
カテゴリ | 文書数 |
---|---|
ガールズ | 600 |
ニュース・ゴシップ | 976 |
エンタメ・カルチャー | 480 |
おでかけ・グルメ | 867 |
暮らし・アイデア | 737 |
レシピ | 702 |
カラダ | 708 |
ビジネススキル | 558 |
IT・ガジェット | 231 |
デザイン・アート | 479 |
雑学 | 667 |
おもしろ | 584 |
定番 | 257 |
総異なり語数は14767件で,これが今回の分類対象となる. さて,結果はただ単語を羅列してもおもしろくないので,wordcloudを使おうと思う. これについては以下を参考にしました,ありがとうございます.
ガールズ
ニュース・ゴシップ
エンタメ・カルチャー
おでかけ・グルメ
暮らし・アイデア
レシピ
カラダ
ビジネススキル
IT・ガジェット
デザイン・アート
雑学
おもしろ
定番
おわりに
今回はラベル付き文書データから文書分類器を学習し,それを単語分類に使用してみた. 結果は定性的に測るしかないが,うまくいっているところはあるのでアプローチは悪くないのかなと思う. 定番に該当がないのは定番だからなのだろうか?笑 ただ,もっと分類器をチューニングしたほうが良い気がする. いまはただロジスティック回帰にぶん投げているだけなので.
次回は,教師あり次元削減,具体的にはFisher Discriminant Analysis (FDA)をかけてみます. いまは生の単語-文脈行列を使っているので,情報をもっと圧縮させて次元を削減しようと思います. さらに,教師ありデータを使うことで,同じラベルを持つものは近くなり,異なるラベルを持つものは遠くなるよう次元削減後の空間を学習します(正確には射影行列). まぁとりあえずいいんではなかろうか.