からっぽのしょこ

読んだら書く!書いたら読む!読書読読書読書♪同じ事は二度調べ(たく)ない

【テキストマイニング入門】R言語で文書中の単語の出現頻度表を作成する【やってみた】

〇はじめに

 はじめまして!実質初記事です。よろしくお願いします。まずPC環境周りの情報とか載せるべきなのでしょうがその内書き足します。レイアウト的なのもその内調べて改修予定です。(そういう事を始めに調べ出すのは、自分がやらない理由作りをする時の行動パターンだと理解しているので、、)

 それではこちらの本を教科書として、これから暫くテキストマイニングをしていきます。

・参考書籍

『Rによるテキストマイニング入門』石田基広,森北出版株式会社
『Rによるやさしいテキストマイニング』シリーズ,小林雄一郎,オーム社

〇やってみた

 テキストマイニングとは…、R言語とは…、MeCabとは…、から始めるべきなのでしょうが割愛します。ある程度記事がたまって体系立ててまとめる段階でそういう記事を書くかと思います。

 テキストマイニングの第一歩である「使用されている単語の頻度を計測する」をやってみます。題材としてモーニング娘。'18のシングル5曲を用います。歌詞そのものは著作権的に掲載できないので、元データを確認する際には適宜ググってください。※テキスト内に英単語が含まれる歌詞はテキスト分析に向いていません。

・分析対象データ

"mor18"という名前のディレクトリ内に以下の名前のテキストファイルが入っている状態です。

  • ファイル名:曲タイトル
  • mor18_65a.txt:A you Happy? 
  • mor18_65b.txt:A ganna
  • mor18_66a.txt:フラリ銀座
  • mor18_66b.txt:自由な国だから
  • mor18_66c.txt:Y字路の途中

・テキストで使用されている単語の頻度を調べる

 まずは、1つのテキストファイル(文書)から単語の出現頻度を計測して、表を作成します。例としてmor18_65a.txt(A you Happy?)を使います。

library(RMeCab)
freq1 <- RMeCabFreq("mor18/mor18_65a.txt")

f:id:anemptyarchive:20181202222303p:plain
出現頻度上位10語
 上のように、概ね助詞が多い結果となります。文章の内容を把握するためには、機能的な役割の助詞に注目してもあまり意味がありません。そこで名詞・動詞・形容詞に絞って頻度を調べます。

freq2 <- docDF("mor18/mor18_65a.txt", type = 1, pos = "名詞", "動詞", "形容詞")

f:id:anemptyarchive:20181202223308p:plain
出現頻度上位10語(名詞・動詞・形容詞)
 このように、意味を示す役割である名詞・動詞・形容詞に注目することで、歌詞の意味をある程度捉えられる集計結果となります。

・複数テキストを扱う場合

 次に5つの文書全てをまとめた表を作成します。

file_name <- list.files("mor18")
file_path <- paste("mor18", file_name, sep = "/")
freq3 <- data.frame()
for(i in 1:length(file_path)) {
  tmp1  <- file_path[i]
  tmp2  <- docDF(tmp1, type = 1, pos = "名詞", "動詞", "形容詞")
  tmp3  <- rename(tmp2, FREQ = file_name[i])
  freq3 <- rbind(freq3, tmp3)
}

f:id:anemptyarchive:20181202233034p:plain
TERMでソートした上から
 これは5つの文書を1つの表に単に縦に繋げた状態になります。TERMでソートすると「愛」が4つ「一」が2つのように、同じ単語が別々になってしまいます。なので続いて、同じ単語の頻度を足し合わせます。

library(dplyr)
freq4 <- freq3 %>% 
         select(TERM, POS1, FREQ) %>%
         group_by(TERM, POS1) %>%
         summarise(FREQ = sum(FREQ))

f:id:anemptyarchive:20181203012508p:plain
出現頻度上位15語
 「愛」が足し合わされて20回になりました(MeCabでは英単語の分析ができないみたいで「A」などの英単語が名詞となっている。「の」が名詞になってるのは謎)。ついでに、歌詞だとサビで使われている単語が1曲の中で何度も繰り返しカウントされることになりますよね。大切な事なので何回も言っているのでしょうが、1つの文書の中で繰り返される単語を1回として数えてみます。つまり、全文書の中でいくつの文書に出現したのかをカウントします。

freq5 <- data.frame()
for(i in 1:length(file_path)) {
  tmp1  <- file_path[i]
  tmp2  <- docDF(tmp1, type = 1, pos = "名詞", "動詞", "形容詞")
  FREQ  <- rep(1:1, length = length(tmp2$TERM))
  tmp3  <- cbind(tmp2[,-4], FREQ)
  freq5 <- rbind(freq5, tmp3)
}
freq6 <- freq5 %>% 
         select(TERM, POS1, FREQ) %>%
         group_by(TERM, POS1) %>%
         summarise(FREQ = sum(FREQ))

f:id:anemptyarchive:20181203023012p:plain
使用頻度上位15語
 もっと素直な方法がありそうですが見つからないので、全て"1"の"FREQ"を作って入れ替えています。

・TF-IDF

 ある単語がその文章の特徴をどのくらい表しているかを示す値としてTF-IDFというものがあります。TF(Term Frequency)は1つの文書内における出現頻度。IDF(Inverse Document Frequency)は全ての文書の内いくつの文書にその単語が出現しているのかの割合の逆数の対数を取ったもの。この2つの値を掛け合わせたものがTF-IDFです。
 理論的な話は別の機会にするとして、要は「テキスト内で何度も出現する単語はそのテキストを特徴付けている単語である。逆に多くの文書に出現する単語は、テキストを特徴付けるものではない(他では使われずこの文書でだけ出現する単語の方が特徴付けが強い)。」ということです。

tfidf1 <- docMatrix("mor18", weight = "tf*idf*norm")
tfidf2 <- as.data.frame(tfidf1)

f:id:anemptyarchive:20181203033021p:plain
単語文書行列の上から20個
f:id:anemptyarchive:20181203033220p:plain
値の高い15個
 出力されたマトリックスをデータフレーム化して並び変えたものを見ると、タイトルになっている「A ganna」の値が大きくなっているのが分かると思います(注釈:大阪出身のメンバーの卒業曲でして「えーがなえーがな(A ganna)」と何回も繰り返される曲なんです)。分割されてますがY字路の「字路」や「銀座」もタイトルに含まれる単語ですね。うまく特徴的な単語が上位になったと言っていいのではないでしょうか。

おわりに

 今回は頻度に注目してみました。次は視覚化する予定です。
www.anarchive-beta.com

 最後まで読んでいただきありがとうございました!何かお気づきの事があれば、ご指摘いただけると大変ありがたいです。是非ともよろしくお願いします。