Subscribed unsubscribe Subscribe Subscribe

全裸で書き換えるRobot

Python GoogleWave

Pythonから全裸で形態素解析をする - すぎゃーんメモまで出来れば、GAEにあげてGoogle WaveのRobotの機能として使うこともできる。


zenra.pyをちょっと変更してクラスに。

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

from xml.etree import ElementTree
import urllib


class Zenra:
    def __init__(self):
        appid    = '***************(登録したアプリケーションID)'
        self.url   = 'http://jlp.yahooapis.jp/DAService/V1/parse'
        
    def zenrize(self, sentence):
        postdata = {
            'appid'    : self.appid,
            'sentence' : sentence.encode('utf-8'),
            }
        params = urllib.urlencode(postdata)
        result = urllib.urlopen(self.url, params)

        morpheme_list = []
        # DOM解析 形態素と品詞だけを抽出
        tree = ElementTree.XML(result.read())
        chunk_list = tree.find('{urn:yahoo:jp:jlp:DAService}Result').find('{urn:yahoo:jp:jlp:DAService}ChunkList')
        for chunk in chunk_list.findall('{urn:yahoo:jp:jlp:DAService}Chunk'):
            for morphem in chunk.find('{urn:yahoo:jp:jlp:DAService}MorphemList'):
                morpheme_list.append({
                        'Surface' : morphem.find('{urn:yahoo:jp:jlp:DAService}Surface').text.encode('utf-8'),
                        'POS'     : morphem.find('{urn:yahoo:jp:jlp:DAService}POS').text.encode('utf-8'),
                        })

        # 末尾から見ていって、動詞を検出したら「全裸で」を挿入
        for morpheme in reversed(morpheme_list):
            if morpheme['POS'] == u'動詞'.encode('utf-8'):
                morpheme_list.insert(morpheme_list.index(morpheme), {
                        'Surface' : u'全裸で'.encode('utf-8'),
                        'POS'     : '',
                        })

        return ''.join(morpheme['Surface'] for morpheme in morpheme_list)


Robotのプログラムは、ただZenraクラスのzenrize()メソッドを呼び出すだけ。

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

from waveapi import events 
from waveapi import robot
from zenra import Zenra


def blipSubmitted(properties, context):
    blip = context.GetBlipById(properties['blipId'])
    text = blip.GetDocument().GetText()
    blip.GetDocument().SetText(Zenra().zenrize(text).decode('utf-8'))

if __name__ == '__main__':
    zenra_robot = robot.Robot(
        'zenra_robot', 1.0,
        image_url = 'http://zen-ra.appspot.com/icon.png')
    zenra_robot.RegisterHandler(events.BLIP_SUBMITTED, blipSubmitted)
    zenra_robot.Run()


これで、このRobotは誰かがBlipを編集してDoneを押すたびにその発言を全裸で書き換えてくれる。

↑自分では普通に台詞を書いているだけです。勝手に書き換えられてます ><


Wave上で zen-ra@appspot.com で稼働させていますので、試してみて下さい(変更する可能性あり)。
APIの制限なんかもあるのであんまりたくさん書き換えさせると動かなくなるかも。