Ubuntu14.04環境で、Python3と日本語構文・格・照応解析システムKNPを用いて係る語と受ける語のペアを抽出する方法をご紹介する。
係り受け構造を抽出するPython3のソースコードは次である。
from pyknp import KNP
def select_normalization_representative_notation(fstring):
""" 正規化代表表記を抽出します
"""
begin = fstring.find('正規化代表表記:')
end = fstring.find('/', begin + 1)
return fstring[begin + len('正規化代表表記:') : end]
def select_dependency_structure(line):
"""係り受け構造を抽出します
"""
# KNP
knp = KNP(option = '-tab -anaphora')
# 解析
result = knp.parse(line)
# 文節リスト
bnst_list = result.bnst_list()
# 文節リストをidによるディクショナリ化する
bnst_dic = dict((x.bnst_id, x) for x in bnst_list)
tuples = []
for bnst in bnst_list:
if bnst.parent_id != -1:
# (from, to)
tuples.append((select_normalization_representative_notation(bnst.fstring), select_normalization_representative_notation(bnst_dic[bnst.parent_id].fstring)))
return tuples
if __name__ == '__main__' :
line = '太郎は花子が読んでいる本を次郎に渡した'
tuples = select_dependency_structure(line)
for t in tuples:
print(t[0] + ' => ' + t[1])
これを実行すると、次のように出力される。
太郎 => 渡す
花子 => 読む
読む => 本
本 => 渡す
次郎 => 渡す
コマンドラインからKNPを実行すると、次のように表示される。
echo "太郎は花子が読んでいる本を次郎に渡した" | juman | knp
# S-ID:1 KNP:4.14-CF1.1 DATE:2015/09/22 SCORE:-35.27575
太郎は──┐
花子が──┐ │
読んでいる──┐ │
本を──┤
次郎に──┤
渡した
EOS
Python KNPを用いて係り受け構造を抽出する方法