Nグラム統計

参考文献

N-gramとは、テキスト内のある言語単位(文字や形態素、品詞など)が2言語単位、3言語単位など一般にN言語単位が隣接して生じる言語単位の共起関係(collocation)(それぞれ、2グラム、3グラムおよびNグラムという)で、文書の特長の一端を示すものと考えることができる。 たとえば、あるテキストにおいて文書単位が abcdefghijk... と並んでいるとき、2グラムは ab, bc, cd, de, ef, fg, gh, hi, ij, jk, .... 、3グラムは abc, bcd, cde, def, efg, fgh, ghi, hij, .... である。

言語単位(たとえば文字)の全数を $M$ としたとき、連続する$N$単位の可能な組み合わせ総数は $M^N$ 個になる。 ある言語単位についてNグラムを求めようとするとき、 $M^N$ 個のNグラムの組み合わせ表を用意するという方法では,各Nグラムついて与えられたテキストからその登場頻度を調べることになってしまう。 この方法ではNグラムの計算はNの増加とともに爆発的に時間がかかり、しかもその結果データはきわめて巨大になる。 実際、漢字6400文字を含むJIS漢字(JIS X 0208文字集合)では、Nグラムの可能な組み合わせは N=4 で1600兆にもなり、この方法で作成した結果データを保持することは現実的ではない。

しかしながら、こういった表を用意せずに大きなNについてのNグラムの頻度を求める方法が考案されている。 1959年に H.P. Luhn が発表したその方法を KWIC(Key Word In Context)という。 これを受けて、米国化学学会(ACS)は1961年にKWIC索引誌 Chemical Titleを刊行した(複合語の多い専門用語の場合、用語のKWICを作成した索引には大きな意味がある)。

Rパッケージ RMeCab の関数ファミリ docNgram, docNgram2, docNgramDF, Ngram, NgramDF, NgramDF2 は N-gram頻度を返す。

Nグラム統計の例

関数 Ngram は指定したテキストのNグラムの頻度を返す。 オプション引数 N = 2 (省略したデフォルト値 = 2)、オプション引数 type = 0 (デフォルト値 = 0、言語単位は文字)である。 次の例は、ogawa.txt をテキストファイルとして読み込んだ言語単位として文字の2グラムの頻度である。

> ogawa <- Ngram("text/ogawa.txt")#2グラム, 言語単位 = 文字
file = text/ogawa.txt Ngram = 2 
length = 110 

> head(ogawa, 20)
     Ngram Freq
1  [、-な]    1
2  [、-日]    1
3  [、-黒]    1
4  [。-も]    1
5  [。-村]    1
6  [。-私]    1
7  [。-都]    1
8  [。-電]    1
9  [。-鳥]    1
10 [い-、]    1
11 [い-。]    1
12 [い-た]    2
13 [い-て]    3
14 [い-出]    1
15 [い-煙]    1
16 [い-鳥]    2
17 [う-夕]    1
18 [か-、]    1
19 [か-げ]    1
20 [か-し]    1

関数 Ngram のオプション引数 type の値は、次の表に示すように、1にすると言語単位は形態素、type 値を2にすると言語単位は品詞となる。

type 値意味
0 (default)type = 0 とした言語単位は文字
1type = 1 とした言語単位は形態素
2type = 2 とした言語単位は品詞

> ogawa2 <- Ngram("text/ogawa.txt", type = 1)#2グラム, 言語単位 = 形態素
file = text/ogawa.txt Ngram = 2 
length = 24 

> ogawa2
> ogawa2
                 Ngram Freq
1            [ない-私]    1
2            [ない-都]    1
3    [なつかしい-夕方]    1
4        [らっぱ-鳥屋]    1
5          [ガタ-馬車]    1
6            [前-赤い]    2
7            [夕方-日]    1
8      [姉さん-恋しい]    1
9        [姉さん-電車]    1
10 [恋しい-なつかしい]    1
11           [方-ガタ]    1
12           [方-黒い]    1
13             [日-村]    1
14             [村-方]    1
15           [汽車-町]    1
16         [町-姉さん]    1
17         [私-姉さん]    1
18           [赤い-鳥]    2
19             [都-方]    1
20         [電車-汽車]    1
21       [馬車-らっぱ]    1
22           [鳥-ない]    2
23           [鳥屋-前]    2
24           [黒い-煙]    1
ogawa3 <- Ngram("text/ogawa.txt", type = 2)#2グラム, 言語単位 = 品詞
file = text/ogawa.txt Ngram = 3 
length = 24 

