形態素の頻度分析

参考文献

関数 RMeCabFreq( ) は指定されたテキストファイルを形態素解析して、その活用形を原形に変換した上で、その頻度を数えて、結果をデータフレームとして返す関数である。

テキスト中に現れる特定の品詞の数を調べることだけによっても、興味深いテキスト解析を得ることができる。 たとえば、特定分野で頻出する単語の大きさを視覚的に変化させて表示させるタグクラウド(tag cloud)などはその実例だ。

青空文庫で公開されている中原中也の詩集「山羊の歌」から取り出した『汚れつちまつた悲しみに……』をテキストファイルにしておいた(ただし、文字符号化がUTF-8となっているのでブラウザの設定によっては表示が乱れる場合がある。 また、WindowsでRを利用する場合にはデフォルト文字符号化を Shift-JIS に設定している場合には、文字符号化変換する必要がある)。 このファイルを関数 RMeCabFreq で読み込んで形態素解析を行ってみよう。

> library(RMeCab)

> nakahara <- RMeCabFreq("nakahara.txt")
file = nakahara.txt 
length = 45 
> str(nakahara)
'data.frame':	45 obs. of  4 variables:
 $ Term : chr  "かつて" "た" "つ" "は" ...
 $ Info1: chr  "副詞" "助動詞" "助動詞" "助詞" ...
 $ Info2: chr  "一般" "*" "*" "係助詞" ...
 $ Freq : int  1 8 8 5 4 1 5 1 1 1 ...
上の結果から分かるように、RMeCabFreq( )で返されるデータフレームの各列には、Term, Info1, Info2, Freq のラベルでアクセスすることができます。 Termは形態素の原形、Info1は品詞名(大分類)、Info2は品詞の小分類、そしてFreqが形態素の頻度です。

名詞だけを取り出したければ,次のようにします。 データフレーム nakahara の行指定において、 nakahara$Info1 == "名詞" によってTRUEであるような行だけを(全ての列データ)表示していることにちゅうしてください。 「悲しみ」が8回、「今日」が2回登場したことがわかります。

> nakahara2 <- nakahara[nakahara$Info1 == "名詞", ]
> nakahara2
               Term Info1    Info2 Freq
23             倦怠  名詞 サ変接続    1
24               む  名詞     一般    1
25 むなくねがふなく  名詞     一般    1
26               夢  名詞     一般    1
27             小雪  名詞     一般    2
28             怖気  名詞     一般    1
29           悲しみ  名詞     一般    8
30               死  名詞     一般    1
31               狐  名詞     一般    1
32               裘  名詞     一般    1
33               革  名詞     一般    1
34               風  名詞     一般    1
35             なに  名詞   代名詞    1
36             今日  名詞 副詞可能    2
37               さ  名詞     接尾    1
38             うち  名詞   非自立    1
39           ところ  名詞   非自立    1
40               の  名詞   非自立    1
41               日  名詞   非自立    1
名詞と動詞(正確には、「名詞」または「動詞」)を取り出したければ,次のようにします。 データフレーム nakahara の行指定において、TRUEとなる行条件を 論理和 "|" で動詞も指定していることに注意します。 ここでは、「ちる」「まつ」が動詞原形として8回数えられていますが、この結果は正しくありませんね。 「汚れる」が8回登場は正しいです。 このように、形態素解析結果が適切かどうかを常に注意深く検証する必要があることが大切だとわかりましたね。
> nakahara3 <- nakahara[ ( nakahara$Info1 == "名詞" | nakahara$Info1 == "動詞" ), ]
> nakahara3
               Term Info1    Info2 Freq
13       ちぢこまる  動詞     自立    1
14             ちる  動詞     自立    8
15             づく  動詞     自立    1
16             なす  動詞     自立    1
17             まつ  動詞     自立    8
18             吹く  動詞     自立    1
19           暮れる  動詞     自立    1
20           汚れる  動詞     自立    8
21       降りかかる  動詞     自立    1
22           すぎる  動詞   非自立    1
23             倦怠  名詞 サ変接続    1
24               む  名詞     一般    1
25 むなくねがふなく  名詞     一般    1
26               夢  名詞     一般    1
27             小雪  名詞     一般    2
28             怖気  名詞     一般    1
29           悲しみ  名詞     一般    8
30               死  名詞     一般    1
31               狐  名詞     一般    1
32               裘  名詞     一般    1
33               革  名詞     一般    1
34               風  名詞     一般    1
35             なに  名詞   代名詞    1
36             今日  名詞 副詞可能    2
37               さ  名詞     接尾    1
38             うち  名詞   非自立    1
39           ところ  名詞   非自立    1
40               の  名詞   非自立    1
41               日  名詞   非自立    1
形態素解析によって目的の語彙を取り出すためには、辞書を整備すること、および、形態素の品詞指定を大分類と小分類とできめ細かく行うことが必要になります。

メロスはどのくらい怒っていたか

