読者です 読者をやめる 読者になる 読者になる

共起語の対数尤度比とダイス係数を求める

 QiitaのR Advent Calendar 2014の20日目の記事です。*1
 共起語とは、分析対象とする単語(中心語、あるいは検索語)の近くによく一緒に現れる単語のことです。実際の分析を行うにあたっては、どれくらい「近く」に現れる単語を共起語とみなすのか、また、どれくらい「よく」一緒に表れる単語を共起語とみなすのか、を分析者が自分で設定する必要があります。具体的には、中心語の前後何単語までを対象とするか(スパン)と、どのような基準で共起の強さを測るか(共起尺度)を決めることになります。
 日本語のテクストにおける共起語をRで分析する場合、RMeCabパッケージのcollocate関数やcollScores関数を使います。*2 RMeCabではTスコア (T score, T) と 相互情報量 (Mutual Information, MI) の2種類の共起尺度を用いることができますが、言語研究の分野では他にも様々な指標が提案されています。*3 そこで今回は、対数尤度比 (Log-Likelihood Ratio, LLR) とダイス係数 (Dice coefficient, D) の2種類を計算してみたいと思います。これらの共起尺度は、石川 (2008) によれば、以下のような式で求めることができます。

  • LLR = log2(共起頻度 * コーパス語数 / 中心語頻度 * 共起語頻度)
  • D = 2 * (共起頻度 / (中心語頻度 + 共起語頻度))

 分析データは、石田・小林 (2013)サポートサイトで公開されているデータの一部を使います。こちらのページの一番下にあるzipファイルのいずれか*4をダウンロードし、「PM」というフォルダを(Windowsユーザーであれば)Cドライブの直下にコピーしてください。*5 今回は、その中のAbe.txtにおける「国」の共起語を分析します。

# 中心語の指定
node.word <- "国"

# 中心語の頻度集計
library(RMeCab)
RMeCabFreq.result <- RMeCabFreq("C:/PM/Abe.txt")
node.word.2 <- paste("^", node.word, "$", sep = "")
node.freq <- sum(RMeCabFreq.result[grep(node.word.2, MeCabFreq.result$Term), ][, 4])
# 共起語の頻度集計(スパンは1)
collocate.result <- collocate("C:/PM/Abe.txt", node = node.word, span = 1)
collScores.result <- collScores(collocate.result, node = node.word, span = 1)
# 解析に不要な情報を削除
collScores.result <- collScores.result[-nrow(collScores.result), ]
collScores.result <- collScores.result[-nrow(collScores.result), ]
collScores.result <- collScores.result[-as.numeric(rownames(collocate.result[grep(node.word.2, collocate.result$Term), ])), ]

# 対数尤度比の計算
LLR <- log2(collScores.result$Total * sum(RMeCabFreq.result$Freq) / node.freq * (collScores.result$Before + collScores.result$After))
# ダイス係数の計算
D <- 2 * ((collScores.result$Before + collScores.result$After) / (node.freq + collScores.result$Total))
# データフレームの結合
scores <- data.frame(Term = collScores.result$Term, LLR = LLR, D = D)
collScores.result.2 <- merge(collScores.result, scores, by = "Term")
# 結果の確認
collScores.result.2

 上記のスクリプトを実行すると、以下のような結果が表示されます。*6 RMeCabの出力に加えて、LLRとDの2列が追加されています。

     Term Before After Span Total             T           MI       LLR           D
