word2vecでニュース記事分類
word2vecの応用として文書分類,ここではニュース分類をやってみました. データはlivedoorニュースコーパスを使いました. あと,wikipediaのデータで学習させたモデルを使いました.
bag-of-wordsを用いた場合は以下で議論されています.
さて,今回はword2vecを使って文書分類に挑戦してみます. word2vecにより,単語空間は有限次元ベクトル空間で表現されています. 単語のベクトル表現をとし長さ1に正規化されているとします (正規化すると内積がcos類似度になる.特に正規化しなくてもよいと思うが念のため). さらに,文書のベクトル表現をとします. ここで,文書は単語を元に持つ集合(順序は考慮しない)とします.
さて,最もシンプルな文書ベクトルは以下のようになるだろう.
これをモデル1とする. 次に,以下のような重み付きバージョンを考える.
この重みには,例えばTFIDFやPMIなんかが使えると思う. ちなみに重みは足して1になるようにしておく.これをモデル2とする. 今回は,モデル1とモデル2を比較してみる.
モデル1はすぐに構築できるが,モデル2の重みを何にしようか迷う. 今回のタスクは文書分類なのだから,クラス分類において重要な単語には大きな重みをつけるべきだろう. そう考えると,以下の重み関数はどうだろうか.
ここでは,単語の文書における出現回数, はクラスで,は集合の要素数をさす. logの項はidfのクラス版で,その単語がいろんなクラスに出現するなら分母が大きくなり全体が小さくなる. 逆に,その単語があるクラスにしか出てこないならその単語の重みは大きくなる. これはあまりにもハードな重みな気がするが,とりあえずこれ(以下tficfと呼ぶ)を使ってみる.
さて,まずは文書を形態素解析するのだが(形態素解析を使わないバージョンは次に書こうと思う), 辞書には最近流行りのneologdを使う.
ライブドアニュースコーパスのディレクトリ構成は以下のようになっていることを想定.
なお,カテゴリ数は9で総文書数は7376であった. 分類器にはロジスティック回帰を用いた.
以下に実験結果を示す.
uniform | tficf |
---|---|
0.85 (0.01) | 0.52 (0.03) |
tficfが重み付けを行った結果だ.ものすごく悪い. 一方重み付けを行わないモデル (uniform) はかなりいい性能を発揮している. 重み付けによりここまで性能が落ちるとは思わなかった. 何かバグがないか追求してみるが,今のところword2vecで学習した単語空間をそのまま使っても特に問題はなさそうだ. それにしても上のqiitaの記事ではBOW+kNNというシンプルな組み合わせながら精度が89%と報告されている. これはおそらく文書分類というタスクでは,文書が多数の単語を含むのでBOWでも十分にそれを表現できているため,と解釈できる. 逆に,一つの文書が短かったり,単語そのものを分類しなければならないようなタスクでは,word2vecの真価が発揮されるのではないかと思う.
単語分類については以下に簡単な例がある.
実は,短い文書においては,TFICFの有効性を確認した.よって長い文書でも動くはずなのだが,今回は動かなかった. というわけでバグを探すのと,word2vecの他の応用も考えてみる. 実験に使ったコードはGistに置いておくので,気が向いたら試してみてください:
追記(2016/01/08):Word2Vecを使って文書分類器を構成するメリットは,単語と文書を同じ空間内で考えられること,だと後日思いました.