ここではHanDicをオープンソースの統計解析システムRおよびRMeCabパッケージで利用する方法について紹介します.
用いた環境はMacOSX(10.8.5),MeCab(0.996),R(3.2.2),RMeCab(RMeCab_0.99991)です.解析用辞書にはHanDic(0.1)を用いました.Windowsでは動作確認をしていません.Windowsの場合,R Consoleでは文字化けが起こりますが,CSVなどにエクスポートすれば内容を確認することができるようです.
なお,グラフ描画の際にハングルが文字化けしないよう,Un Fontsを利用することを前提としています.
このページはHanDicをRMeCabで利用する,という点に主眼を置いて書かれたものです.筆者が統計解析やRに習熟しているわけではありませんので,解析の内容自体に意味がなかったり,誤りがあったりするかもしれないことをお断りしておきます.
また,HanDicによる形態素解析が誤っている可能性もありますので,その点ご承知おきください.
MeCabで形態素解析に用いる辞書の場所を指定します.辞書を設定ファイルで指定するで説明したように,ホームディレクトリの.mecabrc
に以下の内容を記述します.
dicdir = ~/dicdir/handic
上の例ではホームディレクトリの下にあるdicdir/handic
というディレクトリにある辞書を指定しています.MeCab実行時に-d
オプションで辞書の場所を指定する,といった方法をとることができませんので,前もって場所を指定しておきます.
.mecabrc
に辞書の場所を記述すると,解析の際に常にその辞書が用いられることになります.RMeCabを実行する際に直接辞書の場所を指定する場合は,.mecabrc
以外のファイルに上記の内容を書いておき,実行時にmecabrc
を指定します.例えばdot.mecabrc
というファイルに辞書の場所が記述してある場合は,Rコンソールで以下を実行します.
> library("RMeCab") > res<-RMeCabFreq("target.txt", mecabrc="~/dot.mecabrc")
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のロードがうまくいかず,install - rmecabを参考にしてソースからインストールしました.
また,ここではネットワーク図の作成に際し,図の描画にはqgraphパッケージ(CRAN,作者)とigraphパッケージ(配布元)を用いています.
HanDicを使って解析をするために,あらかじめ解析対象のテキストを字母に分解し,ファイルに保存しておきます.ここでは朴槿恵大統領と李明博前大統領の就任式スピーチをそれぞれjamo_18_ParkGH.txt
,jamo_17_LeeMB.txt
として保存したものを利用します.データは대통령기록연구실,경향신문の記事から取得し,1行1文に修正しました.
字母に分解する際にはPerlスクリプトk2jamo.pl
(ここで公開しています)を使っています.
perl k2jamo.pl 18_ParkGH.txt > jamo_18_ParkGH.txt
上記の手順,あるいは他の方法でも構いませんが,前もって字母に分解したテキストを準備しておきましょう.いくつかのテキストをホームディレクトリ下のjamo_txt
というディレクトリに保存しておくと仮定して,以下のセクションに進みます.
RMeCabの機能については,配布元ホームページの機能説明部分などをご覧ください.以下ではいくつかの例だけ,簡単に取り上げます.
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を抽出してみます.
# 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でグラフを作成しますが,plot()
ではハングルが表示できませんでした.そのためtkplot()
で描画します.なお,XQuartz(参照)および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)
結果は以下の通り.
画面ではうまく表示されますが,PostScriptでエクスポートする際にハングルが文字化けします.また別の設定が必要かもしれません.
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")
結果は以下の通り.
「콘텐츠(コンテンツ)」がうまく分析されず,「콘」と「테」に分離されてしまっています.なお,結果はPDFに保存することができます.フォントは全て埋め込まれます.
ちなみに李明博前大統領の例は以下の通り.
登場する語とそのつながりにかなり違いがあることが分かります.
なお,qgraphパッケージを利用した方法はWindows版Rでも試してみました(quartzFonts()
関数ではなくwindowsFonts()
関数を用いる)が,やはり文字化けしました.
このページの作成にあたって,以下の書籍やウェブサイトを参考にしました.
記述に誤りなどがありましたら,筆者までお知らせください.