問題文
問題の概要
本章では、CaboChaを用いて係り受け解析した結果を読み込んでいきます。手始めに、以下コマンドでファイルに対して係り受け解析を実行しましょう。
cat ch05/ai.ja/ai.ja.txt | cabocha -f1 > ch05/ai.ja.txt.cabocha
あとは、読み込むファイルの形式に応じてデータを取得します。次の4段階で処理しました。
- ファイル全体を読み込む
- 「split('EOS\n')」で、データを分割する
- 不要な行を「filter」で取り除く
- 「parse_cabocha」関数を適用する
class Morph: def __init__(self, dc): self.surface = dc['surface'] self.base = dc['base'] self.pos = dc['pos'] self.pos1 = dc['pos1'] def parse_cabocha(block): res = [] for line in block.split('\n'): if line == '': return res elif line[0] == '*': continue (surface, attr) = line.split('\t') attr = attr.split(',') lineDict = { 'surface': surface, 'base': attr[6], 'pos': attr[0], 'pos1': attr[1] } res.append(Morph(lineDict)) filename = 'ch05/ai.ja.txt.cabocha' with open(filename, mode='rt', encoding='utf-8') as f: blocks = f.read().split('EOS\n') blocks = list(filter(lambda x: x != '', blocks)) blocks = [parse_cabocha(block) for block in blocks] for m in blocks[2]: print(vars(m))