> ogawa3
           Ngram Freq
1    [副詞-名詞]    1
2  [副詞-形容詞]    1
3  [助動詞-助詞]    2
4  [助動詞-記号]    2
5    [助詞-副詞]    1
6    [助詞-動詞]   13
7    [助詞-名詞]    8
8  [助詞-形容詞]    4
9    [助詞-記号]    2
10 [動詞-助動詞]    4
11   [動詞-助詞]    3
12   [動詞-動詞]    3
13   [動詞-名詞]    2
14   [動詞-記号]    4
15   [名詞-助詞]   21
16   [名詞-名詞]    1
17 [形容詞-助詞]    2
18 [形容詞-名詞]    3
19 [形容詞-記号]    2
20   [記号-副詞]    1
21   [記号-名詞]    6
22 [記号-形容詞]    2
ogawa4 <- Ngram("text/ogawa.txt", N = 3, type = 1)#3グラム, 言語単位 = 品詞
file = text/ogawa.txt Ngram = 3 
length = 24 

> ogawa4
                        Ngram Freq
1            [ない-私-姉さん]    1
2                [ない-都-方]    1
3        [なつかしい-夕方-日]    1
4            [らっぱ-鳥屋-前]    1
5          [ガタ-馬車-らっぱ]    1
6                [前-赤い-鳥]    2
7                [夕方-日-村]    1
8  [姉さん-恋しい-なつかしい]    1
9          [姉さん-電車-汽車]    1
10   [恋しい-なつかしい-夕方]    1
11             [方-ガタ-馬車]    1
12               [方-黒い-煙]    1
13                 [日-村-方]    1
14               [村-方-ガタ]    1
15           [汽車-町-姉さん]    1
16         [町-姉さん-恋しい]    1
17           [私-姉さん-電車]    1
18             [赤い-鳥-ない]    2
19               [都-方-黒い]    1
20             [電車-汽車-町]    1
21         [馬車-らっぱ-鳥屋]    1
22               [鳥-ない-私]    1
23               [鳥-ない-都]    1
24             [鳥屋-前-赤い]    2

オプション引数 pos に品詞のリストを指定すると、指定した品詞以外がスキップされたNグラムの頻度を返す。

> ogawa5 <- Ngram("text/ogawa.txt", N = 3, type = 1, pos = c("名詞", "動詞"))#名詞と動詞からなる3グラム、言語単位 = 形態素
file = text/ogawa.txt Ngram = 3 
length = 33 

> head(ogawa5, 20)
                    Ngram Freq
1        [いる-私-姉さん]    1
2            [いる-都-方]    1
3          [かげる-村-方]    1
4          [くる-鳥屋-前]    1
5          [てる-町-住む]    1
6      [でる-姉さん-夕方]    1
7    [ながめる-煙-上がる]    1
8    [らっぱ-吹く-駆ける]    1
9      [ガタ-馬車-らっぱ]    1
10     [住む-でる-姉さん]    1
11           [前-立つ-鳥]    2
12     [吹く-駆ける-くる]    1
13       [夕方-日-かげる]    1
14       [姉さん-夕方-日]    1
15 [姉さん-思い出す-電車]    1
16   [思い出す-電車-汽車]    1
17       [方-ながめる-煙]    1
18         [方-ガタ-馬車]    1
19         [日-かげる-村]    1
20           [村-方-ガタ]    1

関数 docNgram は、第一引数にテキストファイルが格納されているフォルダを指定できる。 オプション引数は、関数 Ngram と同様に N = n、type = 0,1,2 および pos = c(品詞リスト) である。

> textgram <- docNgram("text", N = 3, type = 1, pos = c("名詞", "動詞"))#フォルダ text 内のファイル
file = text/kishida.txt Ngram = 3 
length = 88 

file = text/ogawa.txt Ngram = 3 
length = 33 

file = text/santouka.txt Ngram = 3 
length = 67 

> head(textgram, 20)
                        Text
