パスワードを忘れた? アカウント作成
15566883 journal
人工知能

yasuokaの日記: Universal DependenciesのCoNLL-Uデータを直接spaCyに読み込むには 3

日記 by yasuoka

昨日の日記の読者から、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(標識)

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
  • 追加の解説、ありがとうございます。 以下、本解説の趣旨から外れた質問になっていましたらごめんなさい。 "紫色で細長い唇形花が総状に咲く。"という例文ですが、 今回のesuparでは、"唇形花が"というように一つにまとまって良かったです。 しかし、文節係り受けが、”紫色で -> 咲く。 (斜格補語)”となってしまうようです。 でも、以前のSuPar-UniDicでは、"紫色で -> 細長い (斜格補語)"という妥当な結果でした。 何かご教示いただければ幸いです。山本富士男
    • うーむ、この文に対しては、esuparのbert-base-japanese-unidic-luw-uposモデルも、SuPar-UniDicも、あまり適切な結果になっていないように思えます。というのも、「紫色」が修飾しているのは本来は「唇形花」なので、国語研長単位の単語間係り受けとしては

      紫色   NOUN  ═╗<══╗     nmod(体言による連体修飾語)
      で     AUX   <╝   ║     case(格表示)
      細長い ADJ   <══╗ ║     amod(用言による連体修飾語)
      唇形花 NOUN  ═╗═╝═╝<╗   nsubj(主語)
      が     ADP   <╝     ║   case(格表示)
      総状   NOUN  ═╗<╗   ║   obl(斜格補語)
      に     ADP   <╝ ║   ║   case(格表示)
      咲く   VERB  ═══╝═══╝═╗ root(親)
      。     PUNCT <════════╝ punct(句読点)

      の方が適切だろうと思うのです。ただ、こういう解析をするには「で」が邪魔ですね…。

      親コメント
typodupeerror

「科学者は100%安全だと保証できないものは動かしてはならない」、科学者「えっ」、プログラマ「えっ」

読み込み中...