共起行列の作成 scipy.sparse.coo_matrix

単語の共起行列をコーパスから作成する手順を紹介する.共起行列はスパースなので,scipy.sparse.coo_matrixを使って実装する.これにより大幅にメモリを削減できる.なお,英語以外のコーパスの使用を考えて文字列は全てUnicodeで処理する.

こんな感じになりました.一応,共起行列の行と列が何を指しているのか知りたいと思うのでvocaburaryも返しています.tokenizerは実装して渡してあげてください.generatorでかまわないです.window_sizeは普通乱数を足したり引いたりすると思うのでそれはお任せします.

Gistで載せたコード,綺麗だ〜〜〜〜.

広告

単語は不連続変数だけど,連続変数として考えたいんだ

一般に,単語は不連続変数だと考えられていると思う. なぜなら,例えアルファベット順に並べたとしても,”a”という単語と”b”という単語の間が定義できないからだ. なので単語wの生起確率p(w)を考えるとき,パラメトリックモデルを使うなら, 不連続型のモデル(例えば多項分布)を考えてそのパラメータを最尤推定することが多いと思う. なんとなくのイメージだが,不連続型のモデルの推定の方が,連続型より難しい気がするのは僕だけだろうか. 本当になんとなくだが,不連続型の推定は不安定な気がする.本当になんとなくでなんの根拠もない. 単語というのは本当に不思議で,標本空間が定まっていない(と思う). よく出て来るサイコロや,コイントスなんかはビシッと定まっているのに(まぁ7の目があるサイコロを作れば破綻するんだけども). 今日も新たな単語は誕生し,ボキャブラリーにないから生起確率は0だと推定されているのではないだろうか (確かボキャブラリーになくてもある程度の生起確率を与えられる推定法(MAP推定)があった気がするが).

