形態素の頻度分析
参考文献
- 石田 基広、「Rによるテキストマイニング入門」森北出版(2010)
関数 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メロスはそんなには怒ってなかったのである。