関口宏司のLuceneブログ

OSS検索ライブラリのLuceneおよびそのサブプロジェクト(Solr/Tika/Mahoutなど)について
<< CaboChaと京都コーパスで交差検定 | main | CaboChaでKNBコーパスを使う >>
モデルとなる京都コーパスの量を変えたときのCaboChaの性能を見る
CaboCha+京都コーパスの続きである。

前の記事ではdat/syn/ ディレクトリにある拡張子が.KNPのファイル28個を上から6個、6個、6個、5個、5個ずつまとめて交差検定を行った。すると、学習データの量に偏りが出たせいか、エラー率は12%から18%とばらつきがあった。

そこで今度は学習データのファイルを文の個数で正確に分割し、学習データの量とchunkの正解率の変化を見てみることにした。具体的には、データが38400文あったのでこれを12分割(すると38400/12=3200となる)し、最後の2つ分、6400文を正解データと固定して、残りの10個分をモデルファイルのソースとし、これを1つ分、2つ分、... と増やしていったときのエラー率に注目する。

結果は期待通り、データ量が増えるにしたがいエラー率が下がった:

モデルファイル名エラー率
chunk.juman.10.10.2116
chunk.juman.10.20.1861
chunk.juman.10.30.1708
chunk.juman.10.40.1598
chunk.juman.10.50.1509
chunk.juman.10.60.1448
chunk.juman.10.70.1383
chunk.juman.10.80.1341
chunk.juman.10.90.1272
chunk.juman.10.100.1259


ここで、chunk.juman.10.1は3200文、chunk.juman.10.2は6400文と学習データ量が増えていき、chunk.juman.10.10は32000文である。グラフ化すると次の通り:

京都コーパスの学習データ量を変えたときのCaboChaのchunkのエラー率

今回作成したプログラム

G5[1-5].datという5つのファイルから同じ数の文に再整理して出力する rearrange.rb というプログラムを作成した。

rearrange.rb
TARGET_NUM = ARGV[0].to_i
SENTENCE_NUM = ARGV[1].to_i

def target_file_name(num)
  sprintf("G%02d%02d.dat", TARGET_NUM, num)
end

$ai = 1
$ifile = nil
$end_of_sources = false

def next_source
  $ifile.close if $ifile
  $ai = $ai + 1
  return nil if $ai >= ARGV.length
  puts "reading #{ARGV[$ai]} ..."
  $ifile = File.open(ARGV[$ai])
end

def read_sentence
  sentence = Array.new
  while true do
    while line = $ifile.gets do
      sentence << line
      return sentence if /¥AEOS/ =~ line
    end
    unless next_source
      $end_of_sources = true
      return []
    end
  end
end

  return nil if $ai >= ARGV.length
  puts "reading #{ARGV[$ai]} ..."
  $ifile = File.open(ARGV[$ai])
end

def read_sentence
  sentence = Array.new
  while true do
    while line = $ifile.gets do
      sentence << line
      return sentence if /¥AEOS/ =~ line
    end
    unless next_source
      $end_of_sources = true
      return []
    end
  end
end

# create target files - for model files
next_source
TARGET_NUM.times {|tnum|
  snum = 0
  File.open(target_file_name(tnum+1), "w"){|ofile|
    while snum < SENTENCE_NUM
      read_sentence.each{|line|
        ofile.puts line
      }
      snum = snum + 1
    end
  }
}

# also create a target file - for evaluation
File.open(target_file_name(TARGET_NUM+1), "w"){|ofile|
  until $end_of_sources do
    read_sentence.each{|line|
      ofile.puts line
    }
  end
}


オペレーションメモ

# 学習データと評価用データの再作成
# 第1引数: ターゲット学習データの個数
# 第2引数: 1個あたりのターゲット学習データ内の文の個数
# 第3引数以降: CaboCha形式ソースデータファイル
$ ruby rearrange.rb 10 3200 G5?.dat

# モデルのソースを生成
$ cat G100[1].dat > model.source.10.1
$ cat G100[1-2].dat > model.source.10.2
$ cat G100[1-3].dat > model.source.10.3
$ cat G100[1-4].dat > model.source.10.4
$ cat G100[1-5].dat > model.source.10.5
$ cat G100[1-6].dat > model.source.10.6
$ cat G100[1-7].dat > model.source.10.7
$ cat G100[1-8].dat > model.source.10.8
$ cat G100[1-9].dat > model.source.10.9
$ cat G100[1-9].dat G1010.dat > model.source.10.10

