コロケーションと語彙分析

参考文献

コロケーション

共起(co-occurrence)とは、複数の語が連続して並ぶという広く観察される現象である。 言語単位がN個隣接したNグラムは共起の例である。 共起現象の現れとしてコロケーション(連語関係)がある。 コロケーションは語間の関連性の手がかりとなるため、語彙研究、とくにコーパス言語学(corpus linguistics)においては大きな関心が払われている。

実際に使われている言語資料を(実際には電子的に)集積したものをコーパスと呼ぶ。 コーパスをつかって、実際的な言語の運用や仕組みを探る研究をコーパス言語学(あるいは計量言語学)という。

コロケーション(collocation)とは語と語が作る結合態として、特に、1) 語と語の連続した結びつきであり、2)一定の文法的まとまりをもち、3)その結びつきは一定を強度を持ち、4)結びつき自身がまったく新しい意味を担う熟語(idiom)とは異なり、5)自由結合句(文法的に許される語の結合)と熟語の中間領域に存在する語結合をいう。

「is a pen」 や「今日学校で」は語のまとまりとして格段の意味が無い連なり(文法的なまとまりも持たない)であるのでコロケーションとは考えにくい。 コロケーションは厳密に定義されているわけではないために、コロケーションとしての強度が弱く(go to schoolのような)自由結合句に近いコロケーションや、強度が強く熟語に近いコロケーションもありうる。

ここでは、コロケーションを「ある語」が「特定の語」と連続した結びつきとして現れることと定義しよう。 「ある語」を中心語(node)とし、その中心語から測った前後の語数をスパン(spanまたはウィンドウ幅)で指定した数 $s$ を使って、中心語を真ん中に含む $1+2s$個からなる連続する語を調べてみよう。

もし、テキスト内の語が仮に一様に分布していると仮定しよう(ある語がテキストの特定位置に集中して現れるようなことがないという仮定)。 このとき、テキスト内のある語に着目してこれを中心語としたとき、その中心語からの前後スパン距離内に特定の語集合が別の語集合よりも特徴的に現れやすいというようなことは(語の一様分布の仮定から)なく、どの語も同じく登場し得るはずである。 そこで、中心語を決め、テキスト全体で中心語から前後スパン内で共起する語の頻度が、テキスト全体での平均出現率に比べて有意に多く(または少なく)現れるのであれば、中心語とその語には強い関係性があるといえる。 こうした語の連なりをコロケーションの候補と見なすのである。

コロケーション関数 collocate, collScores

Rパッケージ MeCab の関数ファミリー collocate, collScores はコロケーションの頻度やTスコア/MIスコアを求める関数である。

関数 collocate は、第一引数にテキストファイル、第二引数の node 値に中心語を、第三引数 span に前後スパン値を指定する。 次は、テキスト merosu.txt に対して、中心語を "メロス"、中心語からの前後 span 値を 3 として調査した例である。 結果は以下のように、Term, Before, After, Span, Totalの5列かtらなるデータフレームとして返される。 この例では、全1277行の内、70行目から90行目と末尾の6行を表示させている(中心語である"メロス"を含む行)。

> cmerosu <- collocate("merosu.txt", node = "メロス", span = 3)
file = merosu.txt 
length = 1277 
> cmerosu[70:90, ]
               Term Before After Span Total
70           わかる      1     0    1     4
71           わが身      0     1    1     2
72               を      1     7    8   220
73 セリヌンティウス      1     0    1    15
74           マント      1     0    1     2
75           メロス     76     0   76    76
76             一つ      1     0    1     3
77             一生      0     1    1     1
78             両手      0     1    1     2
79               今      1     1    2     5
80               六      0     1    1     3
81             勇者      1     0    1     4
82               十      0     1    1     6
83             単純      0     1    1     1
84               友      0     1    1    18
85         口惜しい      0     1    1     2
86             叫び      0     1    1     1
87               右      0     1    1     1
88               君      0     1    1    13
89             嘲笑      0     1    1     1
90               夜      0     1    1     5
> tail(cmerosu)
            Term Before After Span Total
153           馬      0     1    1     1
154         高い      1     0    1     4
155         黒い      0     1    1     1
156           !      2     0    2    12
157 [[MORPHEMS]]     68    88  156  1277
158   [[TOKENS]]    302   228  530  6445

Span列は指定したスパンでのtermの出現頻度、Total列はテキスト全体での出現頻度、また、Before列はノードを含む後方スパンでの出現頻度(中心語である"メロス"を参照)、After列はノードを含まない前方スパン内の出現頻度である(ここで、後方とは中心語から見てテキスト先頭に向かう方向、後方とはテキスト末尾に向かう方向である)。 末尾の [[MORPHEMS]] は形態素の種類(タイプ)数で、テキスト全体ではTotal列にある 1277 である。 [[TOKENS]] は総トークン数で、テキスト全体でTotal列にある 6445 である(これらはノード自身の頻度も含む)。 この例のスパン内の総term数は 530 であるが、ノードである "メロス" が全部で 76 回出現しているため、メロスの前後3語に出現したトークン数は 530 - 76 = 455 である。 テキスト全体のトークン数は 6455、タイプ数は 1277 である(Total列参照。ただし、句読点などの記号も含む)。