青空文庫から太宰治の『走れメロス』をルビを取り除いておいてあります(ただし、文字符号化がUTF-8となっているので表示が乱れる場合があります。また、Windowsで利用する場合にはShift-JISに文字符号化を変換する必要があります)。 これを読み込んで、形態素の頻度を調べてみよう。

次のように、1327行からなるデータフレームが返ってきます。

> merosu <- RMeCabFreq("merosu.txt")
file = merosu.txt 
length = 1327 
> str(merosu)
'data.frame':	1327 obs. of  4 variables:
 $ Term : chr  "え" "いくぶん" "いよいよ" "うんと" ...
 $ Info1: chr  "フィラー" "副詞" "副詞" "副詞" ...
 $ Info2: chr  "*" "一般" "一般" "一般" ...
 $ Freq : int  1 1 2 2 1 1 3 1 1 1 ...
一般名詞(Info1が"名詞"であってInfo2が"一般")または自立動詞(Info1が"動詞"であってInfo2が"自立")の形態素を抽出してみよう。 次のように737行の結果が返ります。
> merosu2 <- merosu[ (merosu$Info1 == "名詞" & merosu$Info2 == "一般") | (merosu$Info1 == "動詞" & merosu$Info2 == "自立"), ]
> str(merosu2)
'data.frame':	737 obs. of  4 variables:
 $ Term : chr  "あからめる" "あげる" "ある" "あるく" ...
 $ Info1: chr  "動詞" "動詞" "動詞" "動詞" ...
 $ Info2: chr  "自立" "自立" "自立" "自立" ...
 $ Freq : int  2 2 9 1 3 1 6 1 2 1 ...
そこで、さらに絞り込むことにして頻度が7以上を抽出します。 これで、一気に減って、26行となりました。
> merosu3 <- merosu[ ((merosu$Info1 == "名詞" & merosu$Info2 == "一般") | (merosu$Info1 == "動詞" & merosu$Info2 == "自立")) & merosu$Freq > 7, ]
> str(merosu3)
'data.frame':	26 obs. of  4 variables:
 $ Term : chr  "ある" "する" "なる" "信じる" ...
 $ Info1: chr  "動詞" "動詞" "動詞" "動詞" ...
 $ Info2: chr  "自立" "自立" "自立" "自立" ...
 $ Freq : int  9 74 26 11 12 9 9 10 11 17 ...
> merosu3
                 Term Info1 Info2 Freq
201              ある  動詞  自立    9
230              する  動詞  自立   74
251              なる  動詞  自立   26
291            信じる  動詞  自立   11
302            出来る  動詞  自立   12
347              帰る  動詞  自立    9
354              待つ  動詞  自立    9
405              死ぬ  動詞  自立   10
408              殴る  動詞  自立   11
409              殺す  動詞  自立   17
411              沈む  動詞  自立    8
448              笑う  動詞  自立    8
479              言う  動詞  自立   13
493              走る  動詞  自立   24
676              わし  名詞  一般    8
681  セリヌンティウス  名詞  一般   14
687            メロス  名詞  一般   73
709                人  名詞  一般   20
735                友  名詞  一般   18
767                声  名詞  一般    9
786                妹  名詞  一般   12
814                市  名詞  一般   11
870                村  名詞  一般    9
925                王  名詞  一般   16
929                男  名詞  一般   12
1033               陽  名詞  一般    8
さらに、自明な動詞である「ある」、「する」、「なる」を取り除いておこう。
> merosu4 <- merosu3[merosu3$Term != "ある" & merosu3$Term != "する" & merosu3$Term != "なる", ]
> merosu4
                 Term Info1 Info2 Freq
291            信じる  動詞  自立   11
302            出来る  動詞  自立   12
347              帰る  動詞  自立    9
354              待つ  動詞  自立    9
405              死ぬ  動詞  自立   10
408              殴る  動詞  自立   11
409              殺す  動詞  自立   17
411              沈む  動詞  自立    8
448              笑う  動詞  自立    8
479              言う  動詞  自立   13
493              走る  動詞  自立   24
676              わし  名詞  一般    8
681  セリヌンティウス  名詞  一般   14
687            メロス  名詞  一般   73
709                人  名詞  一般   20
735                友  名詞  一般   18
767                声  名詞  一般    9
786                妹  名詞  一般   12
814                市  名詞  一般   11
870                村  名詞  一般    9
925                王  名詞  一般   16
929                男  名詞  一般   12
1033               陽  名詞  一般    8
このデータフレーム merosu4 のTerm列を走れメロスにおける登場頻度7以上の主要単語であると見なそう。 念のために、「激怒」を調べておこう。
> merosu[merosu$Term == "激怒する", ]
[1] Term  Info1 Info2 Freq 
 <0 行> (または長さ0のrow.names) 
> merosu[merosu$Term == "激怒", ]
    Term Info1    Info2 Freq
602 激怒  名詞 サ変接続    2
メロスはそんなには怒ってなかったのである。