# 学習。規模に応じてだんだん時間がかかる(20秒〜150秒程度)
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.1 chunk.juman.10.1
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.2 chunk.juman.10.2
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.3 chunk.juman.10.3
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.4 chunk.juman.10.4
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.5 chunk.juman.10.5
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.6 chunk.juman.10.6
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.7 chunk.juman.10.7
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.8 chunk.juman.10.8
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.9 chunk.juman.10.9
$ /usr/local/libexec/cabocha/cabocha-learn -e chunk -P JUMAN model.source.10.10 chunk.juman.10.10

# CaboCha形式の学習データG1011.datから原文テキストファイルS1011-x.txtを逆再生
$ ruby make_source.rb 1011

# 各モデルファイルを使い原文テキストS1011-x.datに対してcabochaを実行
$ cat S1011-01.txt | cabocha -d /usr/local/lib/mecab/dic/jumandic -M ./chunk.juman.10.1 -O2 -f1 -n0 > O10A01.txt
$ cat S1011-02.txt | cabocha -d /usr/local/lib/mecab/dic/jumandic -M ./chunk.juman.10.1 -O2 -f1 -n0 >> O10A01.txt
:
$ cat S1011-01.txt | cabocha -d /usr/local/lib/mecab/dic/jumandic -M ./chunk.juman.10.2 -O2 -f1 -n0 > O10A02.txt
$ cat S1011-02.txt | cabocha -d /usr/local/lib/mecab/dic/jumandic -M ./chunk.juman.10.2 -O2 -f1 -n0 >> O10A02.txt
:

# 正解データの正規化
$ ruby norm_chunk.rb G1011.dat > G1011-norm.dat

# cabochaの出力を正規化
$ ruby norm_chunk.rb O10A01.txt > O10A01-norm.txt
$ ruby norm_chunk.rb O10A02.txt > O10A02-norm.txt
:
$ ruby norm_chunk.rb O10A10.txt > O10A10-norm.txt

# モデルファイル量ごとの評価(エラー率の表示)
$ ruby diff_chunk.rb G1011-norm.dat O10A01-norm.txt 
error = 0.2116 (1354/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A02-norm.txt 
error = 0.1861 (1191/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A03-norm.txt 
error = 0.1708 (1093/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A04-norm.txt 
error = 0.1598 (1023/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A05-norm.txt 
error = 0.1509 (966/6400)
$ ruby .diff_chunk.rb G1011-norm.dat O10A06-norm.txt 
error = 0.1448 (927/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A07-norm.txt 
error = 0.1383 (885/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A08-norm.txt 
error = 0.1341 (858/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A09-norm.txt 
error = 0.1272 (814/6400)
$ ruby diff_chunk.rb G1011-norm.dat O10A10-norm.txt 
error = 0.1259 (806/6400)
| 関口宏司 | NLP | 12:31 | comments(0) | trackbacks(0) |









http://lucene.jugem.jp/trackback/469
+ Solrによるブログ内検索
+ PROFILE
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>
+ LINKS
検索エンジン製品 - 比較のポイント
商用検索エンジンを購入した企業担当者は読まないでください。ショックを受けますから・・・
>>製品比較 10のポイント
+ Lucene&Solrデモ
+ ThinkIT記事
+ RECOMMEND
Apache Solr入門 ―オープンソース全文検索エンジン
Apache Solr入門 ―オープンソース全文検索エンジン (JUGEMレビュー »)
関口 宏司,三部 靖夫,武田 光平,中野 猛,大谷 純
+ RECOMMEND
Lucene in Action
Lucene in Action (JUGEMレビュー »)
Erik Hatcher,Otis Gospodnetic,Mike McCandless
FastVectorHighlighterについて解説記事を寄稿しました。
+ RECOMMEND
+ SELECTED ENTRIES
+ RECENT COMMENTS
+ RECENT TRACKBACK
+ CATEGORIES
+ ARCHIVES
+ MOBILE
qrcode
+ SPONSORED LINKS