Ngram                    kishida.txt ogawa.txt santouka.txt
  [。——-木の芽-草]                 0         0            1
  [あさって-。——-木の芽]           0         0            1
  [あす-歩く-なる]                 0         0            1
  [ある-それ-一]                   0         0            1
  [ある-とる-ぼる]                 1         0            0
  [ある-よう-私]                   0         0            1
  [ある-身-賤]                     1         0            0
  [ある-静か-豊か]                 1         0            0
  [いま-時代-生きる]               1         0            0
  [いる-の-きのう]                 0         0            1
  [いる-られる-歩く]               0         0            1
  [いる-私-姉さん]                 0         1            0
  [いる-都-方]                     0         1            0
  [うつす-町-飯田]                 1         0            0
  [おん-みの-心]                   1         0            0
  [おん-みる-育つ]                 1         0            0
  [かげる-村-方]                   0         1            0
  [ガタ-馬車-らっぱ]               0         1            0
  [かりる-そ-め]                   1         0            0
  [きのう-歩く-きょう]             0         0            1

関数 NgramDF2 は、データフレームとしてNグラムを出力する。 第一引数は、テキストファイル、または、それらが格納されているフォルダとして解釈される。

> textgram2 <- NgramDF2("text", N = 3, type = 1, pos = c("名詞", "動詞"))
file_name =  text/kishida.txt opened
file_name =  text/ogawa.txt opened
file_name =  text/santouka.txt opened
number of extracted terms = 188

> head(textgram2, 20)
     Ngram1 Ngram2 Ngram3 kishida.txt ogawa.txt santouka.txt
1      。—— 木の芽     草           0         0            1
2  あさって   。—— 木の芽           0         0            1
3      あす   歩く   なる           0         0            1
4      ある   それ     一           0         0            1
5      ある   とる   ぼる           1         0            0
6      ある   よう     私           0         0            1
7      ある     身     賤           1         0            0
8      ある   静か   豊か           1         0            0
9      いま   時代 生きる           1         0            0
10     いる     の きのう           0         0            1
11     いる られる   歩く           0         0            1
12     いる     私 姉さん           0         1            0
13     いる     都     方           0         1            0
14   うつす     町   飯田           1         0            0
15     おん   みの     心           1         0            0
16     おん   みる   育つ           1         0            0
17   かげる     村     方           0         1            0
18   かりる     そ     め           1         0            0
19   きのう   歩く きょう           0         0            1
20   きょう   歩く   あす           0         0            1

関数 NgramDF2 では、オプション引数として minFreq で全テキストを通じて頻度合計の最小値を指定できる。 得られるNグラムは合計 minFreq値以上の頻度を持つNグラムが返される。

> textgram3 <- NgramDF2("text", N = 3, minFreq = 2, type = 1, pos = c("名詞", "動詞"))
file_name =  text/kishida.txt opened
file_name =  text/ogawa.txt opened
file_name =  text/santouka.txt opened
number of extracted terms = 6

> textgram3
  Ngram1 Ngram2 Ngram3 kishida.txt ogawa.txt santouka.txt
1   よそ   ほる   ひる           2         0            0
2     一     歩     一           0         0            2
3     前   立つ     鳥           0         2            0
4     歩     一     歩           0         0            2
5   立つ     鳥   いる           0         2            0
6   鳥屋     前   立つ           0         2            0

関数 docNgram2 は第一引数で指定されたフォルダ内のテキストに対してNグラムを求めて、各NグラムをtermとするTF値尾からなる検索語・文書行列を返す。

> gramMatrix <- docNgram2("text", N = 3, type = 1, pos = c("名詞", "動詞"))
file_name =  text/kishida.txt opened
file_name =  text/ogawa.txt opened
file_name =  text/santouka.txt opened
number of extracted terms = 188
to make matrix now

> head(gramMatrix, 20)
                       kishida.txt ogawa.txt santouka.txt
[。——-木の芽-草]                 0         0            1
[あさって-。——-木の芽]           0         0            1
[あす-歩く-なる]                 0         0            1
[ある-それ-一]                   0         0            1
[ある-とる-ぼる]                 1         0            0
[ある-よう-私]                   0         0            1
[ある-身-賤]                     1         0            0
[ある-静か-豊か]                 1         0            0
[いま-時代-生きる]               1         0            0
[いる-の-きのう]                 0         0            1
[いる-られる-歩く]               0         0            1
[いる-私-姉さん]                 0         1            0
[いる-都-方]                     0         1            0
[うつす-町-飯田]                 1         0            0
[おん-みの-心]                   1         0            0
[おん-みる-育つ]                 1         0            0
[かげる-村-方]                   0         1            0
[かりる-そ-め]                   1         0            0
[きのう-歩く-きょう]             0         0            1
[きょう-歩く-あす]               0         0            1