yasuokaの日記: spaCyの日本語モデルで旧字旧仮名の係り受け解析
昨日の日記の続きだが、spaCyの日本語モデルで「國境の長いトンネルを拔けると、そこは雪國であつた。」を係り受け解析してみることにした。大中小の日本語モデルのうち、さすがに小のモデルでは苦しそうなので、中のモデル(ja_core_news_md)を使ってみた。
>>> import spacy
>>> ja=spacy.load("ja_core_news_md")
>>> doc=ja("國境の長いトンネルを拔けると、そこは雪國であつた。")
>>> import deplacy
>>> deplacy.render(doc)
國 NOUN <╗ compound
境 NOUN ═╝═╗<╗ nmod
の ADP <══╝ ║ case
長い ADJ <══╗ ║ acl
トンネル NOUN ═╗═╝═╝<╗ obj
を ADP <╝ ║ case
拔け VERB ═══════╝═╗═╗═╗<╗ advcl
る AUX <════════╝ ║ ║ ║ mark
と CCONJ <══════════╝ ║ ║ mark
、 PUNCT <════════════╝ ║ punct
そこ PRON ═╗<════╗ ║ nsubj
は ADP <╝ ║ ║ case
雪 NOUN <╗ ║ ║ compound
國 NOUN ═╝═╗<╗ ║ ║ advcl
で ADP <══╝ ║ ║ ║ cop
あつ VERB ═╗═══╝═╝═══════╝═╗ ROOT
た AUX <╝ ║ aux
。 PUNCT <════════════════╝ punct
「國境」と「雪國」が、それぞれ2語に分かれてしまっているものの、そこはcompoundで繋がれているし、それ以外の係り受けは大丈夫なようだ。Universal Dependenciesで、解析結果をもう少し詳細に見てみよう。
>>> print("".join("\t".join([str(t.i+1),t.orth_,t.lemma_,t.pos_,t.tag_,"_",str(0 if t.head==t else t.head.i+1),t.dep_,"_","_" if t.whitespace_ else "SpaceAfter=No"])+"\n" for t in doc))
1 國 国 NOUN 名詞-普通名詞-一般 _ 2 compound _ SpaceAfter=No
2 境 境 NOUN 名詞-普通名詞-一般 _ 5 nmod _ SpaceAfter=No
3 の の ADP 助詞-格助詞 _ 2 case _ SpaceAfter=No
4 長い 長い ADJ 形容詞-一般 _ 5 acl _ SpaceAfter=No
5 トンネル トンネル NOUN 名詞-普通名詞-サ変可能 _ 7 obj _ SpaceAfter=No
6 を を ADP 助詞-格助詞 _ 5 case _ SpaceAfter=No
7 拔け 抜く VERB 動詞-非自立可能 _ 16 advcl _ SpaceAfter=No
8 る り AUX 助動詞 _ 7 mark _ SpaceAfter=No
9 と と CCONJ 助詞-接続助詞 _ 7 mark _ SpaceAfter=No
10 、 、 PUNCT 補助記号-読点 _ 7 punct _ SpaceAfter=No
11 そこ 其処 PRON 代名詞 _ 16 nsubj _ SpaceAfter=No
12 は は ADP 助詞-係助詞 _ 11 case _ SpaceAfter=No
13 雪 雪 NOUN 名詞-普通名詞-一般 _ 14 compound _ SpaceAfter=No
14 國 国 NOUN 接尾辞-名詞的-一般 _ 16 advcl _ SpaceAfter=No
15 で で ADP 助詞-格助詞 _ 14 cop _ SpaceAfter=No
16 あつ 有る VERB 動詞-非自立可能 _ 0 ROOT _ SpaceAfter=No
17 た た AUX 助動詞 _ 16 aux _ SpaceAfter=No
18 。 。 PUNCT 補助記号-句点 _ 16 punct _ SpaceAfter=No
「拔ける」が2語に分かれている部分は、どうもlemma_がうまく取れていないようだ。うーむ、このあたりは、spaCyより、むしろSudachiPyに頑張ってもらうべき部分なのかしら。
spaCyの日本語モデルで旧字旧仮名の係り受け解析 More ログイン