文書分類器で単語分類をしてみる

keywords: 文書分類 (document classification), 単語分類(word classification), Pointwise mutual information

はじめに

文書へのラベリングと単語へのラベリングはどちらが簡単だろう? 例えば多くのニュースサイトではすでに文書は分類されている. しかし,単語が分類されているのは見たことがない. というより,そんなものを表に出してもあまり意味がないので表に出ていないのだろう. この状況を踏まえると,データをクロールする側からすると,ラベル付き文書データを入手するのは容易で, ラベル付き単語データを入手するのは困難だと言える.

いま,文書データをクロールして,検索エンジンを作ることを考えよう. 各文書にはラベルが付いている. このラベル情報を活かせないか? 例えばクエリにラベルが付いていれば,クエリと文書のラベルを見て,一致するものを出せばよい,あるいはそういう場合にスコアが高くなるように,検索エンジンのスコアを設計すれば良い. このように,単語へのラベリングはある程度需要があると推測される.

定式化

さて,今回やるのは,ラベル付き文書データを使って,単語分類をしようというもの. つまり,持っているものは,\{(d_i,y_i)\}_{i=1}^{n_d}\{w_i\}_{i=1}^{n_w}, ただし,d_i \in \mathcal{D}は文書,y_i \in \mathcal{Y}は文書に対するラベル, w_i \in \mathcal{W}は単語を意味する.

ここで,もし単語と文書が同じ空間に存在すれば,文書分類器を使って単語分類ができると思われる. つまり,\mathcal{S}=\mathcal{D}=\mathcal{W}とし,なんらかの変換\phi:\mathcal{S} \rightarrow \mathcal{X}を定義すればよい. ここまで来れば,x_i=\phi(d_i) \ \forall i=1,\ldots,n_d, \ x_{n_w+j}=\phi(w_j) \ \forall j=1,\ldots,n_wとし, \{(x_i,y_i)\}_{i=1}^{n_d}\{x_i\}_{i=n_d}^{n}を得る.ただしn=n_d+n_w. こうして見てみると,単語と文書を同じ空間に写像すれば,これは半教師付き分類問題に帰着することがわかる.

簡単のために,\mathcal{X}=\mathbb{R}^d, \ \mathcal{Y}=\{1,\ldots,c\}とする. 今回は,「文書は単語の線形結合で表される」という仮定を置いてみる.つまり,

d=\sum_{i=1}^{n_w} \alpha^{(d)}_i w_i, \ \alpha^{(d)}_i \in \mathbb{R} \ \forall_i=1,\ldots,n_w

となる.さらに,「\phiは線形写像である」という仮定を置くと,

\phi(d)=\sum_{i=1}^{n_w} \alpha^{(d)}_i \phi(w_i)

となる.というわけで,\phiではなくて,コーパスから\{\phi(w_i)\}_{i=1}^{n_w}を学習することにする.

さて,やらなければならないのは,

  1. コーパスから\{\phi(w_i)\}_{i=1}^{n_w}を学習する
  2. \alphaの決定

である.だいぶシンプルになったな.1に関しては死ぬほど研究されているので,その中から適用な手法を使うことにする. ここでは,PPMIを使って単語ベクトルを決定してみる.この辺は特に珍しくもないので,例えば以下を参照してください.

残る問題は2だ.とりあえずシンプルさを追求して,単語の出現回数を使うことにする.つまり,\alpha^{(d)}_i=c(w_i,d)とする. ただし,c(w_i,d)は,文書dにおける単語w_iの出現回数である. これで全ての問題が一応解決した.さあ,あとは実装するだけ.

実装

コードは後日載せます. やっていることは,PPMIを要素とした単語-文脈行列を作り,その各行を単語ベクトルとします. あとは↑の定式化通りに文書ベクトルを生成し,文書分類器を作ります. その後,単語ベクトルたちを分類器にかけます. 文書分類器には,ロジスティック回帰(sklearn.linear_model.LogisticRegressionCV)を用います. デフォルト設定です(アプローチの可能性を見たいだけなので).

実験

データはnaverまとめからクロールしたものを使う. カテゴリとそれに対応するクロールした文書数を以下の表に示す. これが今回の訓練データ.

カテゴリ 文書数
ガールズ 600
ニュース・ゴシップ 976
エンタメ・カルチャー 480
おでかけ・グルメ 867
暮らし・アイデア 737
レシピ 702
カラダ 708
ビジネススキル 558
IT・ガジェット 231
デザイン・アート 479
雑学 667
おもしろ 584
定番 257

総異なり語数は14767件で,これが今回の分類対象となる. さて,結果はただ単語を羅列してもおもしろくないので,wordcloudを使おうと思う. これについては以下を参考にしました,ありがとうございます.

ガールズ

girls.png

ニュース・ゴシップ

news.png

エンタメ・カルチャー

entertainment.png

おでかけ・グルメ

spot.png

暮らし・アイデア

life.png

レシピ

recipe.png

カラダ

wellness.png

ビジネススキル

business.png

IT・ガジェット

tech.png

デザイン・アート

design.png

雑学

trivia.png

おもしろ

humor.png

定番

該当単語なし

おわりに

今回はラベル付き文書データから文書分類器を学習し,それを単語分類に使用してみた. 結果は定性的に測るしかないが,うまくいっているところはあるのでアプローチは悪くないのかなと思う. 定番に該当がないのは定番だからなのだろうか?笑 ただ,もっと分類器をチューニングしたほうが良い気がする. いまはただロジスティック回帰にぶん投げているだけなので.

次回は,教師あり次元削減,具体的にはFisher Discriminant Analysis (FDA)をかけてみます. いまは生の単語-文脈行列を使っているので,情報をもっと圧縮させて次元を削減しようと思います. さらに,教師ありデータを使うことで,同じラベルを持つものは近くなり,異なるラベルを持つものは遠くなるよう次元削減後の空間を学習します(正確には射影行列). まぁとりあえずいいんではなかろうか.

文書分類器で単語分類をしてみる」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中