yasuokaの日記: UD-Kanbun・spacy-stanza・spacy-udpipeの自動文切り機能をOFFにするには
昨日の日記で書いたUD-Kanbunとspacy-stanzaとspacy-udpipeだが、自動文切り機能をOFFにして、Google Colaboratory上でdeplacyで再比較してみた。ただ、自動文切り機能をOFFにする方法が、それぞれバラバラだったので、ここに記録しておくことにする。まずはUD-Kanbunだが、Danku=Falseで文切りをOFFにできる。
!pip install udkanbun deplacy
import udkanbun.spacy
lzh=udkanbun.spacy.load(Danku=False)
doc=lzh("不入虎穴不得虎子")
import deplacy
deplacy.render(doc)
私(安岡孝一)の手元では、以下の結果になった。
不 ADV <╗ advmod
入 VERB ═╩═╦═╗ ROOT
虎 NOUN <╗ ║ ║ nmod
穴 NOUN ═╝<╝ ║ obj
不 ADV <╗ ║ advmod
得 VERB ═╩═╗<╝ parataxis
虎 NOUN <╗ ║ nmod
子 NOUN ═╝<╝ obj
単語間の係り受けとしては、ほぼ完璧な解析結果である。次にspacy-stanzaを試してみよう。tokenize_no_ssplit=Trueで自動文切り機能をOFFにできる。
!pip install spacy_stanza deplacy
import stanza
stanza.download("lzh")
from spacy_stanza import StanzaLanguage
lzh=StanzaLanguage(stanza.Pipeline("lzh",tokenize_no_ssplit=True))
doc=lzh("不入虎穴不得虎子")
import deplacy
deplacy.render(doc)
私の手元では以下の結果になった。
不 ADV <╗ advmod
入 VERB ═╩═╦═╗ root
虎 NOUN ═╗<╝ ║ obj
穴 NOUN <╝ ║ conj
不 ADV <╗ ║ advmod
得 VERB ═╩═╗<╝ parataxis
虎 NOUN ═╗<╝ obj
子 NOUN <╝ conj
「虎=conj⇒穴」(虎と穴)は、どう考えても解析ミスで、「虎⇐nmod=穴」(虎の穴)が正しいと思う。「虎=conj⇒子」(虎と子)も同様だ。次にspacy-udpipeを試してみよう。自動文切り機能のOFFは、トークナイザを"presegmented"に入れ替える必要があるので、ちょっと手間だったりする。
!pip install spacy-udpipe deplacy
import spacy_udpipe
spacy_udpipe.download("lzh")
lzh=spacy_udpipe.load("lzh")
lzh.tokenizer.model.tokenize=lambda t:lzh.tokenizer.model._read(text=t,input_format=lzh.tokenizer.model.model.newTokenizer("presegmented"))
doc=lzh("不入虎穴不得虎子")
import deplacy
deplacy.render(doc)
私の手元では以下の結果になった。
不 ADV <╗ advmod
入 VERB ═╩═╦═╗ ROOT
虎 NOUN ═╗<╝ ║ obj
穴 NOUN <╝ ║ conj
不 ADV <╗ ║ advmod
得 VERB ═╩═╗<╝ parataxis
虎 NOUN <╗ ║ nmod
子 NOUN ═╝<╝ obj
「虎=conj⇒穴」(虎と穴)は解析ミスだが、「虎⇐nmod=子」(虎の子)は正解だ。つまり、自動文切り機能をOFFにした場合の「不入虎穴不得虎子」に対する結果としては、UD-Kanbunが一番よくて、spacy-udpipeがその次、spacy-stanzaがその次だが、いずれも解析ミスは致命的ではない気がする。うーむ、他の言語も較べてみるべきかな。
UD-Kanbun・spacy-stanza・spacy-udpipeの自動文切り機能をOFFにするには More ログイン