trigram以上へのMIスコアの拡張
昨年International Journal of Corpus Linguistics誌にNaixing Wei氏とJingjie Li氏による、MIスコアをtrigram以上のn-gramに拡張するという論文が掲載されました(こちら)。読んでみて面白そうだと思ったので、Rで実装しました。以下で公開しています。parse()やeval()の使い方、直接必要ではないのにターム文書行列を作成している点など、不満な点は多々あるのですが、手を入れる時間がしばらくは取れなさそうなので、公開します。誤りや不自然な点等ありましたら是非お知らせください。
以下のようにして走らせることができます。詳細はここをご覧ください。
# 必要なパッケージの読み込み。ない場合はinstall.packages()でインストール library(RWeka) library(tm) library(data.table) # コードの読み込み (2月28日追記) library(devtools) source_url("https://raw.github.com/mrkm-a/newMI/master/newMI.R") # コーパスファイルが含まれるディレクトリへのパスを指定 direc <- "(テキストファイルが含まれるディレクトリのパス)" # 実行 ps <- newMI(direc, cutoff.freq = 5, pattern = ".txt")
ブラウンコーパスに上記のコードを走らせると私の環境では10分ほどかかり、以下のような結果になります。
> head(ps) Ngram N Frequency MI 1 104 e 2 5 10.966133 2 15 1962 2 6 10.183509 3 15th day 2 6 9.181649 4 1962 alaska 2 6 13.000202 5 353 u 2 6 11.637632 6 7th cavalry 2 6 14.303514 # 計1164個のn-gramが抽出された > nrow(ps) [1] 1164 # 内訳はbigramが587個、trigramが364個、4-gramが133個、5-gramが35個、6-gramが45個 > table(ps$N) 2 3 4 5 6 587 364 133 35 45 # MIスコアの高い順にソートし出力 > ps.s <- ps[order(ps$MI, decreasing = TRUE), ] > head(ps.s) Ngram N Frequency MI 16 afl cio 2 5 17.68203 149 dolce vita 2 5 17.68203 280 laissez faire 2 5 17.68203 483 souvanna phouma 2 5 17.41899 689 fille de chambre 3 5 17.26984 768 lauro di bosis 3 6 17.19682
一目、意味をなさない語が並んでいるように見えますが、調べてみるとAFL-CIOは「アメリカ労働総同盟・産業別組合会議」の略称、dolce vitaは「La Dolce Vita」という映画のタイトルの一部、laissez faireは経済の「自由放任主義」と、いずれも意味のあるフレーズです。これらが上位に来ているのは、例えばafl cioの場合だと、aflもcioもAFL-CIOというフレーズでしか出現していないためです*1。低頻度語に敏感というMIスコアの特徴を見て取れます。trigram以上もbigramと似た方法で抽出しているため、同じ特徴があります。詳しくは原論文をご参照ください。
*1:MIスコアは例えばafl cioの場合だと、「afl cioの頻度×総語数 / (aflの頻度×cioの頻度)」という計算式で求められるので、afl cioの頻度に対して「aflの頻度×cioの頻度」の値が小さいほど、つまりaflとcioがafl cioという表現以外で出現する頻度が低いほど、高い値が出ます。