yasuokaの日記: Universal DependenciesのCoNLL-Uデータを直接spaCyに読み込むには 3
昨日の日記の読者から、esuparの解析結果をspaCyで扱う方法を知りたい、との御質問をいただいた。spaCy v3にはconllu_to_docsがあるので、これを使えばいい。たとえば、こんな感じ。
$ pip3 install -U esupar fugashi unidic-lite pytokenizations spacy
$ python3
>>> import esupar
>>> from spacy.training.converters import conllu_to_docs
>>> nlp=esupar.load("KoichiYasuoka/bert-base-japanese-unidic-luw-upos")
>>> doc=list(conllu_to_docs(str(nlp("全学年にわたって小学校の国語の教科書に大量の挿し絵が用いられている"))))[0]
>>> print(type(doc),list(doc))
<class 'spacy.tokens.doc.Doc'> [全学年, にわたって, 小学校, の, 国語, の, 教科書, に, 大量, の, 挿し絵, が, 用い, られ, ている]
うまく行ったら、spaCyのright_edgeを使って、文節に組み上げてみよう。
>>> from spacy.tokens import Span
>>> doc.spans["bunsetu"]=[]
>>> i=0
>>> while i<len(doc):
... j=doc[i].right_edge.i+1
... doc.spans["bunsetu"].append(Span(doc,i,j))
... i=j
...
>>> print(doc.spans)
{'bunsetu': [全学年にわたって, 小学校の, 国語の, 教科書に, 大量の, 挿し絵が, 用いられている]}
文節間係り受けをおこなうなら、こんな感じ。
>>> from deplacy.deprelja import deprelja
>>> for b in doc.spans["bunsetu"]:
... for t in b.lefts:
... print(Span(doc,t.i,t.right_edge.i+1),"->",b,"("+deprelja[t.dep_]+")")
...
小学校の -> 国語の (体言による連体修飾語)
国語の -> 教科書に (体言による連体修飾語)
大量の -> 挿し絵が (体言による連体修飾語)
全学年にわたって -> 用いられている (斜格補語)
教科書に -> 用いられている (斜格補語)
挿し絵が -> 用いられている (主語)
ただし、esuparはLEMMA(見出し語形)等をサポートしていないので、解析結果をspaCyに読み込むのは、あくまで係り受けを扱いやすくするためである。もちろん、単語間係り受けも普通に扱えるので、ぜひ挑戦してみてほしい。
>>> import deplacy
>>> deplacy.render(doc,Japanese=True)
全学年 NOUN ═╗<══════╗ obl(斜格補語)
にわたって ADP <╝ ║ case(格表示)
小学校 NOUN ═╗<╗ ║ nmod(体言による連体修飾語)
の ADP <╝ ║ ║ case(格表示)
国語 NOUN ═╗═╝<╗ ║ nmod(体言による連体修飾語)
の ADP <╝ ║ ║ case(格表示)
教科書 NOUN ═╗═══╝<╗ ║ obl(斜格補語)
に ADP <╝ ║ ║ case(格表示)
大量 ADJ ═╗<╗ ║ ║ nmod(体言による連体修飾語)
の ADP <╝ ║ ║ ║ case(格表示)
挿し絵 NOUN ═╗═╝<╗ ║ ║ nsubj(主語)
が ADP <╝ ║ ║ ║ case(格表示)
用い VERB ═╗═╗═╝═╝═╝ ROOT(親)
られ AUX <╝ ║ aux(動詞補助成分)
ている SCONJ <══╝ mark(標識)
紫色で細長い唇形花が総状に咲く。という例文 (スコア:1)
Re:紫色で細長い唇形花が総状に咲く。という例文 (スコア:2)
うーむ、この文に対しては、esuparのbert-base-japanese-unidic-luw-uposモデルも、SuPar-UniDicも、あまり適切な結果になっていないように思えます。というのも、「紫色」が修飾しているのは本来は「唇形花」なので、国語研長単位の単語間係り受けとしては
の方が適切だろうと思うのです。ただ、こういう解析をするには「で」が邪魔ですね…。
Re:紫色で細長い唇形花が総状に咲く。という例文 (スコア:1)