では,2単語間の距離はどうだろう.単語w1w2の距離d(w1, w2)は一応定義できるし,これは連続的な値だ. そうすると,条件付き確率みたいなものが考えられる気がする. 単語w’から見た,単語wの生起確率p(w|w')は以下のようにして考えることができる.

\displaystyle  p(w|w') = \frac{d(w, w')}{\int_V d(w, w') dw}

ただし,Vはボキャブラリー. これの推定には明らかに連続型のモデル(例えば正規分布)が使える. 今回は単語の話なので,単語間の距離というちょっと普段使わないようなものが出て来てしまったが, これは文,文章へと用意に拡張できる.

単語を使った特徴量をBasic Summarization Modelに組み込む(NLP, 自動文書要約)

前回,BasicSummarizationModelで文書要約(Python) というのをやりました. 簡単に言うと,これは文をスコア付けして,スコアの高いものから要約として採用するというものでした. このモデルでは,各文は,
最初の文は最も重要であり,終わりに近づくにつれて文の重要度は減少していく , というsentence position hypothesisに基づいてスコア付けされる.

前回紹介した論文

では単語の特徴量をこのBasic Summarization Modelに組み込んだものを提案している. Studyというタイトルとおり,提案しているというよりは,調べていると言った方が良いのか. 基本的には, ある単語の早い出現は情報をたくさんもっている. というword position hypothesisに基づいて各単語の情報量の重みを表現する. これは単語そのものをスコア付けしていたのに対して,単語と出現回数(何回目の出現なのか)のペアでスコア付けをするというものだ. つまり,wという単語のi番目の出現をf(w, i)でスコア付けする. fをどうするか,については4つ程考察されていた.

  1. Direct proportion
  2. Inverse proportion
  3. Geometric sequence
  4. Binary function

Basic Summarization Model では,各文を以下の関数でスコア付けする.

\displaystyle    score(s) = \frac{1}{\|s\|} \sum_{i} \log freq(w_{i})

ちなみに\|s\|は文sに含まれる単語数. これを単語の持つ情報量の平均と解釈しているみたいだ. ちなみに単語wの持つ情報量info(w)は,

\displaystyle    info(w) = - p(w) \log p(w)

だと思うがどうなのか.

さてこのスコアに単語wの位置による特徴量pos(w)を以下のように組み込む.

\displaystyle    score^{'}(s) = \frac{1}{\|s\|} \sum_{i} \log freq(w_{i}) pos(w_{i})

これで単語の出現位置も考慮したスコア付けが可能になる. というわけで例のごとく実装してみた.source code

Result

今回も前と同じ記事を要約してみる. 使う記事の全体は以下.

真に「使える」手書きメモアプリだと思わせてくれた『DioNote』
====================================================================================================
Android:手書きメモアプリが使えないのは過去の話になったかも。
「手書きメモアプリ」と聞くだけで、筆者は敬遠するところがありました。今までいくつかのアプリを試してきて、うまく文字が書けたり、正しく反映されたためしがなかったのです。大人しくキーボードから入力するメモが一番だ、と。
ですが、今回紹介する『DioNote』は、手書き反映の機敏さといい、認識力の高さといい、かなりの実力を持っていて、久々に「いいね!」と言いたくなるアプリでした。
加えて、画像の挿入や文字入力、メモのショートカットをホームに置けるなど、細かな機能も実装されており、あらゆる点からなかなか使える仕上がりとなっています。
早速、トップ画面右上のプラスマークからメモを作ってみます。ノートのようなデザインです。画面下部の領域に文字を手書きで入力していきます。一文字書いてみると、反応の正確さにビックリします。
すぐさま一文字書いたことが認識され、新たな文字、さらに新たな文字...と、そのテンポの良さも素晴らしい。ちなみに、一文字ずつだけでなく、横に連続で書いていくことも可能です。
画面右上のメニューから「キャンパス作成」をタップすると、真っさらな自由帳のような画面になります。ここでは画像の貼り付けも自由にでき、より気ままなメモを作成できます。

実験結果は以下のようになった.上からBasic Summarization Model,direct proportion, inverse proportion, getometric sequence.

真に「使える」手書きメモアプリだと思わせてくれた『DioNote』
====================================================================================================
大人しくキーボードから入力するメモが一番だ、と。ノートのようなデザインです。画面下部の領域に文字を手書きで入力していきます。一文字書いてみると、反応の正確さにビックリします。すぐさま一文字書いたことが認識され、新たな文字、さらに新たな文字...と、そのテンポの良さも素晴らしい。

真に「使える」手書きメモアプリだと思わせてくれた『DioNote』
====================================================================================================
Android:手書きメモアプリが使えないのは過去の話になったかも。「手書きメモアプリ」と聞くだけで、筆者は敬遠するところがありました。今までいくつかのアプリを試してきて、うまく文字が書けたり、正しく反映されたためしがなかったのです。大人しくキーボードから入力するメモが一番だ、と。

真に「使える」手書きメモアプリだと思わせてくれた『DioNote』
====================================================================================================
Android:手書きメモアプリが使えないのは過去の話になったかも。「手書きメモアプリ」と聞くだけで、筆者は敬遠するところがありました。今までいくつかのアプリを試してきて、うまく文字が書けたり、正しく反映されたためしがなかったのです。大人しくキーボードから入力するメモが一番だ、と。ノートのようなデザインです。画面下部の領域に文字を手書きで入力していきます。

真に「使える」手書きメモアプリだと思わせてくれた『DioNote』
====================================================================================================
Android:手書きメモアプリが使えないのは過去の話になったかも。「手書きメモアプリ」と聞くだけで、筆者は敬遠するところがありました。今までいくつかのアプリを試してきて、うまく文字が書けたり、正しく反映されたためしがなかったのです。大人しくキーボードから入力するメモが一番だ、と。ノートのようなデザインです。

Summary

単語の位置情報を考慮した自動文書要約を試した. word position hypothesisが強すぎるのか,ほとんど最初の文が抽出される結果となった. 次回は僕オリジナルの方法を何か試せたらと思う.