DTAL(旧RCEAL)留学記録

2010年1月から2014年半ばまで在学していたケンブリッジ大学理論・応用言語学科でPhDを取得するまでの記録です。

trigram以上へのMIスコアの拡張

昨年International Journal of Corpus Linguistics誌にNaixing Wei氏とJingjie Li氏による、MIスコアをtrigram以上のn-gramに拡張するという論文が掲載されました(こちら)。読んでみて面白そうだと思ったので、Rで実装しました。以下で公開しています。parse()やeval()の使い方、直接必要ではないのにターム文書行列を作成している点など、不満な点は多々あるのですが、手を入れる時間がしばらくは取れなさそうなので、公開します。誤りや不自然な点等ありましたら是非お知らせください。


newMI


以下のようにして走らせることができます。詳細はここをご覧ください。

# 必要なパッケージの読み込み。ない場合は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という表現以外で出現する頻度が低いほど、高い値が出ます。