[連載]フリーソフトによるデータ解析・マイニング第60回

統計的テキスト解析(5)~統計法則と指標~

1.ジップの法則

 大量のテキストに使用された要素の頻度を集計し、そのデータを値が大きい順に並べると、その順位(ランク)と頻度の間には次の法則があることがわかっている。
順位×頻度≒定数
この法則を「ジップの法則」と呼ぶ。ジップ(Zipf)は、この研究を1929年から始めたそうである。その結果に関連する主な著書として、Zipf(1935, 1949)がある。当初はPrinciple of Least Effort 用語を用いていた。
ジップの発見した法則は、単語の使用頻度と順位との関係から導き出した法則であるが、言語に限らず何らかの頻度と順位との関係に適用される。
頻度、順位、定数をそれぞれf,r,cで表すと、ジップの法則は次の式で表される。定数cは、データから求めることになる。

ジップの法則の式

 表1に、福田総理の所信表明演説文における単語を出現頻度が高い順に並べ、その順位と単語の頻度データを示す。横軸をランク、縦軸を頻度としたグラフを図1に、またランクと頻度について対数を取ったグラフを図2に示す。
 表1の中からわかるように、r×fの値は一定ではない。ただし、図2ではデータが大まかに直線に近似することがわかる。
 そこで、ジップの法則を次のように拡張した法則が提案されている。

ジップの法則を拡張した法則

 式の中のa,b,cは、データに依存する定数(パラメータ)である。
 式fr=c/raを対数変換すると、log(fr)=log(c)-alog(r)になる。これは、ランクと頻度データを対数変換した線形回帰式y=α+βxである。
 式fr=c/(b+r)aは、「Zipf-Mandelbrot法則」と呼ばれている(Mandelbrot 1953)。
 テキストマイニングの分野では、語・文節を単位として出現頻度順に並べた(ソート)データも1つの有効な情報である。

表1 福田総理の所信表明演説文の単語のランクと頻度
単語・記号 r×f
の_助詞 1 244 244
を_助詞 2 194 312
に_助詞 3 151 453
ます_助動詞 4 78 312
し_動詞 5 74 370
て_助詞 6 72 432
男性_名詞 389 1 389
科学_名詞 929 1 929

図1 表1の単語のランクと頻度の散布図

図1 表1の単語のランクと頻度の散布図


図2 表1の単語のランクと頻度の対数値の散布図

図2 表1の単語のランクと頻度の対数値の散布図

2.語彙の豊富さの指標

 テキストを分析する際に、用いられた語彙の豊富さが議論の対象になる場合がある。
 テキストの中に用いられた総単語数を「述べ語数」と呼び、単語の種類を「異なり語数」とよぶ。説明の便利のため、延べ語数をN異なり語数をV、テキストの中で、m回使用された語数をV(m,N)で示す。mV(m,N)のデータを頻度スペクトル(The Frequency Spectrum)と呼ぶ。
 福田総理の所信表明演説文を例とすると、句読点などの記号を除いた延べ語数Nは3423であり、異なり語数Vは914語である。福田総理の所信表明演説文の頻度スペクトルデータを表2に示す。表2の中の左側の第2行は、1回使用された語数が529であることを意味する。これは形態素解析ソフト「茶筌」を用いた結果であり、単語の定義によって異なるデータが得られるのはいうまでもない。

表2 福田総理の所信表明演説文の頻度スペクトル
V(m,N) m
1 529
2 153
3 62
4 47
5 26
6 14
7 11
8 12
9 11
10 5
11 7
12 4
13 2
14 4
17 3
19 1
20 1
21 1
23 3
24 3
27 1
28 1
31 1
37 1
50 1
53 1
58 1
61 2
72 1
74 1
78 1
151 1
194 1
244 1

 表2からわかるように、NVV(m,N)相互は次の関係を持っている。

ジップの法則を拡張した法則

