某バイトというか勉強させてもらっているところ*1でRとMeCabでほげほげするようなのでインストールするよ!!Macです。
mecabと辞書のインストール
MeCab - Browse Files at SourceForge.netよりmecabとmecab-ipadicをダウンロード。win用以外のは辞書が含まれていないらしいので、辞書もダウンロードしてくる。両方ともディレクトリに移動して以下を実行すればおk。
./configure --with-charset=utf-8
make
chmod 700 install-sh
sudo make install
こんな感じで結果が返ってくればインストールできてるっぽい。
/Users/yasuhisa/Downloads/mecab-ipadic-2.7.0-20070801% echo 'install log' | mecab install 名詞,固有名詞,組織,*,*,*,* log 名詞,一般,*,*,*,*,* EOS
RMeCabのインストール
Google グループよりファイルをダウンロード。mac用はtgzファイルのやつだそうです。あと久しぶりにRのGUIを立ち上げたところ、localeがなんか変とか言われたのでこの辺を実行しておいた。
safariでダウンロードするとtgzファイルがtarファイルになってしまっているということに気づかず無駄に時間がかかってしまうなど。。。Firefoxでgetしてきて
setwd("~/Desktop") install.packages("RMeCab_0.78.tgz",destdir=".",repos=NULL) library(RMeCab)
とかでやっと入った。
Twitterの発言を適当に拾ってきて、こんな感じでやるとなんかできた。
> RMeCabC("1993年までは、30歳が高齢出産の基準だったらしい。") [[1]] 名詞 "1993" [[2]] 名詞 "年" [[3]] 助詞 "まで" [[4]] 助詞 "は" [[5]] 記号 "、" [[6]] 名詞 "30" [[7]] 名詞 "歳" [[8]] 助詞 "が" [[9]] 名詞 "高齢" [[10]] 名詞 "出産" [[11]] 助詞 "の" [[12]] 名詞 "基準" [[13]] 助動詞 "だっ" [[14]] 助動詞 "た" [[15]] 助動詞 "らしい" [[16]] 記号 "。"
色々使ってみる
Rによるテキストマイニング入門の5章を参考にしながらやってます。この前やつでやってみる。以下の文章を/tmp/hoge.txtに保存。
自分の居間まで重そうな母の言葉は母も聞きます。 彼はどこへか行って、いつも古本屋に売るさ」。 先生の宅とこの木の下を歩いていた。 ところが実際は、あなたがた顫え出したつもりでいたのですが、一年と立ち二年と過ぎ、もう一杯上げます。 その時分から、Kの墓へ毎月お参りをしようとしたのです。 私は迂闊な青年であった。 けれども無理はないそのたびに先生のこの病は慢性であったのです。 しかし決して使われた。 だから、私までも引き留めたでしょうけれども事情にうといったでしょうか」「綺麗に刈り込んだ時、私はまた腕組みをしてよそを向いて、もし坊さんは二、三日前晩食に呼ばれそうに見えました。 日本の女らしく思う気は少しも起ります。
解析したいテキストがファイルの場合は、RMeCabText関数を呼ぶとよいようだ。
> head(RMeCabText("hoge.txt")) file = hoge.txt [[1]] [1] "自分" "名詞" "一般" "*" "*" "*" "*" "自分" [9] "ジブン" "ジブン" [[2]] [1] "の" "助詞" "連体化" "*" "*" "*" "*" "の" [9] "ノ" "ノ" [[3]] [1] "居間" "名詞" "一般" "*" "*" "*" "*" "居間" "イマ" "イマ" [[4]] [1] "まで" "助詞" "副助詞" "*" "*" "*" "*" "まで" [9] "マデ" "マデ" [[5]] [1] "重" "形容詞" "自立" "*" [5] "*" "形容詞・アウオ段" "ガル接続" "重い" [9] "オモ" "オモ" [[6]] [1] "そう" "名詞" "接尾" "助動詞語幹" "*" [6] "*" "*" "そう" "ソウ" "ソー"
リストの各要素はベクトルでどういうのかというと
出力フォーマットは, ChaSen のそれと大きく異なります. 左から,
表層形\t品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用形,活用型,原形,読み,発音
http://mecab.sourceforge.net/#usage-tools
となっています.
というふうになっているようだ。lapplyとかと合わせて使うとリストの必要な要素が取ってこれそうですね。
RMeCabFreqという関数を使うと登場回数というか頻度のカウントができる。table関数みたいなやつですね。
> head(RMeCabFreq("hoge.txt")) file = hoge.txt length = 108 Term Info1 Info2 Freq 1 え フィラー * 1 2 いつも 副詞 一般 1 3 もう 副詞 一般 1 4 もし 副詞 一般 1 5 決して 副詞 一般 1 6 実際 副詞 助詞類接続 1
登場頻度が高い上位10個が欲しいなーとか思った時はこんな感じにすればおk。なんかdata.frameのもっと効率のいい方法があった気がするけど、まあとりあえず。
> d <- RMeCabFreq("hoge.txt") file = hoge.txt length = 108 > tail(d[order(d$Freq),],n=10) Term Info1 Info2 Freq 26 と 助詞 格助詞 4 28 に 助詞 格助詞 4 30 を 助詞 格助詞 4 11 だ 助動詞 * 5 12 です 助動詞 * 5 32 の 助詞 連体化 6 15 は 助詞 係助詞 9 106 、 記号 読点 9 10 た 助動詞 * 10 103 。 記号 句点 10
助詞とかその辺は取り除いたほうがいいんだろうけど、まあいいか(ぉ。
ターム文章行列
文章間の相関とかそういうのを見る時にはそれぞれの文章における単語の登場回数のようなものを見る必要がある。そういうのをやるときに使うのが、ターム文章行列(term-document matrix)というやつらしい。RMeCabには付属のテキストっぽいのが3つほどある。
/Library/Frameworks/R.framework/Resources/library/RMeCab/data% ls doc1.txt doc2.txt doc3.txt
で、このディレクトリにあるテキストを用いて、ターム文章行列を作る関数がdocMatrix関数。こんな感じで使う。
> setwd("/Library/Frameworks/R.framework/Resources/library/RMeCab") > (docMatrix("data")) file = data/doc1.txt file = data/doc2.txt file = data/doc3.txt Term Document Matrix includes 2 information rows! whose names are [[LESS-THAN-1]] and [[TOTAL-TOKENS]] if you remove these rows, run result[ row.names(result) != "[[LESS-THAN-1]]" , ] result[ row.names(result) != "[[TOTAL-TOKENS]]" , ] docs terms doc1.txt doc2.txt doc3.txt [[LESS-THAN-1]] 0 0 0 [[TOTAL-TOKENS]] 4 4 8 僕 1 0 0 学生 1 1 0 彼女 0 1 1 いる 0 0 1 学ぶ 0 0 1 数学 0 0 1
「TOTAL-TOKENS」とかの詳細はRによるテキストマイニング入門のP62とかを見てくだしあ。
例
3つの文章だけじゃ面白くないので、自分のはてなグループに上げている日記のテキストに対してターム文章行列を作り、相関を見ることにしてみた。
> setwd("~/hatena/syou6162/group") > res <- (docMatrix("syou6162",pos=c("名詞","形容詞"))) file = syou6162/#2008-04-29.txt# empty results file = syou6162/2007-02-24.txt file = syou6162/2007-03-02.txt > cor(res)[1:3,1:3] 2007-02-24.txt 2007-03-02.txt 2007-03-03.txt 2007-02-24.txt 1.0000000 0.9911255 0.9911041 2007-03-02.txt 0.9911255 1.0000000 0.9905790 2007-03-03.txt 0.9911041 0.9905790 1.0000000
行列めちゃでかいので、3*3で取り出してみたんだけど、めっちゃ相関が高い。たぶん頻度が0のやつが多いのが影響しているんだろうな。。。ということで検証してみる。
sum(apply(res,1,sum) > 3) / nrow(res) * 100 [1] 34.80176
ターム文章行列を横に見ていったとき、登場回数が3回より多いというのは30%くらいしかないのが分かる。単語の数は多いんだけど、それぞれの単語の登場回数は少ないということで疎な行列っぽいんだなーということがなんとなく分かる。
N-gram
N-gramはこの前やったんだけど、RMeCab付属のN-gramの関数でやってみる。文章はこの前のと同じ。> setwd("/tmp") > d <- Ngram("hoge.txt",N=4) file = hoge.txt Ngram = 4 length = 290 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * > tail(d[order(d$Freq),]) Ngram Freq 55 [け-れ-ど-も] 2 92 [た-で-し-ょ] 2 111 [で-あ-っ-た] 2 113 [で-し-ょ-う] 2 140 [の-で-す-。] 2 93 [た-の-で-す] 3
まあ、もちろん結果は変わらないけど。
その他
プラットフォームによって辞書の整備のされかたが違ったりすることがあるので、特定単語について調べるときは注意が必要らしい。なお、MeCabは自分で辞書を更新することができるとのこと。
Text mining e sentiment analysis con R
- 作者: Valentina Porcu
- 出版社/メーカー: Valentina Porcu
- 発売日: 2016/10/23
- メディア: Kindle版
- この商品を含むブログを見る
*1:なんという環境!!