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 度数分布表から乱数を生成するPython 度数分布表から乱数を生成する Pythonで与えられた度数分布に従う乱数を生成する方法をご紹介する。 さっそくだが、全コードを以下に記す。 import random import matplotlib.pyplot as plt def random_freq_index(freq_list): """ 度数分布表から乱数を生成してインデックス番号を返します […]
  • Ubuntu 日本語構文・格・照応解析システムKNPをpythonから使えるようにするUbuntu 日本語構文・格・照応解析システムKNPをpythonから使えるようにする Ubuntu14.04で日本語構文・格・照応解析システムKNPをpythonから使えるようにする方法をお伝えする。 Python2系 まずはKNP - KUROHASHI-KAWAHARA […]
  • Python CaboChaを用いて係り受け構造を抽出する方法Python CaboChaを用いて係り受け構造を抽出する方法 Pythonと日本語係り受け解析器であるCaboChaを用いて係る語と受ける語のペアを抽出する方法をご紹介する。 環境:Ubuntu14.04 Pythonツールのインストール PythonからCaboChaを扱うために、CaboChaに付属しているPythonのsetup.pyをインストールする。 これはPython2系専用であることに注意する。 caboch […]
  • Ubuntu14.04とPython3でMeCabを使う方法Ubuntu14.04とPython3でMeCabを使う方法 MeCabは各種スクリプト言語(perl、ruby、python、Java)から、各言語バイディングで利用できるようになっている。 しかし、Pythonで用意されているのはPython2系のもので、残念ながらPython3系では使えない。 そこで、ここでは用意されているPython2系バイディングをPython3系に変換して使用する方法をお伝えする。 MeCab […]
  • C++ Boostによるコマンドライン引数処理C++ Boostによるコマンドライン引数処理 boost::program_optionsを用いると、コマンドライン引数(オプション)を比較的容易に解析することができる。 #include <iostream> #include <string> #include <boost/program_options.hpp> int main(int argc, char **argv) […]
Python KNPを用いて係り受け構造を抽出する方法