yasuokaの日記: 「望遠鏡で泳ぐ彼女を見た」の係り受け構造をGraphvizで可視化する 1
『GraphvizでStanfordNLPの係り受け構造を描画』に触発されて、私(安岡孝一)もGraphvizを触ってみた。例として「望遠鏡で泳ぐ彼女を見た」
1 望遠鏡 望遠鏡 NOUN _ _ 6 obl _ SpaceAfter=No
2 で で ADP _ _ 1 case _ SpaceAfter=No
3 泳ぐ 泳ぐ VERB _ _ 4 acl _ SpaceAfter=No
4 彼女 彼女 PRON _ _ 6 obj _ SpaceAfter=No
5 を を ADP _ _ 4 case _ SpaceAfter=No
6 見 見る VERB _ _ 0 root _ SpaceAfter=No
7 た た AUX _ _ 6 aux _ SpaceAfter=No
の係り受け構造を、Graphvizで可視化してみたいと思う。GraphvizではDOTという描画言語を使うらしいので、↑のUniversal DependenciesをDOTで書き直せばいいはずだ。
digraph G{
w1[shape=record,label="{NOUN|望遠鏡}"];
w2[shape=record,label="{ADP|で}"];
w3[shape=record,label="{VERB|泳ぐ}"];
w4[shape=record,label="{PRON|彼女}"];
w5[shape=record,label="{ADP|を}"];
w6[shape=record,label="{VERB|見}"];
w7[shape=record,label="{AUX|た}"];
r1[label="obl"];
r2[label="case"];
r3[label="acl"];
r4[label="obj"];
r5[label="case"];
r6[label="root"];
r7[label="aux"];
w6->r1[dir=none];r1->w1;
w1->r2[dir=none];r2->w2;
w4->r3[dir=none];r3->w3;
w6->r4[dir=none];r4->w4;
w4->r5[dir=none];r5->w5;
r6->w6;
w6->r7[dir=none];r7->w7;
{rank=source;r6}
{rank=sink;w1;w2;w3;w4;w5;w6;w7}
r4->r5->w6[style=invis];
r1->r4->r2->w3[style=invis];
}
Graphviz Onlineで見ると、こんな感じ。各単語をw1~w7のノードで、各係り受けタグをr1~r7のノードで表して、それらに係り受け関係の枝を付けたものである。ただ、それだけだと、ノードが勝手気ままに並んでしまう(こんな感じ)ので、rootノードをrank=sourceに、単語ノードをrank=sinkに並べた上で、見えない枝を5本ほど張って、各ノードをうまく整列させている。あとは「dot -T png ファイル.dot -o ファイル.png」なり何なりで、画像ファイルが得られるはずだ。
こうして見ると、以前、私が作った「SVGによるUniversal Dependencies可視化ツール」に遜色ないようだ。ただ、Graphvizでの見えない枝を、どうシステマティックに張るのかは、一工夫必要だろう。
日本語が出ないバグ (スコア:2)
Graphviz 2.38の「バグ」(shape=record内の日本語が出ない)を回避する方法を、今日の日記 [srad.jp]に書きました。