たのしい駆動開発

たのしいアウトプットの場所

pyKNPで構文解析し、結果を有向グラフにする

ほぼほぼこいつと同じ内容です。 ssabcire.hatenablog.com

import networkx as nx
from pyknp import KNP


def tag(text: str) -> (list, list):
    '''
    return tag_ids: [(子基本句ID, 親基本句ID), ...]
    '''
    knp = KNP()
    tag_list = knp.parse(text).tag_list()
    tag_ids = list()
    for tag in tag_list:  # 各基本句へのアクセス
        if tag.parent_id != -1:
            tag_ids.append((tag.tag_id, tag.parent_id))
    return tag_list, tag_ids


def graph_to_image(tag_list, tag_ids, dg: nx.DiGraph):
    for u, v in tag_ids:
        dg.add_nodes_from([tag_list[u].midasi, tag_list[v].midasi])
        dg.add_edge(tag_list[u].midasi, tag_list[v].midasi)
    nx.nx_agraph.to_agraph(dg).draw('graph.png', prog='dot')


if __name__ == '__main__':
    text = "私はスポーツが好きだが、バスケは嫌い。でも彼はバスケがうまい"
    tag_list, tag_ids = tag(text)
    dg = nx.DiGraph()
    graph_to_image(tag_list, tag_ids, dg)



出力結果 f:id:ssabcire:20191022222905p:plain



KNPの出力結果と比較して、正しく構文木になっていることが確認できます。 f:id:ssabcire:20191022223335p:plain