2011年2月27日日曜日

IgoのTaggerをpickleする

MeCabTokenizerを作っているときに、またpickle出来なくてはまった。なので、独自に保存/復帰をするようにした。
そのとき、WhooshでIgoTokenizerを使うとインデックスが思った以上に大きくなる原因にやっと気が付いた。Taggerをインデックスに保存するのが原因。
そこで、IgoのTaggerも独自に保存復帰が出来るようにした。

# coding:utf8
import cPickle,gzip
import WhooshJapaneseTokenizer,igo.Tagger
tk = WhooshJapaneseTokenizer.IgoTokenizer(igo.Tagger.Tagger('ipadic'))
tk2 = WhooshJapaneseTokenizer.IgoTokenizer(dataDir='ipadic', gae=False)

print 'w tagger', len(cPickle.dumps(tk, -1))
print 'wo tagger', len(cPickle.dumps(tk2, -1))
tk = cPickle.loads(cPickle.dumps(tk, -1))
tk2 = cPickle.loads(cPickle.dumps(tk2, -1))

for t in tk(u'今日はいい天気です。'):
  print t.text,
print
for t in tk(u'今日はいい天気です。'):
  print t.text,
print

出力
$ python test2.py 
w tagger 41185761
wo tagger 119
今日 は いい 天気 です 。
今日 は いい 天気 です 。

これを逆手に取れば、Taggerをpickleしておけば、辞書が無くてもTaggerを作ることが出来る。
>>> import igo.Tagger, cPickle, gzip
>>> from cStringIO import StringIO
>>> cPickle.dump(igo.Tagger.Tagger('ipadic'), gzip.GzipFile('/tmp/tagger.gz', 'w'), -1)
>>> cPickle.load(gzip.GzipFile('/tmp/tagger.gz'))
<igo.Tagger.Tagger instance at 0x7f24f71c9a28>
これで大体8.4Mぐらい。

0 件のコメント:

コメントを投稿