1             3     0    3    56  1.3070584565  2.026972469 14.641682 0.067415730
23     7   10   377  1.5951836004  1.012872272 19.129714 0.048780488
30     3    3    38  1.4436631407  2.586399878 14.082255 0.084507042
4    ある      1     0    1    34  0.5530770763  1.161902049 12.336828 0.029850746
50     1    1    76  0.0009958176  0.001437377 13.497292 0.018348624
6    この      1     0    1     7  0.9079864569  3.442009968 10.056720 0.050000000
7    する      1     0    1   171 -1.2477594105 -1.168487625 14.667217 0.009803922
82     0    2    47  0.9773593032  1.694776039 13.803954 0.050000000
92     4    6    87  1.9826182662  2.391383895 16.277271 0.100000000
101     0    1    82 -0.0778729337 -0.108187114 13.606917 0.017391304
11   です      0     1    1    16  0.7896833300  2.249364890 11.249365 0.040816327
120     2    2    66  0.8007586453  1.204970771 14.293759 0.040404040
132     1    3   190  0.2901124734  0.264471783 16.404183 0.026905830
141     7    8   309  1.3923849324  0.977901862 18.520828 0.046783626
150     1    1    43  0.4347739494  0.823100136 12.675630 0.026315789
160     2    2   242 -0.8351211337 -0.669498347 16.168228 0.014545455
171     0    1    11  0.8554072894  2.789933272 10.708797 0.045454545
18   開催      1     0    1     2  0.9737104163  5.249364890  8.249365 0.057142857
19 含める      1     0    1     5  0.9342760406  3.927436795  9.571293 0.052631579
20   持つ      1     0    1     4  0.9474208325  4.249364890  9.249365 0.054054054
21 新しい      1     0    1     4  0.9474208325  4.249364890  9.249365 0.054054054
22   創る      0     3    3     3  1.7092833602  6.249364890 10.419290 0.166666667
23 続ける      1     0    1     3  0.9605656244  4.664402390  8.834327 0.055555556
24   入り      0     1    1     1  0.9868552081  6.249364890  7.249365 0.058823529
25 美しい      8     0    8     9  2.7866006531  6.079439889 13.419290 0.380952381
26   理事      2     0    2     4  1.3770344765  5.249364890 10.249365 0.108108108

 そして、LLRの大きさで共起語を並べ直し、その上位10位までを表示するには、以下のようにします。

# LLR上位10位までを表示
head(collScores.result.2[order(collScores.result.2$LLR, decreasing = TRUE), ], 10)

 上記のスクリプトを実行すると、以下のような結果が表示されます。

   Term Before After Span Total          T         MI      LLR           D
23     7   10   377  1.5951836  1.0128723 19.12971 0.048780488
141     7    8   309  1.3923849  0.9779019 18.52083 0.046783626
132     1    3   190  0.2901125  0.2644718 16.40418 0.026905830
92     4    6    87  1.9826183  2.3913839 16.27727 0.100000000
160     2    2   242 -0.8351211 -0.6694983 16.16823 0.014545455
7  する      1     0    1   171 -1.2477594 -1.1684876 14.66722 0.009803922
1           3     0    3    56  1.3070585  2.0269725 14.64168 0.067415730
120     2    2    66  0.8007586  1.2049708 14.29376 0.040404040
30     3    3    38  1.4436631  2.5863999 14.08225 0.084507042
82     0    2    47  0.9773593  1.6947760 13.80395 0.050000000

 また、各指標の相関係数を求めるには、以下のようにします。

# 各指標の相関係数
cor(collScores.result.2[6 : 9])

 上記のスクリプトを実行すると、以下のような結果が表示されます。

              T         MI         LLR           D
T    1.00000000  0.6756317 -0.06478959  0.72367658
MI   0.67563166  1.0000000 -0.71507084  0.59456831
LLR -0.06478959 -0.7150708  1.00000000 -0.06565528
D    0.72367658  0.5945683 -0.06565528  1.00000000

 最後に、RMeCabの基本的な使い方および共起尺度に関しては、以下の記事などを参考にして頂ければ幸いです。

(追記)とある先生より、以下のように書くと効率的であるというご指摘を頂きました。記して、感謝を申し上げます。

# 中心語の指定
node.word <- "国"
# 共起語の頻度集計(スパンは1)
library(RMeCab)
library(dplyr)
library(magrittr)
collocate.result <- collocate("PM/Abe.txt", node = node.word, span = 1)
collScores.result <- collScores(collocate.result, node = node.word, span = 1)
FreqSum <- collScores.result %>% filter(Term == "[[TOKENS]]")
node.freq2 <- collScores.result %>% filter(Term == node.word)
# 解析に不要な情報を削除
collScores.result %<>% filter(!Term %in% c("[[TOKENS]]","[[MORPHEMS]]")) 
# 対数尤度比の計算
LLR2 <- log2((collScores.result$Total * FreqSum$Total) / node.freq2$Total *  (collScores.result$Before + collScores.result$After))

*1:今年は、「Rパッケージにおける言語関連のデータ」というR Advent Calendar 2014の8日目の記事も担当しました。

*2:詳しくは、こちらの記事を参照。

*3:詳しくは、こちらの記事を参照。

*4:WindowsユーザーはSJISを、MacユーザーはUTF8を選んでください。

*5:PMフォルダには、6人の内閣総理大臣による所信表明演説のデータが入っています。

*6:このスクリプトを使用する場合は、自己責任でお願いします。