2.1 延べ語数と異なり語数を用いた指標

 一般的に言えば,テキストの中に異なった単語が多く用いられていると、語彙が豊富であり,表現が多様であると考えられる.語彙の豊富さを示す最も簡単な指標は、延べ語数(N)に対する異なり語数(V)の比率(Type-Token Ratio)トークン比である.これをトークン比と呼ぶ。
 安倍元総理と福田総理の所信表明演説文における延べ語数、異なり語数、トークン比を表3に示す。トークン比で評価すると、所信表明演説文における語彙は、安倍元総理の方が豊富であるといえる。

表3 語数とトークン比
  N V V/N
安部 4354 1212 0.2784
福田 3423 914 0.2670

 トークン比以外にも、延べ語数と異なり語数を用いた語彙の豊富さに関する指標が多数提案されている。 例えば、

ジップの法則を拡張した法則

などがある。これらの語彙の豊富さを示す指標では、延べ語数と異なり語数のみを用いているが、語彙が用いられている回数(頻度スぺクトル)を用いた指標も提案されている。

ジップの法則を拡張した法則

 ユールのK特性値の示す意味を見るため、極端な値で計算してみよう。仮に、100語により構成されたテキストの延べ語数と異なり語数がともに100とする。つまり、すべての単語が1回しか用いられていないとする。そうすると、ユールのK特性値はゼロになる。一方、仮に、100語がすべて同じ単語であるとすると、ユールのK特性値は

ユールのK特性値

となる。したがって、ユールのK特性値は、値が小さいほど、語彙が豊富であることを示す指標である。
 福田総理の演説文におけるユールのK特性値を、表2のデータを用いて求める過程を次に示す。

福田総理の演説文におけるユールのK特性値
福田総理の演説文におけるユールのK特性値

 同じく、安倍元総理の所信表明演説文におけるユールのK特性値を次に示す。

安部総理の演説文におけるユールのK特性値

 K(安部)<K(福田)であるので、安倍元総理の所信表明演説文の語彙が、福田総理の所信表明演説文の語彙より豊富であると判断される。
 しかし、ユールのK特性値は、テキストの長さやデータ構造に依存することに注意してほしい。
 ユールのK特性値のほかに、類似な指標として

類似な指標

などがある。
 これらの指標は、いずれも文章の量が少ない場合には、安定的な値が得られないので、注意が必要である。
 これら以外にも多くの指標が提案されている。その詳細に関する参考文献としては、Baayen(2001)がある。

3.Rによる集計と計算

 以上で説明した、ジップの法則のパラメータ、トークン比、ユールのK特性値などは、RのパッケージlanguageRを用いると、簡単に求めることができる。
 まず、茶筅などを用いて、次のようにスペースで分かち書きしたテキストファイルを作成し、c:\tempに、福田.txtとして保存する。

「この 度 、 私 は 、 内閣 総理 大臣 に 任命 さ れ まし た 。」

 次にRを起動し、関数readLinesを次のように用いて、分かち書きしたテキストファイルをRに読み込む。

> temp.raw <- readLines("c:/temp/福田.txt")

 読み込んだデータtemp.rawの属性は、character(文字)であり、行単位に読み込まれている。行単位のデータを、単語単位のベクトルにしなければならない。Rでは、関数strsplitを用いて単語に分割することができる。単語以外の記号を取り除くため、次のように半角スペース(blank)と記号(punct)を分割の境とする。

> temp.list <- strsplit(temp.raw, split = "[[:blank:]]|[[:punct:]]")

 処理したデータtemp.list の属性は、リストである。リストを次のコマンドで単語ベクトルに変換する。

> temp.vec<-unlist(temp.list)

 処理したデータの中には、空のものがある。そこで、次のコマンドで空のものを取り除く。

> Fukuda.vec <- temp.vec[temp.vec != ""]

 このように作成した単語ベクトルは、パッケージlanguageRを用いて、ジップの法則のパラメータ、トークン比、K特性値などを求め、またグラフを作成しことができる。

> install.packages("languageR",repos="http://cran.r-project.org")
> library(languageR)

 ジップの法則に関連するデータとグラフの作成は、関数zipf.fnc を用いる。

