2016年3月30日水曜日

語句の出現頻度

前回、文章を形態素に分割(分かち書き)しました。でも、「文章をいちいち入力するのー?」と思われた方もおられるでしょう。便利なことに、テキストファイルを読み込むコマンドが用意されています。で、文章として著作権がフリーの青空文庫(https://www.aozora.gr.jp/)の作品を読み込んでみましょう。ここでは、宮沢賢治の「風の又三郎」を読み込みます。
青空文庫のホームページにアクセスして、作品をダウンロードしようとすると、「テキストファイル(ルビあり)」とか書いてあります。ルビ付きなんですね。ということは、テキスト処理するときは、それを取り除かないといけないですね。で、RMeCabにはまたまた便利な機能があるんです。青空文庫の作品を読み込んでくれて、しかもルビを削除してくれる関数が。以下のようにコマンドを打ちこんで下さい。
> source("http://rmecab.jp/R/Aozora.R")
> kaze <- Aozora(url = "https://www.aozora.gr.jp/cards/000081/files/462_ruby_716.zip")
> kaze
[1] "./NORUBY/kazeno_matasaburo2.txt"
>

ルビのないテキストファイルが、NORUBYというディレクトリに作られました。このkazeno_matasaburo2.txtというファイルをテキストエディタで開いて、確認してみて下さい。ここで形態素解析をして、各単語の出現頻度を求めてみましょう。
> library(RMeCab)
> freqapp <- RMeCabFreq(kaze)
file = ./NORUBY/kazeno_matasaburo2.txt 
length = 2025
> head(freqapp)
    Term    Info1 Info2 Freq
1     あ フィラー     *   28
2   あの フィラー     *    3
3 うんと フィラー     *    1
4     え フィラー     *    4
5 なんか フィラー     *    1
6     ま フィラー     *    4

Termというのが形態素で、Info1が品詞(大分類)、Info2が品詞細分類、Freqが出現頻度を表しています。フィラーというのは、デジタル大辞泉によれば、「埋めるもの」「詰め物」の意です。こういう語句は必要なかったりしますので、subsetという関数を使って、抽出したい品詞や除外したい品詞を指定します。で、大分類から「形容詞」を残して、細分類から数、非自立、接尾にあたる用語を除外します。
> freqapp1 <- subset(freqapp, Info1 %in% c("形容詞"))
> freqapp2 <- subset(freqapp1, !Info2 %in% c("数", "非自立", "接尾"))
> freqapp3 <- freqapp2[order(freqapp2$Freq, decreasing = T),]
(上のコマンドは、単語を出現頻度順に並べ直しているだけです。)
> head(freqapp3)
    Term  Info1 Info2 Freq
65  ない 形容詞  自立   43
114 白い 形容詞  自立   19
101 青い 形容詞  自立   15
38  いい 形容詞  自立   14
79  悪い 形容詞  自立   13
104 赤い 形容詞  自立   13

で、1列目(Term)と4列目(Freq)を抜き出してデータフレームを作った上で、上位20個に絞り込みます。
> freqapp1.df <- data.frame(word=as.character(freqapp3[,1]), freq=freqapp3[,4])
> freqapp2.df <- subset(freqapp1.df, rank(-freq)<20)

barplotを使って、ヒストグラムを表示してみましょう。「風の又三郎」は、不思議な物語です。それが、文章表現に表れているでしょうか。
> x <- freqapp2.df$freq
> names(x) <- freqapp2.df$word
> barplot(x, ylab = "Freq", las = 2)

0 件のコメント:

コメントを投稿