読者です 読者をやめる 読者になる 読者になる

Rを通じて統計学を学ぶ備忘録ブログ

SPSSからRに移行したい私のような人向けのR解説ブログ兼学習用備忘録。

テキストマイニングはじめました〜その3〜

前回に引き続きテキストマイニングについて勉強していきます。今回の目標は以下のとおりです。

RMeCabC()関数、RMeCabText()関数、RMeCabFreq()関数、RMeCabDF()関数を理解する

また、今回使用するフォントは「あおぞら明朝」です。

f:id:teruaki-sugiura:20160503132223p:plain

Rヘルプによれば、RMeCabC()関数は「MeCabで解析されたセンテンスをリストで返す関数」のようです。リストで返してくる関数なので、中身にアクセスするには×(二重括弧)で指定する必要があります。基本的なUsageは以下のとおりです。

RMeCabC(str, mypref)
str:日本語のテキストを指定
mypref:0=表層系、1=原型で返す

以下のテキストを用いて、RMeCabC()関数を使ってみます。

f:id:teruaki-sugiura:20160503140556p:plain

t1 <- RMeCabC(str = "私はボールを蹴った", mypref = 0)
t2 <- RMeCabC(str = "私はボールを蹴った", mypref = 1)
t1 <- unlist(t1)
t2 <- unlist(t2)
t1
t2

f:id:teruaki-sugiura:20160503135550p:plain

上記の例ではunlist()関数を用いて、リストで返ってきた結果をベクトルに変換させています。myprefで0を指定しているt1では「形態素表層系」が返され、t2では「原型」が返されています。

f:id:teruaki-sugiura:20160503140641p:plain

上記のテキストを使って、名詞だけを抽出してみます。そのためには、name()関数を使います。name()関数では、==で指定した名詞を抽出できます。

t3 <- unlist(RMeCabC(str = "庭には鶏が二羽いました", mypref = 0))
t3
t3 <- t3[names(t3) == "名詞"]
t3

f:id:teruaki-sugiura:20160503141839p:plain

f:id:teruaki-sugiura:20160503132226p:plain

次はRMeCabText()関数の使い方を見ていきます。Rヘルプによれば、RMeCabText()関数は「MeCabで解析されたテキストファイルをリストで返す関数」のようです。基本的なUsageは以下のとおりです。

RMeCabText(filename)
filename;作業ディレクトリにあるtxtファイル

今回使用する例文は長いので画像はありませんが、プレミアリーグで初優勝したレスターシティーの岡崎選手に関する記事の一文を解析します。

t1 <- RMeCabText(filename = "okazaki.txt")

f:id:teruaki-sugiura:20160503151100p:plain

長いので途中までしか貼り付けませんが、ご了承ねがいます。結果はリスト形式で返されています。また、リストの中はベクトルのようです。リストの中身は表層系、品詞分類、・・・、カナという順番に並んでいます。

f:id:teruaki-sugiura:20160503132225p:plain

次はRMeCabFreq()関数の使い方を見ていきます。Rヘルプによれば、RMeCabFreq()関数は「日本語のテキストファイルを対象に、形態素原型(活用形を)に変換し(restore)、その言葉と頻度をデータフレームにして返す関数」のようです。基本的なUsageは以下のとおりです。

RMeCabFreq(filename)
filename:作業ディレクトリにあるtxtファイル

今回使用する例文は長いので画像はありませんが、プレミアリーグで初優勝したレスターシティーの岡崎選手に関する記事の一文を解析します。

t1 <- RMeCabFreq(filename = "okazaki2.txt")
## t1 <- aggregate(t1$Freq, res[1:2], sum)
##似たようなものがつくれます。

f:id:teruaki-sugiura:20160503153531p:plain

長いので画像は中略します。左から、行番号、表層形、品詞、品詞再分類、頻度の順番に並んでいます。また、Length=125と表示されている部分は125個のタイプ(異なり語)があったことを表しています。そのため、このデータフレームは125 行あることになります。このテキストの「動詞」と「名詞」を抽出してみます。少しややこしい形になっていますが、日本語に無理やり翻訳すると、t1というデータフレームの行で、t1のinfo1の名詞とt1のinfo1の動詞を抽出してください、という感じです。

t2 <- t1[(t1$Info1 == "名詞"|t1$Info1 == "動詞"),]

f:id:teruaki-sugiura:20160503154601p:plain

長いので画像は中略します。助詞や記号などが削除され、動詞と名詞のみのデータフレームになっています。このテクニックを利用しつつ、以下の名作について考えてみます。

f:id:teruaki-sugiura:20160503162810p:plain

国語の教科書によく出てくる太宰治さんの作品ですね。メロスは激怒した。というフレーズが印象的すぎて、思い出した時に頭に浮かぶのは「なんかメロスは怒りながら、走りまくっていた」ということのみで、物語は全く思い出せません。笑

物語の内容はさておき、本当にメロスは怒りながら走っていたのでしょうか?その点をテキストマイニングで明らかにしていきます。

merosu <- RMeCabFreq("merosu.txt")
merosu1 <- merosu[((merosu$Info1 == "名詞" ) | (merosu$Info1 == "動詞")) & merosu$Freq > 10, ]
merosu2 <- merosu1[ ((merosu1$Info1 == "名詞" & merosu1$Info2 == "一般") | (merosu1$Info1 == "動詞" & merosu1$Info2 == "自立")),]
merosu3 <- merosu2[merosu2$Term != "する" & merosu2$Term != "なる", ]

f:id:teruaki-sugiura:20160503163347p:plain

この結果を見る限り、「怒る」を通り越して殺意(「殴る」「殺す」)を持ちながら走っている(「走る」)ようにも思えます。この解析ではメロスが誰かを殴ったり、殺したり、という主語との関係がわかりませんので、結論は保留せざるをおえません。強いていうならば、この結果から言えるのは、登場人物の誰かは、とにかく走りまわっていたようです。物語が思い出せないので、なんともいえませんがやっぱりメロスかな?

merosu[grep("走る", merosu$Term), ]

f:id:teruaki-sugiura:20160503172903p:plain

特定の語句を検索したい場合はgrep()関数から行えます。また、複数ある場合は、以下のように書けば検索できます。

merosu[grep("xxx | yyy | zzz", merosu$Term), ]

f:id:teruaki-sugiura:20160503132224p:plain

次はRMeCabDF()関数の使い方を見ていきます。Rヘルプによれば、RMeCabDF()関数は「第一引数にはデータフレーム、第二引数に指定された列を解析し、ブランクはNAに変換、myprefで0=表層系、1=原型をリストで返す関数」のようです。基本的なUsageは以下のとおりです。

RMeCabDF(dataf, coln, mypref)
dataf:作業ディレクトリにあるcsvファイル
coln:データフレーム内の自由記述がある列の番号or名前
mypref:0=表層系、1=原型で返す

yahooニュースのスポーツ記事(レスター優勝に関する記事)のコメント(comment)を適当に20個ほど抽出し、"okazaki.csv"として保存しいています。不正なマルチバイト文字が・・・と表示され、データを読み込めないので、file()関数を咬ましています。

t <- file("okazaki.csv", encoding="Shift-JIS")
t <- read.csv(t, header = TRUE)
t1 <- RMeCabDF(dataf = t, coln = "comment", mypref = 1) 
t1[17]

f:id:teruaki-sugiura:20160503171601p:plain

リストの中身はベクトル形式で保存されていることがわかります。行全体にアクセスしたいときは 、いつも通りt[ ,2]と書けば表示されます。

以上で今回はおしまい。

広告を非表示にする