パスワードを忘れた? アカウント作成
15644028 journal
人工知能

yasuokaの日記: Stanzaの日本語句構造解析木をGraphvizで可視化する

日記 by yasuoka

昨日の日記の続きだが、Stanzaで読ませた「全学年にわたって小学校の国語の教科書に大量の挿し絵が用いられている」の句構造解析木を、Graphvizで可視化してみた。Google Colaboratoryで動かしてみよう。

!pip install 'stanza>=1.4.0'
import stanza
stanza.download("ja")
nlp=stanza.Pipeline("ja")
doc=nlp("全学年にわたって小学校の国語の教科書に大量の挿し絵が用いられている")
tree=doc.sentences[0].constituency
tree2dot=lambda x,y='x':('graph{{rankdir="LR";node[shape="plaintext"];{}}}' if len(y)<2 else y[0:-1]+'--'+y+';{}').format(';\n'.join([y+'[label="'+x.label+'"]']+[tree2dot(c,y+chr(i+97)) for i,c in enumerate(x.children)]))
import graphviz
graphviz.Source(tree2dot(tree))

なかなかトリッキーなプログラムだが、これでgraphviz.Sourceに以下のDOTが渡されるはずだ。

graph{rankdir="LR";node[shape="plaintext"];x[label="ROOT"];
x--xa;xa[label="S"];
xa--xaa;xaa[label="PP"];
xaa--xaaa;xaaa[label="BASENP"];
xaaa--xaaaa;xaaaa[label="接頭辞"];
xaaaa--xaaaaa;xaaaaa[label="全"];
xaaa--xaaab;xaaab[label="名詞-普通名詞-一般"];
xaaab--xaaaba;xaaaba[label="学年"];
xaa--xaab;xaab[label="INP"];
xaab--xaaba;xaaba[label="助詞-格助詞"];
xaaba--xaabaa;xaabaa[label="に"];
xaab--xaabb;xaabb[label="動詞-非自立可能"];
xaabb--xaabba;xaabba[label="わたっ"];
xaab--xaabc;xaabc[label="助詞-接続助詞"];
xaabc--xaabca;xaabca[label="て"];
xa--xab;xab[label="S"];
xab--xaba;xaba[label="PP"];
xaba--xabaa;xabaa[label="NP"];
xabaa--xabaaa;xabaaa[label="PP"];
xabaaa--xabaaaa;xabaaaa[label="BASENP"];
xabaaaa--xabaaaaa;xabaaaaa[label="接頭辞"];
xabaaaaa--xabaaaaaa;xabaaaaaa[label="小"];
xabaaaa--xabaaaab;xabaaaab[label="名詞-普通名詞-一般"];
xabaaaab--xabaaaaba;xabaaaaba[label="学校"];
xabaaa--xabaaab;xabaaab[label="助詞-格助詞"];
xabaaab--xabaaaba;xabaaaba[label="の"];
xabaa--xabaab;xabaab[label="NP"];
xabaab--xabaaba;xabaaba[label="PP"];
xabaaba--xabaabaa;xabaabaa[label="BASENP"];
xabaabaa--xabaabaaa;xabaabaaa[label="名詞-普通名詞-一般"];
xabaabaaa--xabaabaaaa;xabaabaaaa[label="国語"];
xabaaba--xabaabab;xabaabab[label="助詞-格助詞"];
xabaabab--xabaababa;xabaababa[label="の"];
xabaab--xabaabb;xabaabb[label="BASENP"];
xabaabb--xabaabba;xabaabba[label="名詞-普通名詞-一般"];
xabaabba--xabaabbaa;xabaabbaa[label="教科"];
xabaabb--xabaabbb;xabaabbb[label="接尾辞-名詞的-一般"];
xabaabbb--xabaabbba;xabaabbba[label="書"];
xaba--xabab;xabab[label="助詞-格助詞"];
xabab--xababa;xababa[label="に"];
xab--xabb;xabb[label="S"];
xabb--xabba;xabba[label="PP"];
xabba--xabbaa;xabbaa[label="NP"];
xabbaa--xabbaaa;xabbaaa[label="PP"];
xabbaaa--xabbaaaa;xabbaaaa[label="BASENP"];
xabbaaaa--xabbaaaaa;xabbaaaaa[label="名詞-普通名詞-形状詞可能"];
xabbaaaaa--xabbaaaaaa;xabbaaaaaa[label="大量"];
xabbaaa--xabbaaab;xabbaaab[label="助詞-格助詞"];
xabbaaab--xabbaaaba;xabbaaaba[label="の"];
xabbaa--xabbaab;xabbaab[label="BASENP"];
xabbaab--xabbaaba;xabbaaba[label="動詞-一般"];
xabbaaba--xabbaabaa;xabbaabaa[label="挿し"];
xabbaab--xabbaabb;xabbaabb[label="名詞-普通名詞-一般"];
xabbaabb--xabbaabba;xabbaabba[label="絵"];
xabba--xabbab;xabbab[label="助詞-格助詞"];
xabbab--xabbaba;xabbaba[label="が"];
xabb--xabbb;xabbb[label="VP"];
xabbb--xabbba;xabbba[label="VP"];
xabbba--xabbbaa;xabbbaa[label="VP"];
xabbbaa--xabbbaaa;xabbbaaa[label="動詞-一般"];
xabbbaaa--xabbbaaaa;xabbbaaaa[label="用い"];
xabbbaa--xabbbaab;xabbbaab[label="VP"];
xabbbaab--xabbbaaba;xabbbaaba[label="助動詞"];
xabbbaaba--xabbbaabaa;xabbbaabaa[label="られ"];
xabbba--xabbbab;xabbbab[label="助詞-接続助詞"];
xabbbab--xabbbaba;xabbbaba[label="て"];
xabbb--xabbbb;xabbbb[label="VP"];
xabbbb--xabbbba;xabbbba[label="動詞-非自立可能"];
xabbbba--xabbbbaa;xabbbbaa[label="いる"]}

Graphviz Onlineで見るとこんな感じ。描画エンジンにdotを使えば、まあまあ見やすくなると思う。私(安岡孝一)個人としては係り受け解析の方が好きなのだが、句構造解析を必要とする人たちもいると思うので、是非お試しあれ。

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

開いた括弧は必ず閉じる -- あるプログラマー

読み込み中...