2017.12.15 Friday
スポンサーサイト
一定期間更新がないため広告を表示しています
| スポンサードリンク | - | | - | - |
関口宏司のLuceneブログOSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
2012.07.28 Saturday
CaboChaと京都コーパスで交差検定
ロンドンオリンピック真っ最中で仕事がはかどらない中、日本語係り受け解析器CaboChaと京都コーパスで交差検定を行ったのでメモを残す。
この作業の目的は、本件交差検定というよりはどちらかというとこの作業を通じてCaboChaの学習や評価のツールを正しく使えるように私自身が練習し、作業記録を残すことである。また、必要に応じてテキスト処理のためのツールを整備することも行う。 以下の作業では京都コーパスの方は毎日新聞のCD-ROMを用意し、付属のauto_convを実行した後のデータがあることを前提とする。なおこの方法で作成したモデルファイルは(そしてCaboChaが現在デフォルトで内包しているモデルファイルも)学術研究用に利用が限定されることをここで念のため書き添えておく。 CaboChaのツールで共通して使えるmode(-eオプション)はchunk,dep,neのうち、chunkを用いることにした。depは学習(cabocha-learnの実行)に4時間かけても終わらなかったため、残念ながら時間的な制約から今回は作業対象からはずした。また、入手できたデータにneタグがついていなかったため、neも同様に対象外とした。 文字コードはコーパスに合わせてEUCを選択。京都コーパスのdat/syn/ ディレクトリにある拡張子が.KNPの全ファイルをファイル単位で5分割して交差検定を行う。ファイル数は28個なのでこれを上から6個、6個、6個、5個、5個ずつまとめて各グループとし(下表)、5グループのCaboCha形式の学習データを得る。なお、5分割の5の根拠は特にない。
またG5N.datのCaboCha形式の学習データから、1カラム目の単語情報を抜き出して原文テキストを逆再生し、それをS5N-x.txtというテキストファイルにする。ここで"-x"の部分は"-01"から"-20"程度の値をとるように分割する(G5N.datを対応するひとつの原文テキストファイルにするとcabochaコマンドで解析するには大きすぎるため、複数個のS5N-x.txtファイルに分割している)。評価時のことも考慮すると、G5N.datはS5N-x.txtと対応する正解データのファイルG5N-eval-x.datに分けておく(ただし、評価は後述するようにCaboCha付属の評価ツールが使えなかったので、結果としてG5N-eval-x.datは不要になった)。これらのファイルを出力するプログラムmake_source.rbは別途自作した。 上記のCaboCha形式の学習データを1つ残して4つずつまとめて学習させ、下表の5通りのモデルファイルと正解データのペアを得る。
また、Juman辞書のバージョン(?)の違いのせいか、はたまた形態素解析器の違いのせいかどうかはわからないが、京都コーパスの形態素の単位と、今回cabochaで原文テキストを解析したときの形態素の単位が異なってしまい、結果としてCaboChaの評価ツールcabocha-system-evalが動かなかった(tree size is differentやToken size is differentというエラーになる)。形態素の単位が異なる部分としては、具体的には次のような部分である: $ diff c.txt d.txt 89,90c89 < 至ら 動詞,*,子音動詞ラ行,未然形,至る,いたら,* < ない 接尾辞,形容詞性述語接尾辞,イ形容詞アウオ段,基本形,ない,ない,* --- > 至らない 形容詞,*,イ形容詞アウオ段,基本形,至らない,いたらない,代表表記:至らない この問題に対応するため、形態素を文節ごとにまとめて文節番号とともに出力し、1文で1行に出力するプログラムnorm_chunk.rbを自作した。このプログラムを使うと、CaboChaの出力を次のように正規化できる: $ ruby norm_chunk.rb G51-eval-1.dat (0)村山富市首相は(1)年頭に(2)あたり(3)首相官邸で(4)内閣記者会と(5)二十八日(6)会見し、(7)社会党の(8)新民主連合所属議員の(9)離党問題に(10)ついて(11)「政権に(12)影響を(13)及ぼす(14)ことには(15)ならない。(16)離党者が(17)いても、(18)その(19)範囲に(20)とどまると(21)思う」と(22)述べ、(23)大量離党には(24)至らないとの(25)見通しを(26)示した。 : そして評価は、CaboChaの出力と正解データの出力をともにnorm_chunk.rbにかけ、それらをdiffで比較することで異なる文の数(異なる行数)をカウントすることで評価することにした。異なる部分の例として、diff出力の一部を以下に記す: $ diff a-diff-source.txt G51-diff-source.txt 46c46 < (0)世界が(1)アッと(2)驚く(3)若い(4)首相が(5)誕生し、(6)がんじがらめの(7)規制が(8)たった(9)一本の(10)法律で(11)撤廃された(12)――新春の(13)初夢であり、(14)期待です。 --- > (0)世界が(1)アッと(2)驚く(3)若い(4)首相が(5)誕生し、(6)がんじがらめの(7)規制が(8)たった(9)一本の(10)法律で(11)撤廃された――(12)新春の(13)初夢であり、(14)期待です。 : ただ、正解データとcabochaの出力の異なる文を表示するにはdiffコマンドは便利だが、両方のテキストファイルを比べて正解率(文節がすべて一致する文の割合)を見るには不便なので、別途この目的だけに使える簡易diffプログラムdiff_chunk.rbを作成した。 今回作成したプログラム 前述の通り、今回の作業のため以下のmake_source.rb, norm_chunk.rbおよびdiff_chunk.rbの3つのプログラムを自作したのでそれを記す: make_source.rb SPS = 400 # number of Sentences Per Source ifname = "G#{ARGV[0]}.dat" $osfprefix = "S#{ARGV[0]}" $oefprefix = "G#{ARGV[0]}-eval" $onum = 0 def next_out_files $onum = $onum + 1 ofname1 = sprintf("%s-%02d.txt", $osfprefix, $onum) ofname2 = sprintf("%s-%02d.dat", $oefprefix, $onum) return File.open(ofname1,"w"), File.open(ofname2,"w") end # osfile : output source file # oefile : output eval file osfile, oefile = next_out_files count = 0 # EOS(sentence) counter File.open(ifname){ |ifile| while line = ifile.gets oefile.puts line next if /¥A¥*/ =~ line if /¥AEOS/ =~ line osfile.print "¥n" # print CRLF for EOS count = count + 1 if count > SPS osfile.close oefile.close osfile, oefile = next_out_files count = 0 end next end osfile.print line.split(nil)[0] end } osfile.close oefile.close norm_chunk.rb ifname = ARGV[0] chunk = "" chunk_num = 0 File.open(ifname){ |ifile| while line = ifile.gets if /¥A¥*/ =~ line print "(#{chunk_num})#{chunk}" unless chunk.empty? chunk = "" chunk_num = line.split(nil)[1] elsif /¥AEOS/ =~ line print "(#{chunk_num})#{chunk}¥n" unless chunk.empty? chunk = "" else chunk = chunk + line.split(nil)[0] end end } diff_chunk.rb ifname1 = ARGV[0] ifname2 = ARGV[1] out_diff = ARGV[2] ? true : false sentences = 0 diffs = 0 File.open(ifname1){ |ifile1| File.open(ifname2){ |ifile2| while line1 = ifile1.gets line2 = ifile2.gets sentences = sentences + 1 if line1 != line2 if out_diff puts line1 puts line2 puts "---" end diffs = diffs + 1 end end } } error_rate = diffs.to_f / sentences.to_f printf("error = %1.4f (%d/%d)¥n", error_rate, diffs, sentences) 交差検定の結果 前述のdiff_chunk.rbで正解データとcabochaの出力を各文ごとに比較し、すべての文節が一致するものを正解、それ以外を不正解(エラー)とし、エラーの文の数が全体の文の数に占める割合をエラー率とすると以下のようになった:
エラー率は12%から18%となった。28個のKNPファイルから5グループのモデルファイルを作成したわけだが、学習データを「多く」使えたchunk.juman.4とchunk.juman.5(6x3+5=23個のKNPファイル)はエラー率が12%程度と低く、学習データが「少ない」それ以外のモデル(6x2+5x2=22個のKNPファイル)ではエラー率が15%から18%程度となった(ただし、学習データ量の「多い」「少ない」は、KNPファイルの個数なので正確ではない)。 オペレーションメモ 以下にまっさらなUbuntu Server 10.04.3にCaboChaのインストールから本件交差検定を行ったときのオペレーションを示す。 # 必要ツール類のインストール $ sudo apt-get openssh-server install build-essential nkf emacs23 unzip ruby # CRF++ のインストール $ wget http://crfpp.googlecode.com/files/CRF%2B%2B-0.57.tar.gz $ tar xvzf CRF++-0.57.tar.gz $ cd CRF++-0.57 $ ./configure $ make $ sudo make install # MeCab のインストール $ wget http://mecab.googlecode.com/files/mecab-0.994.tar.gz $ tar xvzf mecab-0.994.tar.gz $ cd mecab-0.994 $ ./configure --with-charset=euc $ make $ make check $ sudo make install $ sudo ldconfig # MeCab Juman辞書のインストール $ wget http://mecab.googlecode.com/files/mecab-jumandic-5.1-20070304.tar.gz $ tar xvzf mecab-jumandic-5.1-20070304.tar.gz $ cd mecab-jumandic-5.1-20070304 $ ./configure --with-charset=euc-jp $ make $ sudo make install # MeCab Perlバインディングのインストール $ wget http://mecab.googlecode.com/files/mecab-perl-0.994.tar.gz $ tar xvzf mecab-perl-0.994.tar.gz $ cd mecab-perl-0.994 $ perl Makefile.PL $ make $ sudo make install # MeCab+Juman 辞書の実行(ここまでの動作確認) # 「すもももももももものうち」を解析するも、Jumanだと「すもも」が「す股」と解釈される(笑) $ mecab -d /usr/local/lib/mecab/dic/jumandic すもももももももものうち す 接頭辞,名詞接頭辞,*,*,す,す,* もも 名詞,普通名詞,*,*,もも,もも,代表表記:股 も 助詞,副助詞,*,*,も,も,* もも 名詞,普通名詞,*,*,もも,もも,代表表記:股 も 助詞,副助詞,*,*,も,も,* もも 名詞,普通名詞,*,*,もも,もも,代表表記:股 の 助詞,接続助詞,*,*,の,の,* うち 名詞,副詞的名詞,*,*,うち,うち,* EOS ^D # CaboChaのインストール(Juman品詞セット) $ wget http://cabocha.googlecode.com/files/cabocha-0.64.tar.gz $ tar xvzf cabocha-0.64.tar.gz $ cd cabocha-0.64 $ ./configure --with-charset=EUC-JP --with-posset=JUMAN # make時のエラーを避けるため、Makefileを編集して # CABOCHA_MODEL_LIST および CABOCHA_TXTMODEL_LISTから*.ipa.*のメンバーを除く $ emacs Makefile model/Makefile $ sudo ldconfig $ make $ make check $ sudo make install $ sudo ldconfig # CaboChaの動作確認 $ cabocha -d /usr/local/lib/mecab/dic/jumandic オリンピックがいよいよロンドンで開幕した。 オリンピックが-----D いよいよ---D |
+ Solrによるブログ内検索
+ PROFILE
+ LINKS
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
+ RECOMMEND
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
+ SPONSORED LINKS
|
(C) 2024 ブログ JUGEM Some Rights Reserved.
|
PAGE TOP |