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)
出力結果
KNPの出力結果と比較して、正しく構文木になっていることが確認できます。