Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

テキストマイニングはじめました〜その6〜

今回は共起関係を中心に学習していきます。この記事の目標は以下の通りです。

目標
collocate()関数、collScore()関数、T値、MI値の理解

また、今回使用するフォントは「国鉄方向幕書体」です。特徴は、懐かしさを思い出させる字体です。教科書とか、博物館などで見た覚えがあります。 f:id:teruaki-sugiura:20160507161846p:plain 言語学の分野において、特定の語に隣接している語のことを共起語といい、このような関係を共起(collocation)していると言うそうです。 また、この特定の語のことを「中心語=ノード(node)」、ノードの前後の語数範囲をスパン(span)と呼びます。ノードを「港」にし、スパンを「2」とした時に、以下のテキストを例に共起語を考えます。 f:id:teruaki-sugiura:20160507161840p:plain

ノードの前2語「横浜」「の」

ノードの後2語「で」「見た」

これを調べると何が嬉しいのでしょうか?このような共起関係を調べ、ノードの近傍で特定の語句が頻出するのであれば、ノードと特定語の関係が強いと考えることができます。 f:id:teruaki-sugiura:20160507161443p:plain Rヘルプによれば、collocate()関数は「テキストファイルからMeCabに共起語を見つけさせる関数」のようです。基本的なUsageは以下のとおりです。

collocate(filename, node, span)
filename:解析するテキストファイル
node:ノードに指定する言葉
span:ノードと共起する文字の検索範囲。デフォルトは3文字

さっそく、collocatate()関数を使って見ます。解析対象にするテキストはサッカープレミアリーグ、レスターシティ優勝の記事です。

t <- collocate(filename = "number.txt", node = "歴史", span = 3)

f:id:teruaki-sugiura:20160507163049p:plain

今回は「歴史」をノードとして、スパンは前後3文字としました。結果はデータフレームで返されます。言葉の解説を少し。

Term:形態素
Before:ノード前に出現した頻度
After:ノード後に出現した頻度
Span:スパン内の出現頻度
Total:テキスト全体での出現頻度
MORPHEMS:タイプの種類
TOKENS:総トークン数

今回の結果を見る限り、総トークン数は2377、総タイプ数は721語、スパン内の総トークン数は42、スパン内の総タイプ数は14語です。スパン内の総タイプ数は14語なので、データフレームのMORPHEMSとTOKENSの除いた行は14行となっています。

注意が必要なのは、このデータフレームは、「ノードを含めた」データフレームという点です。そのため、スパン内のトークン数は42ですが、ノードの「歴史」は6回出現しているので、実質トークン数は42−6=36語となります。

f:id:teruaki-sugiura:20160507164642p:plain t値とMI値についてみていきます。これは普段統計で使われるt値と似たようなものです。共起の関係が偶然なのか、どうなのかを判断するための基準です。 分野にもよりますが、危険率5%なら1.96を目安に考えますが、言語学においてT値は1.65が目安となっているようです。つまり、1.65を超えているのであれば、帰無仮説(共起は偶然である)を棄却し、対立仮説(共起は偶然ではない)を受容します。 t値は正規分布を前提とした値なので、言葉の頻度は正規分布なのか?という疑問はあがっているそうなのですが、corpus言語学では広く使われている指標のようです。 MI値は、相互情報量という考え方を元にしています。これは、「ある記号が出現することが、別の特定の文字の出現度合いを予測する」というものです。 f:id:teruaki-sugiura:20160507161447p:plain f:id:teruaki-sugiura:20160507175532p:plain

Rヘルプによれば、collScores()関数は「共起語の関係に応じて、t値とMI値を算出する関数」のようです。基本的なUsageは以下のとおりです。

colloScores(kekka, node, span)
kekka:解析するテキストファイル
node:ノードに指定する言葉
span:ノードと共起する文字の検索範囲。デフォルトは3文字

collScore()関数で注意する点は、kakkaの引数にはcollcate()関数の結果を与える必要がある点かと思われます。

t <- collocate(filename = "number.txt", node = "歴史", span = 3)
t1 <- collScores(kekka = t, node = "歴史", span = 3)
t1

f:id:teruaki-sugiura:20160507180348p:plain

特定の語句を抽出したい場合は以下のように指定。

t1[t1$Term == "偉業", ]

t値とMI値の目安は1.65と1.58なので、まずt値を基準にすると「だ」「優勝」「意義」「持つ」「的」、MI値を基準にすると「から」「だ」「偉業」「優勝」「意義」「持つ」「最も」「番手」「的」「重要」の単語が共起は偶然ではないと考えて良さそうですが、両者でかなりばらつきがありますね・・・MI値は低頻度を強調してしまう傾向があるようなので、t値を目安にする方がいいようです。 しかし、t値にしても正規性うんぬんを満たしているわけではないので、絶対的なものではなく、あくまで1つの目安として使う方が良さそうです。

dplyrパッケージを使い、t値を大きい順に並びかえると、見やすいですね。

arrange(t1, desc(T), MI)

f:id:teruaki-sugiura:20160507183827p:plain

以上は今回でおしまい。