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

MeCabとRMeCabをインストールして、ちょっと遊んでみる

R MeCab 自然言語処理

某バイトというか勉強させてもらっているところ*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        81        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

Text mining e sentiment analysis con R

*1:なんという環境!!