問題
2つの名詞が「の」で連結されている名詞句を抽出せよ.
https://nlp100.github.io/ja/ch04.html
下のデータでいうと、「彼の掌」を抽出しろという問題。
# inputデータ
[[{'surface': 'ただ', 'base': 'ただ', 'pos': '副詞', 'pos1': '*'},
{'surface': '彼', 'base': '彼', 'pos': '名詞', 'pos1': '普通名詞'},
{'surface': 'の', 'base': 'の', 'pos': '助詞', 'pos1': '接続助詞'},
{'surface': '掌', 'base': '掌', 'pos': '名詞', 'pos1': '普通名詞'},
{'surface': 'に', 'base': 'に', 'pos': '助詞', 'pos1': '格助詞'},
{'surface': '載せ', 'base': '載せる', 'pos': '動詞', 'pos1': '*'},
{'surface': 'られて', 'base': 'られる', 'pos': '接尾辞', 'pos1': '動詞性接尾辞'},
{'surface': 'スー', 'base': 'スー', 'pos': '名詞', 'pos1': '普通名詞'},
{'surface': 'と', 'base': 'と', 'pos': '助詞', 'pos1': '格助詞'},
{'surface': '持ち', 'base': '持つ', 'pos': '動詞', 'pos1': '*'},
{'surface': '上げ', 'base': '上げる', 'pos': '動詞', 'pos1': '*'},
{'surface': 'られた', 'base': 'られる', 'pos': '接尾辞', 'pos1': '動詞性接尾辞'},
{'surface': '時', 'base': '時', 'pos': '名詞', 'pos1': '副詞的名詞'},
{'surface': '何だか', 'base': '何だか', 'pos': '副詞', 'pos1': '*'},
{'surface': 'フワフワ', 'base': 'フワフワ', 'pos': '副詞', 'pos1': '*'},
{'surface': 'した', 'base': 'する', 'pos': '動詞', 'pos1': '*'},
{'surface': '感じ', 'base': '感じ', 'pos': '名詞', 'pos1': '普通名詞'},
{'surface': 'が', 'base': 'が', 'pos': '助詞', 'pos1': '格助詞'},
{'surface': 'あった', 'base': 'ある', 'pos': '動詞', 'pos1': '*'},
{'surface': 'ばかりである', 'base': 'ばかりだ', 'pos': '助動詞', 'pos1': '*'},
{'surface': '。', 'base': '。', 'pos': '特殊', 'pos1': '句点'}],
...
回答
1文ごと、1形態素ごとに「の」の前後に名詞があるかチェックする。
インデックスを0から始めると、「の」が先頭・終わりの場所にあると、
IndexError: list index out of range
とエラーになるので、インデックスの開始を1からにする必要がある。
surface = []
for sentense in result_list:
for i in range(1, len(sentense)-1):
if sentense[i-1]['pos'] == '名詞' and sentense[i]['surface'] == 'の' and sentense[i+1]['pos'] == '名詞':
surface.append(sentense[i-1]['surface'] + sentense[i]['surface'] + sentense[i+1]['surface'])
surface
# 結果
['彼の掌',
'掌の上',
'書生の顔',
'ものの見始',
'顔の真中',
'穴の中',
'書生の掌',
...