#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
46. 動詞の格フレーム情報の抽出

45のプログラムを改変し，述語と格パターンに続けて項（述語に係っている文節そのもの）をタブ区切り形式で出力せよ．45の仕様に加えて，以下の仕様を満たすようにせよ．

*項は述語に係っている文節の単語列とする（末尾の助詞を取り除く必要はない）
*述語に係る文節が複数あるときは，助詞と同一の基準・順序でスペース区切りで並べる

「吾輩はここで始めて人間というものを見た」という例文（neko.txt.cabochaの8文目）を考える． この文は「始める」と「見る」の２つの動詞を含み，「始める」に係る文節は「ここで」，「見る」に係る文節は「吾輩は」と「ものを」と解析された場合は，次のような出力になるはずである．

始める  で      ここで
見る    は を   吾輩は ものを 
'''
from nlp41 import readChunk

def caseFlame(sents):
    result, src_chunks = [], []
    for sent in sents:
        for chunk in sent:
            if chunk.hasVerb():
                verb = [morph.base for morph in chunk.morphs if morph.pos == '動詞'][0]
                for src in chunk.srcs:
                    tmp = [[morph.surface, sent[src]] for morph in sent[src].morphs if morph.pos =='助詞']
                    if tmp:
                        src_chunks.append(tmp[-1])
                if src_chunks:
                    src_chunks = sorted(src_chunks, key=lambda x:x[0])
                    parts, chunk = [], []
                    for item in src_chunks:
                        parts.append(item[0])
                        chunk.append(''.join(item[1].surfaces()))
                    result.append([verb, parts, chunk])
                    src_chunks, parts, chunk = [], [], []
    return [l[0] + '\t' + ' '.join(l[1]) + '\t' +' '.join(l[2]) + '\n' for l in result]

if __name__ == "__main__":
    sents =readChunk()
    with open('nlp46.txt', 'w') as f:
        f.writelines(caseFlame(sents))
