====== HanDicをRとRMeCabで利用する ======
===== はじめに =====
ここではHanDicをオープンソースの統計解析システム[[https://www.r-project.org/|R]]および[[http://rmecab.jp/wiki/index.php?RMeCab|RMeCabパッケージ]]で利用する方法について紹介します.
用いた環境はMacOSX(10.8.5),MeCab(0.996),R(3.2.2),RMeCab(RMeCab_0.99991)です.解析用辞書にはHanDic(0.1)を用いました.Windowsでは動作確認をしていません.Windowsの場合,R Consoleでは文字化けが起こりますが,CSVなどにエクスポートすれば内容を確認することができるようです.
なお,グラフ描画の際にハングルが文字化けしないよう,[[http://kldp.net/projects/unfonts/|Un Fonts]]を利用することを前提としています.
==== 注意 ====
このページはHanDicをRMeCabで利用する,という点に主眼を置いて書かれたものです.筆者が統計解析やRに習熟しているわけではありませんので,解析の内容自体に意味がなかったり,誤りがあったりするかもしれないことをお断りしておきます.
また,HanDicによる形態素解析が誤っている可能性もありますので,その点ご承知おきください.
===== 準備 =====
==== mecabrcに辞書の場所を記述する ====
MeCabで形態素解析に用いる辞書の場所を指定します.[[howto#辞書を設定ファイルで指定する]]で説明したように,ホームディレクトリの''.mecabrc''に以下の内容を記述します.
dicdir = ~/dicdir/handic
上の例ではホームディレクトリの下にある''dicdir/handic''というディレクトリにある辞書を指定しています.MeCab実行時に''-d''オプションで辞書の場所を指定する,といった方法をとることができませんので,前もって場所を指定しておきます.
=== RMeCabの実行時に辞書の場所を指定する ===
''.mecabrc''に辞書の場所を記述すると,解析の際に常にその辞書が用いられることになります.RMeCabを実行する際に直接辞書の場所を指定する場合は,''.mecabrc''以外のファイルに上記の内容を書いておき,実行時に''mecabrc''を指定します.例えば''dot.mecabrc''というファイルに辞書の場所が記述してある場合は,Rコンソールで以下を実行します.
> library("RMeCab")
> res<-RMeCabFreq("target.txt", mecabrc="~/dot.mecabrc")
==== Rで必要なパッケージをインストールする ====
Rコンソールで,RMeCabとqgraphパッケージをインストールしておきます.
# RMeCabのインストール
> install.packages ("RMeCab", repos = "http://rmecab.jp/R")
# ライブラリのロードに失敗する場合は以下でインストール
> install.packages ("RMeCab", repos = "http://rmecab.jp/R", type = "source")
# igraphのインストール
> install.packages("igraph")
# qgraphのインストール
> install.packages("qgraph")
MacOSのMountain Lion(10.8.5)ではRMeCabのロードがうまくいかず,[[https://sites.google.com/site/rmecab/home/install|install - rmecab]]を参考にしてソースからインストールしました.
また,ここではネットワーク図の作成に際し,図の描画にはqgraphパッケージ([[https://cran.r-project.org/web/packages/qgraph/index.html|CRAN]],[[http://sachaepskamp.com/qgraph|作者]])とigraphパッケージ([[http://igraph.org/r/|配布元]])を用いています.
==== 解析するデータを準備する ====
HanDicを使って解析をするために,あらかじめ解析対象のテキストを字母に分解し,ファイルに保存しておきます.ここでは朴槿恵大統領と李明博前大統領の就任式スピーチをそれぞれ''jamo_18_ParkGH.txt'',''jamo_17_LeeMB.txt''として保存したものを利用します.データは[[http://www.pa.go.kr/research/index.jsp|대통령기록연구실]],경향신문の[[http://news.khan.co.kr/kh_news/khan_art_view.html?artid=201302251134391&code=910100|記事]]から取得し,1行1文に修正しました.
字母に分解する際にはPerlスクリプト''k2jamo.pl''([[https://osdn.jp/projects/handic/releases/63505|ここ]]で公開しています)を使っています.
perl k2jamo.pl 18_ParkGH.txt > jamo_18_ParkGH.txt
上記の手順,あるいは他の方法でも構いませんが,前もって字母に分解したテキストを準備しておきましょう.いくつかのテキストをホームディレクトリ下の''jamo_txt''というディレクトリに保存しておくと仮定して,以下のセクションに進みます.
===== RMeCabで解析する =====
RMeCabの機能については,配布元ホームページの[[http://rmecab.jp/wiki/index.php?RMeCabFunctions|機能説明]]部分などをご覧ください.以下ではいくつかの例だけ,簡単に取り上げます.
==== 頻度のカウント ====
''RMeCabFreq()''関数で李明博前大統領のスピーチを分析してみます.
# パッケージのロード
> library(RMeCab)
# テキストの格納
> targetText<-"jamo_17_LeeMB.txt"
# 頻度のカウント
> leemb<-RMeCabFreq(targetText)
file = ./jamo_17_LeeMB.txt
length = 1147
# 結果(一部)
> head(leemb)
Term Info1 Info2 Freq
1 걸맞 Adjective 自立 1
2 고통스럽 Adjective 自立 1
3 그래 Adjective 自立 4
4 그렇 Adjective 自立 4
5 넓으 Adjective 自立 1
6 눈물겹 Adjective 自立 1
# 頻度の降順でソート
> leemb_sort<-leemb[order(leemb$Freq, decreasing=TRUE),]
> head(leemb_sort)
Term Info1 Info2 Freq
922 . Symbol ピリオド 234
134 ㅂ니다 Ending 語尾 139
122 을 Ending 助詞 134
123 의 Ending 助詞 125
897 하 Suffix 動詞派生 104
162 습니다 Ending 語尾 91
# 名詞のみ抜き出す
> head(leemb_sort[grep("Noun", leemb_sort$Info1),])
Term Info1 Info2 Freq
360 국민 Noun 普通 30
196 우리 Noun 代名詞 26
218 수 Noun 依存名詞 23
522 사회 Noun 普通 22
205 것 Noun 依存名詞 21
398 나라 Noun 普通 21
# 動詞のみ抜き出す
> head(leemb_sort[grep("Verb", leemb_sort$Info1),])
Term Info1 Info2 Freq
1146 하 Verb 非自立 77
1142 있 Verb 非自立 14
994 되 Verb 自立 11
1120 하 Verb 自立 9
960 나서 Verb 自立 8
1078 위해 Verb 自立 8
最後に示した動詞の例で分かるように,活用形ごとに集計されています.石田基広・小林雄一郎(2013:64)では「活用語は基本形に変換されます」としているので,日本語の場合には基本形ごとに集計されるものと思われます.素性の順序の違いなどが関わっているのかもしれません.''.mecabrc''でMeCabの出力形式を変更すればうまくいくのでしょうか.現在のところ,解決できていません.
Windows版のRでは文字化けが起こって結果を確認できませんが,CSVなどに書き出せば問題ありませんでした(確認済み).
==== N-gramの抽出 ====
上記に引き続き,李明博前大統領のスピーチを対象として,N-gramを抽出してみます.
# Ngram()関数で文字単位のbigramを抽出
> ngram<-Ngram(targetText)
file = ./jamo_17_LeeMB.txt Ngram = 2
length = 787
# 結果の先頭部分
> head(ngram)
Ngram Freq
1 [!-7] 1
2 [!-ᄀ] 1
3 [!-ᄁ] 1
4 [!-ᄂ] 1
5 [!-ᄃ] 1
6 [!-ᄉ] 1
# 結果の末尾部分
> tail(ngram)
Ngram Freq
782 [’-ᄋ] 3
783 [ㆍ-ᄀ] 3
784 [ㆍ-ᄉ] 1
785 [ㆍ-ᄌ] 1
786 [使-)] 1
787 [勞-)] 1
# 形態素単位で名詞と助詞・語尾のtrigramを抽出
> ngram<-Ngram(targetText, type=1, N=3, pos=c("Noun", "Ending"))
file = ./jamo_17_LeeMB.txt Ngram = 3
length = 2738
# 結果の先頭部分
> head(ngram)
Ngram Freq
1 [ODA-를-확대] 1
2 [PKO-에-적극] 1
3 [UN-평화-유지] 1
4 [브코프-러시아-연방] 1
5 [츠-산업-의] 1
6 [프-우즈베키스탄-대통령] 1
# 結果を頻度の降順でソート
> ngram<-ngram[order(ngram[,2], decreasing=TRUE),]
# その結果(一部)
> head(ngram)
Ngram Freq
93 [ㄹ-것-ㅂ니다] 12
891 [는-국민-여러분] 11
2134 [을-야-ㅂ니다] 9
2496 [존경-는-국민] 9
103 [ㄹ-수-는] 6
1195 [를-야-ㅂ니다] 6
「…を(-를/을)〜しなければなりません(-아야/어야 합니다)」という表現が合わせて15回,高い頻度で使われているようです(2134と1195).
頻度のカウントと同じく,Windows版のRでは文字化けが起こって結果を確認できませんが,CSVなどに書き出せば問題ありませんでした(確認済み).
==== ネットワーク分析 ====
以下ではigraphとqgraphを利用した例を取り上げます.
=== 解析部分 ===
RMeCabで名詞(''Noun'')の単語bigramとその頻度を取得します.
# パッケージのロード
> library(RMeCab)
# テキストの格納
> targetText<-"jamo_18_ParkGH.txt"
# 名詞のbigramを取得
> res<-NgramDF(targetText, type=1, N=2, pos="Noun")
# 頻度の降順でソート
> res<-res[order(res[,3], decreasing=TRUE),]
# 頻度2以上のbigramを対象にデータを作成
> PlotData<-subset(res, res[,3]>1)
=== igraph ===
igraphでグラフを作成しますが,''plot()''ではハングルが表示できませんでした.そのため''tkplot()''で描画します.なお,[[http://xquartz.macosforge.org/landing/|XQuartz]]([[https://support.apple.com/ja-jp/HT201341|参照]])および''tcltk2''パッケージが必要です.
# パッケージのロード
> library("igraph")
> library("tcltk2")
# PlotDataをグラフオブジェクトに格納
> g<-graph.data.frame(PlotData)
# tkplot()で描画
> tkplot(g, vertex.label=V(g)$name, layout=layout.fruchterman.reingold, vertex.size=1)
結果は以下の通り.
{{:korean:tkplot_parkgh.png?direct&400|tkplotを用いて描画した朴槿恵大統領就任スピーチの単語ネットワーク}}
画面ではうまく表示されますが,PostScriptでエクスポートする際にハングルが文字化けします.また別の設定が必要かもしれません.
=== qgraph ===
qgraphではQuartzでハングルを表示させることができました.前もってフォントファミリーを作成し,描画の際にファミリーを指定する必要があります.以下ではUn DotumフォントとUn Graphicフォントを指定していますが,他のフォントでも大丈夫だろうと思います.
# グラフ表示用のフォントファミリー「UnDotum」を作成
quartzFonts( UnDotum = c("UnDotum", "UnDotum-Bold", "UnGraphic", "UnGraphic-Bold"))
# パッケージのロード
> library(qgraph)
# フォントファミリーを設定
par(family="UnDotum")
# 描画
qgraph(PlotData, layout="spring")
結果は以下の通り.
{{:korean:network_parkgh.png?direct&400|qgraphで描画した朴槿恵大統領就任スピーチの単語ネットワーク}}
「콘텐츠(コンテンツ)」がうまく分析されず,「콘」と「테」に分離されてしまっています.なお,結果はPDFに保存することができます.フォントは全て埋め込まれます.
ちなみに李明博前大統領の例は以下の通り.
{{:korean:network_leemb.png?direct&400|qgraphで描画した李明博大統領就任スピーチの単語ネットワーク}}
登場する語とそのつながりにかなり違いがあることが分かります.
なお,qgraphパッケージを利用した方法はWindows版Rでも試してみました(''quartzFonts()''関数ではなく''windowsFonts()''関数を用いる)が,やはり文字化けしました.
===== 参考文献・リンク =====
このページの作成にあたって,以下の書籍やウェブサイトを参考にしました.
* 石田基広(2008)『Rによるテキストマイニング入門』,東京:森北出版株式会社
* 石田基広・小林雄一郎(2013)『Rで学ぶ日本語テキストマイニング』,東京:ひつじ書房
* 金明哲(2009)『テキストデータの統計科学入門』,東京:岩波書店
* [[http://www1.doshisha.ac.jp/~mjin/R/61/61.html|統計的テキスト解析(6)~語のネットワーク分析~]]
* [[http://www.karada-good.net/analyticsr/r-62/|Rでウェブ解析:ツイート内容に含まれる単語をネットワーク図で表示]]
* [[http://sudori.info/stat/stat_fig_font.html|Rにおける作図時のフォント設定を極める]]
* [[http://qiita.com/y_benjo/items/a9376a96487d59cc9604|png/jpgなどにplotする際に適切に日本語文字列を描画する]]
* [[http://oku.edu.mie-u.ac.jp/~okumura/stat/graphs.html|グラフの描き方]]
* [[http://amano41.hateblo.jp/entry/2012/11/30/125556|Rのグラフで日本語を使う]]
* [[https://kohske.wordpress.com/2011/02/26/using-cjk-fonts-in-r-and-ggplot2/|Using CJK Fonts in R and ggplot2]]
記述に誤りなどがありましたら,筆者までお知らせください.
{{indexmenu_n>202}}