> Fukuda.zipf <-zipf.fnc(Fukuda.vec, plot = TRUE)
<グラフは省略>

 パッケージlanguageRには、テキストを前からチャンク(chunk: 一定の塊)ごとに切り分け、延べ語数、異なり語数、トークン比、K特性値などを求める関数growth.fncがある。文章が1チャンク増えるたびに、延べ語数、異なり語数、トークン比、K特性値などが、どのような振舞いをするかを分析するのに便利である。チャンクは、引数size で指定する。作成したデータFukuda.vecを用いた例を次に示す。

> (Fukuda.grow<-growth.fnc(Fukuda.vec, size=500, nchunks=7))
<結果は省略>

> plot(Fukuda.grow)
<グラフは省略>

 関数spectrum.fncを用いると、単語ベクトルから表2に示すような回数と語数についてのスペクトルのデータフレームを作成することができる。その例を次に示す。

> (Fukuda.spc<- spectrum.fnc(Fukuda.vec))
<結果は省略>

上記のスペクトルデータを用いると、関数yule.fncでK特性値を求めることができる。

> yule.fnc(Fukuda.spc)
[1] 142.9419

4.語の重み指標

 情報検索、コーパス分析、文章の自動要約などを行うとき、しばしば語・項目の重みを計算することが必要である。語の重要度の重みの指標として、TF-IDFがある。
 TF(Term Frequency)は、文書dにおける語tの頻度(tf)であり、IDF(Inverted Document Frequency)は、語tが検索対象の中のどれくらいの文書に現れているかに関する指標であり、最もシンプルなIDFは次の式で定義される。

類似な指標

 式の中のdfは語tを含む文書の数,Nは文書の総数である。IDFは、語が多くの文書中に現れる場合には小さくなり、特定の文書にしか現れない場合には大きくなる。最もシンプルなTF-IDFは、次の式で定義されている。

類似な指標

 この値が大きいほど、その語の重要度が増すことになる。
 例えば、語のベクトルが{国民,生活, 安心,安全}である場合、5つのテキスト(あるいはドキュメント、d1,d2,…,d5)に現れている語の度数が表4のとおりであるとする。

表4 検索語の行列
  国民 生活 安心 安全
d1 1 0 2 1
d2 3 2 1 0
d3 0 1 0 2
d4 0 3 2 1
d5 0 2 3 0

 テキストd1における語「国民」の重みを考えてみよう。

類似な指標

なる。ただし、ここでの対数は自然対数で計算している。対数の底を2、10にする場合もある。このように計算した、表4のTF-IDFを表5に示す。

表4 検索語の行列
  国民 生活 安心 安全
d1 0.9163 0 0.4463 0.5108
d2 2.7489 0.4463 0.2231 0
d3 0 0.2231 0 1.0217
d4 0 0.6694 0.4463 0.5108
d5 0 0.4463 0.6694 0

 TF-IDFを拡張した語の重みの指標も少なくない。例えば、次のように定義されているものもある。

類似な指標

 tfijは、文書diにおける語tjが現れた度数、dfjは語tjが現れた文書の数である。
 Lee et al.(1999)は、128種の重みの指標について、韓国語を用いてテストを行い、韓国語の検索においては、次の指標が最も効果的だったと報告している。

図3 ファイルが読み込まれた画面

 Rのパッケージlsa、RMeCabには、いくつかの重みを求める関数が用意されている。

参考文献
[1]Baayen, R. H. (2001) Word frequency distributions, Kluwer Academic Publishers.
[2]Lee J.H., Cho, H.Y., Park H.R.(1999): N-Gram-based indexing for Korean text retrieval, Information Processing and Management, Vol.35, No.4, 427-441.Mandelbrot, B.(1953): An information theory of the statistical structure of language, in W. E. Jackson(ed.), communication theory, Academic Press, New York, pp. 503-512.
[3]Yule,G.U. (1944):  The statistical study of literary vocabulary, Cambridge Univesity Press.
[4]Zipf, G. K.(1935), The Psycho-Biology of Language, Boston-Cambridge Mass. Houghton Mifflin.
[5]Zipf,G. K.(1949): Human Behavior & The Principle of Least Effort, An Introduction to Human Ecology, Addison-Wesley Press Inc.