関数 collocate によって、注目している中心語と共起するtermの頻度が得られた。 したがって、前後スパン内でそれら共起したtermの出現頻度が有意に大きいか(前後スパン内に共起した回数がテキスト全体での平均出現頻度にくらべて大きい)かを調べることができる。

コーパス言語学では共起頻度が有意がどうかの判定にはTスコアおよびMIスコアなどが利用される(いずれも統計解析で使われる指標である)。 今の場合、Tスコアは次式で定義される値である。 \begin{align*} T &= \frac{\mbox{共起頻度}-\mbox{共起頻度期待値}}{\sqrt{\mbox{共起頻度}}}\\ &= \frac{\mbox{共起頻度}-\frac{\mbox{中心語頻度}\times\mbox{共起語頻度}}{\mbox{総語数}}}{\sqrt{\mbox{共起頻度}}} \end{align*} Tスコアの絶対値が2以上になると有意な組み合わせであるとされる。 Tスコアでは、語の頻度情報を重視するために高頻度語が高く評価される傾向があり、頻繁につかわれる一般性の高いコロケーションの評価に適しているとされている。

また、MIスコア(または相互情報量)は次式で手議される値である。 \[ MI = \log_2\frac{\mbox{共起頻度}\times\mbox{総語数}}{\mbox{中心語頻度}\times\mbox{共起語頻度}} \] MIスコアが2以上になると有意な組み合わせであるとされる。 MIスコアは、頻度は低いが特殊な結びつきをしているコロケ ーションがうまく検出できるとされている(低頻度の語を強調する傾向がある)。

RMeCabパッケージで TスコアおよびMIスコアを求めるためには、関数 collScores を使って、 関数collocateから返ったオブジェクト(上の例では cmerosu)を第一引数に、関数 collocate で指定した中心語を node 値に、そして第三引数に関数 collocate で指定した span 値に与える。 次に、実際の例を示した。

> scoreMerosu <- collScores(cmerosu, node = "メロス", span = 3)
> str(scoreMerosu)
'data.frame':	158 obs. of  7 variables:
 $ Term  : chr  " " "、" "。" "「" ...
 $ Before: int  7 19 51 3 12 1 1 4 1 0 ...
 $ After : int  1 26 6 0 1 0 0 0 0 1 ...
 $ Span  : int  8 45 57 3 13 1 1 4 1 1 ...
 $ Total : int  34 556 459 61 61 15 2 31 11 1 ...
 $ T     : num  1.978 0.844 3.248 -0.76 2.409 ...
 $ MI    : num  1.734 0.194 0.812 -0.525 1.591 ...
> scoreMerosu[70:90, ]
               Term Before After Span Total           T          MI
70           わかる      1     0    1     4  0.71698991  1.82107463
71           わが身      0     1    1     2  0.85849496  2.82107463
72               を      1     7    8   220 -2.67482751 -0.96028508
73 セリヌンティウス      1     0    1    15 -0.06128782 -0.08581597
74           マント      1     0    1     2  0.85849496  2.82107463
75           メロス     76     0   76    76          NA          NA
76             一つ      1     0    1     3  0.78774244  2.23611213
77             一生      0     1    1     1  0.92924748  3.82107463
78             両手      0     1    1     2  0.85849496  2.82107463
79               今      1     1    2     5  1.16406562  2.49914653
80               六      0     1    1     3  0.78774244  2.23611213
81             勇者      1     0    1     4  0.71698991  1.82107463
82               十      0     1    1     6  0.57548487  1.23611213
83             単純      0     1    1     1  0.92924748  3.82107463
84               友      0     1    1    18 -0.27354538 -0.34885037
85         口惜しい      0     1    1     2  0.85849496  2.82107463
86             叫び      0     1    1     1  0.92924748  3.82107463
87               右      0     1    1     1  0.92924748  3.82107463
88               君      0     1    1    13  0.08021722  0.12063491
89             嘲笑      0     1    1     1  0.92924748  3.82107463
90               夜      0     1    1     5  0.64623739  1.49914653
> tail(scoreMerosu)
            Term Before After Span Total         T       MI
153           馬      0     1    1     1 0.9292475 3.821075
154         高い      1     0    1     4 0.7169899 1.821075
155         黒い      0     1    1     1 0.9292475 3.821075
156           !      2     0    2    12 0.8138585 1.236112
157 [[MORPHEMS]]     68    88  156  1277        NA       NA
158   [[TOKENS]]    302   228  530  6445        NA       NA

この例では 158 行の結果が返っている。 "メロス"は中心語であるために、各スコアは計算されずに NA となる。 同様に、[[MORPHEMS]] および [[TOKENS]] も NA となる。 この例では、Tスコアの絶対値が2を越える意味あるtermは見当たらない。 MIスコアについては、値が2以上のterm("捧げる"は最高の 4.8)が幾つか見つかる。