![人工知能 人工知能](https://srad.jp/static/topics/ai_64.png)
yasuokaの日記: UniDic2UDによるCaboChaエミュレータ
日本語係り受け解析エンジンUniDic2UDを改造して、CaboCha風の係り受け表示が出来るようにしてみた。まずは、最新版のUniDic2UDを、UDPipeの言語モデルjapanese-gsdと共にインストール。
% pip3 install 'unidic2ud>=1.2.7'
% python3 -m unidic2ud download.udpipe japanese-gsd
インストールできたら、CaboChaの流儀にしたがって「太郎はこの本を二郎を見た女性に渡した。」を係り受け解析してみよう。
% python3
>>> import unidic2ud.cabocha as CaboCha
>>> c=CaboCha.Parser()
>>> tree=c.parse("太郎はこの本を二郎を見た女性に渡した。")
>>> print(tree.toString(CaboCha.FORMAT_TREE_LATTICE))
太郎は-----------D
この-D |
本を---D |
二郎を-D |
見た-D |
女性に-D
渡した。
EOS
* 0 6D 0/1 0.000000
太郎 名詞,固有名詞,人名,名,*,*,太郎,タロウ,*,PROPN 1<-nsubj-13
は 助詞,係助詞,*,*,*,*,は,ハ,*,ADP 2<-case-1
* 1 2D 0/0 0.000000
この 連体詞,*,*,*,*,*,この,コノ,*,DET 3<-det-4
* 2 4D 0/1 0.000000
本 名詞,一般,*,*,*,*,本,ホン,*,NOUN 4<-obj-9
を 助詞,格助詞,一般,*,*,*,を,ヲ,*,ADP 5<-case-4
* 3 4D 1/2 0.000000
二 名詞,数,*,*,*,*,二,ニ,*,NUM 6<-compound-7
郎 名詞,一般,*,*,*,*,郎,ロウ,*,NOUN 7<-obj-9
を 助詞,格助詞,一般,*,*,*,を,ヲ,*,ADP 8<-case-7
* 4 5D 0/1 0.000000
見 動詞,自立,*,*,*,*,見る,ミ,*,VERB 9<-acl-11
た 助動詞,*,*,*,*,*,た,タ,*,AUX 10<-aux-9
* 5 6D 0/1 0.000000
女性 名詞,一般,*,*,*,*,女性,ジョセイ,*,NOUN 11<-iobj-13
に 助詞,格助詞,一般,*,*,*,に,ニ,*,ADP 12<-case-11
* 6 -1D 0/1 0.000000
渡し 動詞,自立,*,*,*,*,渡す,ワタシ,*,VERB 13<-root
た 助動詞,*,*,*,*,*,た,タ,*,AUX 14<-aux-13
。 記号,句点,*,*,*,*,。,*,*,SYM 15<-punct-13
EOS
「本を」は「渡した。」に係るべきなのだが、ここだけは解析にしくじっているようだ。ちなみに出力フォーマットは、FORMAT_TREE、FORMAT_LATTICE、FORMAT_TREE_LATTICE、FORMAT_XML、FORMAT_CONLLの5種類を準備してあって、FORMAT_CONLLはUniversal Dependenciesをそのまま出力する。
>>> print(tree.toString(CaboCha.FORMAT_CONLL))
# text = 太郎はこの本を二郎を見た女性に渡した。
1 太郎 太郎 PROPN 名詞-固有名詞-人名-名 _ 13 nsubj _ SpaceAfter=No|Translit=タロウ
2 は は ADP 助詞-係助詞 _ 1 case _ SpaceAfter=No|Translit=ハ
3 この この DET 連体詞 _ 4 det _ SpaceAfter=No|Translit=コノ
4 本 本 NOUN 名詞-一般 _ 9 obj _ SpaceAfter=No|Translit=ホン
5 を を ADP 助詞-格助詞-一般 _ 4 case _ SpaceAfter=No|Translit=ヲ
6 二 二 NUM 名詞-数 _ 7 compound _ SpaceAfter=No|Translit=ニ
7 郎 郎 NOUN 名詞-一般 _ 9 obj _ SpaceAfter=No|Translit=ロウ
8 を を ADP 助詞-格助詞-一般 _ 7 case _ SpaceAfter=No|Translit=ヲ
9 見 見る VERB 動詞-自立 _ 11 acl _ SpaceAfter=No|Translit=ミ
10 た た AUX 助動詞 _ 9 aux _ SpaceAfter=No|Translit=タ
11 女性 女性 NOUN 名詞-一般 _ 13 iobj _ SpaceAfter=No|Translit=ジョセイ
12 に に ADP 助詞-格助詞-一般 _ 11 case _ SpaceAfter=No|Translit=ニ
13 渡し 渡す VERB 動詞-自立 _ 0 root _ SpaceAfter=No|Translit=ワタシ
14 た た AUX 助動詞 _ 13 aux _ SpaceAfter=No|Translit=タ
15 。 。 SYM 記号-句点 _ 13 punct _ SpaceAfter=No
難しいのは、そもそもUniDic2UDは単語間の係り受けを解析するのに対し、CaboChaは二文節間の係り受けを解析するものだったりする点だ。単語間の係り受けは、二文節間の係り受けとは、実は微妙に対応しない部分がある。それでも、インターフェースとしては、Treeに対するtoString(format)のみならずchunk(index)やchunk_size()やtoken(index)やtoken_size()、Chunkに対するlinkやhead_posやfunc_posやtoken_pos、あるいはTokenに対するnormalized_surfaceやfeatureなどを準備して、出来るだけ既存のプログラムを移行しやすくしたつもりだ。pip3とpython3があれば、簡単にインストールできるので、ぜひ使ってみてほしい。
UniDic2UDによるCaboChaエミュレータ More ログイン