vector space model by all kind of word

こんばんは。

今回はベクトル空間モデル(vector space model)について書きたいと思います。

なぜ、書くのか。それはわからないからです。

文書diを語の集合V={w1,…,wN}で特徴付けるとします。
ここまではわかります。そうすればdi, djがどれほど似ているか、を様々な類似度で計算ができます。
ここまでやってしまうと、あとは自然言語処理の研究とは別のものな気がします。
なので、 このVをどう決めるか, は大事な問題であるような気がします。
Vを決めたら次元が決まるので、次はその成分をどうするかを考えます。
ということで問題を設定しましょう。

1.文書をベクトルで表現する時、その次元数を決定する語の集合V={w1,…,wN}をどうやって決定するか。
2.決定したベクトル空間で、その成分をどう計算するか。

この問題を考えていきます。

次元数の決定(ボキャブラリーの決定)

次元数の決定に使う単語を以下、ボキャブラリーと呼びます。
僕が大事だと思うことを書きます。
文書diをベクトルviで表現するとします。
この時ある文書djのベクトル表現vjとvi次元は同じ でなければなりません。
実装することを考えてみると、これはちょいとややこしい問題です。
これを回避する策として思いついた4つを挙げて、この記事を閉じたいと思います。

文書集合に出現する単語をボキャブラリーにする

最も単純な方法。
文書集合をD={d1,…,d|D|}とします。
D中に出現した語の集合をボキャブラリーV={w1,…,wN}にします。(NはD中の後の異なり数)
これにより、diをそれぞれ共通の次元で表現できます。
めでたし、めでたし、としたいところですが、そうも行かない気がします。
例えばです。訓練文書の集合からボキャブラリーを決定します。そしてテスト文書djを分類するとき、
テスト文書djの中に、ボキャブラリーVに含まれない単語が含まれていたとします。
これ、どうしますか?
実装を考えると訓練文書集合とテスト文書集合で共通のボキャブラリーを作り、それを使うことになると思います。
まぁつまり、テスト文書集合が変わる度に学習が必要、かなりコストの高い話です。

動的にボキャブラリーを決定する。

文書集合をD={d1,…,d|D|}とします。
diに出現する単語集合Vi={w1,…,w|di|}でdiを特徴付けることにします。
(|di|は文書diの異なり語数)
例えばd1はV1で、d2はV2で特徴付けられています。
これで文書diをベクトルviで表現することができました。
しかし、お察しの通りvi, vj(i ≠ j)は次元が違います。これでは類似度が計算できません。
そこでVi ∩ Vjを新たなボキャブラリーとすることで共通の次元にできます。
実装を考えてみても、これは上ほどコストの高い話ではありません。

予めボキャブラリーを人出で決めておく

説明するまでもありませんね。
最もコストが低い方法です。

スコア上位単語をボキャブラリーとする。

score(wj)という関数を書き、その上位N単語をボキャブラリーにするという方法も考えられますね。

まとめ

とにかく文書をベクトルにする時、そのベクトルが共通の次元でなければなりません。
んー、正確には、類似度計算の時に共通であれば問題ないです。
そのためにはボキャブラリーを共通にしなければなりません。
計算量まで考えるとこれはなかなか深刻な問題なので記事にしました。
次回は実装をしてみたいと思います。
なかなかいい実装は思いついてないのですが、これからいろいろ調べたいと思います。

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中