読者です 読者をやめる 読者になる 読者になる

Keep on moving

あんまりまとまってないことを書きますよ

Igo-pythonをGAEでも動かす。

形態素解析 python GAE Igo

あいかわらずIgoをいじって遊ばせていただいています。
Igoを使っていて感じたことをかるくまとめておきます。

Igoの辞書変換時の注意点

IgoではMecab形式のファイルをいったんIgoを使って変換する必要がある。
ドキュメントには書いてないけど以下の場合には辞書の変換に失敗する。
はまったのでメモ的にまとめておきます。

  • 辞書に"(ダブルクォート)を含む場合、変換parserのエラーになる。(今回は取り除くことで可能)
  • Mecabの辞書内で出現頻度をスコアで指定するんだけど、Igo側はここをIntegerで解釈しているので,Integerの範囲を超えた値にすると変換エラーになる。
  • 辞書の変換には思った以上にメモリを食います。具体的にはスタックオーバーフローエラーがおこります。辞書のファイルサイズが大きい場合にはスタック領域をなるべく増やして実行しましょう。例えば、NAIST Japanese Dictionary プロジェクトを変換するときには500Mくらい割り当てておくのがおすすめです。以下のようにしましょう。
java -Xms512M -Xmx512M -cp igo-0.4.2.jar net.reduls.igo.bin.BuildDic naist mecab-naist-jdic-0.6.3-20100801 EUC-JP
  • google app engineはファイルサイズの上限があるので、ファイルサイズを減らすorファイル数を分ける必要がありそう。

ここは後々Javaのpatchを解析させていただくことを考える。Igo: GoogleAppEngineで形態素解析サーバ - sileの日記

実際にgaeで使ってみた。

すでに誰かやってるとは思うのですが、実際にGoogle App Engine Python形態素解析を実行してみました。
とりあえずギレンの演説を形態素解析してみました。思った以上に時間がかからないですね。
明日以降、これを動かして転置インデックスを作成してGAEに保存するロジックを考えてみたいと思います。
To be continued..

http://passion-orange.appspot.com/

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os
from google.appengine.ext.webapp import template
from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

import igo.Tagger

class Test(object):
    def __init__(self,surface,feature,start):
        self.surface = surface
        self.feature = feature
        self.start = start

class MainHandler(webapp.RequestHandler):
    def get(self):
        text = u'''
我々は一人の英雄を失った。しかし、これは敗北を意味するのか?否!始まりなのだ!
地球連邦に比べ、我がジオンの国力は30分の1以下である。
にもかかわらず今日まで戦い抜いてこられたのは何故か?
諸君!我がジオン公国の戦争目的が正義だからだ。これは諸君らが一番知っている。
我々は地球を追われ、宇宙移民者にさせられた。
そして、一握りのエリートらが宇宙にまで膨れ上がった地球連邦を支配して50余年、
宇宙に住む我々が自由を要求して何度踏みにじられたか。
ジオン公国の掲げる人類一人一人の自由のための戦いを神が見捨てるはずはない。
私の弟!諸君らが愛してくれたガルマ・ザビは死んだ。
何故だ!?

「坊やだからさ」

新しい時代の覇権を選ばれた国民が得るは、歴史の必然である。
ならば、我らは襟を正し、この戦局を打開しなければならぬ。
我々は過酷な宇宙空間を生活の場としながらも共に苦悩し、錬磨して今日の文化を築き上げてきた。
かつて、ジオン・ダイクンは人類の革新は宇宙の民たる我々から始まると言った。
しかしながら地球連邦のモグラ共は、自分たちが人類の支配権を有すると増長し我々に抗戦する。
諸君の父も、子もその連邦の無思慮な抵抗の前に死んでいったのだ!
この悲しみも怒りも忘れてはならない!それを、ガルマは!死をもって我々に示してくれた!
我々は今、この怒りを結集し、連邦軍に叩きつけて、初めて真の勝利を得ることができる。
この勝利こそ、戦死者全てへの最大の慰めとなる。
国民よ立て!悲しみを怒りに変えて、立てよ!国民よ!
我らジオン国国民こそ選ばれた民であることを忘れないでほしいのだ。
優良種である我らこそ人類を救い得るのである。ジーク・ジオン!

        '''
        t = igo.Tagger.Tagger('ipadic_gae', gae=True)
        l = t.parse(text)
        strs = []
        #html = u""
        for m in l:
            #html += u"%s %s %s<br>" % (m.surface, m.feature, m.start)
            str = Test(m.surface, m.feature, m.start)
            strs.append(str)
        #self.response.out.write(html)
        
        template_values = {
            'strs': strs,
            'text': text,
            }

        path = os.path.join(os.path.dirname(__file__), 'index.html')
        self.response.out.write(template.render(path, template_values))
        
def main():
    application = webapp.WSGIApplication([('/', MainHandler)],
                                         debug=True)
    util.run_wsgi_app(application)


if __name__ == '__main__':
    main()