概要
京大黒橋河原研究室による係り受け解析エンジンKNP。非常に情報量の多い結果が出力されるのが特徴だが、今日はそれを使って述語項構造を抽出することを試みた。
pyknp を使用して述語項構造を抽出してみる
import re
from pyknp import KNP
def analyze_pas(sentence):
knp = KNP(option = '-tab -anaphora', jumanpp=False)
result = knp.parse(sentence)
for b in result.bnst_list():
match = re.search(r"<項構造:(.+)>", b.spec())
if match:
pas = match.group(1)
items = pas.split(":")
print(b.bnst_id, items)
結果
sentence = '今日太郎は昨日花子が読んでいた本を次郎に渡した'
analyze_pas(sentence)
4 ['読む/よむ', '動2', 'ヲ/N/本/5;時間/C/昨日/2;ガ/C/花子/3']
5 ['本/ほん', '名1', 'ノ/O/太郎/1']
7 ['渡す/わたす', '動2', '時間/C/今日/0;ガ/N/太郎/1;ヲ/C/本/5;ニ/C/次郎/6']
sentence = "昨日私が彼を駅まで迎えに行ったとき、小雨が降っていた"
analyze_pas(sentence)
3 ['駅/えき', '名1']
4 ['迎える/むかえる', '動3', 'ガ/O/私/1;ヲ/O/彼/2']
5 ['行く/いく', '動9', '外の関係/N/とき/6;ガ/C/私/1;ヲ/C/彼/2;マデ/C/駅/3']
8 ['降る/ふる', '動1', '時間/C/昨日/0;ガ/C/小雨/7']
sentence = "非常に情報量の多い結果が出力されるのが特徴だが、今日はそれを使って述語項構造を抽出することを試みた"
analyze_pas(sentence)
0 ['非常だ/ひじょうだ', '形1']
1 ['情報/じょうほう+量/りょう', '名1']
2 ['多い/おおい', '形11', '外の関係/N/結果/4;修飾/C/非常に/0;ガ/N/情報量/2']
5 ['特徴/とくちょう', '判2', 'ガ/C/の/6']
8 ['使う/つかう', '動3', 'ヲ/C/それ/9']
10 ['抽出/ちゅうしゅつ', '動2', '外の関係/N/こと/15;ヲ/C/述語項構造/13']
12 ['試みる/こころみる', '動2', '時間/N/今日/8;ヲ/C/こと/15']
感想
短い文章に関しては、綺麗に述語項構造が抽出できた。ただ、長い文章になると、単純な項構造の切り出しだけだと、文節が分かれることで意味が取りづらい(例:3番目の例の文節10と文節12)こともあるようだ。引き続きいろいろ調べてみようと思う。