現時点ではこんなカンジ。
def zenrize(self, sentence): postdata = { 'appid' : self.appid, 'sentence' : sentence.encode('utf-8'), } params = urllib.urlencode(postdata) result = urllib.urlopen(self.url, params) tree = ElementTree.XML(result.read()) # 係り受け解析の結果を利用し、適切な挿入箇所を判定する text = '' 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'): morphem_list = chunk.find('{urn:yahoo:jp:jlp:DAService}MorphemList') # 動詞が含まれている文節の前に「全裸で」を挿入する if u'動詞' in [morphem.find('{urn:yahoo:jp:jlp:DAService}POS').text for morphem in morphem_list]: # 動詞→接続助詞 文節切れて 動詞 と繋がる場合をどうにかしたい # 例:帰ってくる text += u'全裸で'.encode('utf-8') else: # 動詞がなくても「名詞+助動詞する」を捕捉する for i in range(len(morphem_list) - 1): if u'名詞' == morphem_list[i].find('{urn:yahoo:jp:jlp:DAService}POS').text and u'助動詞する' == morphem_list[i + 1].find('{urn:yahoo:jp:jlp:DAService}Feature').text.split(',')[1]: text += u'全裸で'.encode('utf-8') break # 形態素を繋げ直す for morphem in morphem_list: text += morphem.find('{urn:yahoo:jp:jlp:DAService}Surface').text.encode('utf-8') return text
Yahoo!日本語係り受け解析APIを使う場合、例えば「信じられない」という言葉を解析すると、以下のようになる。
動詞,一段,文語基本形,信じ,しんじ,信じ 助動詞,助動詞一段,文語基本形,られ,られ,られ 動詞,カ五,連用タ接続,ない,な,な
バカ正直に動詞の前に「全裸で」をつけていると、「全裸で信じられない」としたいところを「全裸で信じられ全裸でない」と変換されてしまう。
ので、「動詞を含む文節の直前に1つだけ挿入する」となるように変更した。
もう一点、「出社した」という言葉に対して「全裸で出社した」に変換させたい、という要望が(自分の中で)あった。
係り受け解析APIによる解析では、「出社した」は以下のようになる。
名詞,名サ自,*,出社,しゅっしゃ,出社 助動詞,助動詞する,連用ゴザイ接続,し,し,し 助動詞,助動詞た,基本形,た,た,た
動詞が含まれない。
が、この手の「信用する」「改善する」といった言葉は、「名詞→助動詞する」と繋がっていくパターンなので、それを検出した場合も全裸にすることにした。
残る問題は、「帰ってくる」といった、動詞が繋がっているが文節が分かれるパターン。
動詞,ラ五,連用テ接続,帰っ,かえ,帰 助詞,接続助詞,*,て,て,て 動詞,カ変,基本形,くる,く,く
というように、文節は別々なので、このままでは「全裸で帰って全裸でくる」になってしまう。これをどうにかして「全裸で帰ってくる」にしたい。
『「動詞→接続助詞」で終わる文節→動詞で始まる文節』を検出して除外するようにすればいいのかな…?
しかしただでさえif文のオンパレードでゴチャゴチャしているのに、さらにゴチャゴチャしてしまう。
キレイに書く方法を考えたい。
あと、「**なう」も場合によって(?)動詞とみなされてしまうことがあるようなので、ここも例外として処理した方がよさそうw