====== 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}}