パスワードを忘れた? アカウント作成
14970299 journal
Google

yasuokaの日記: AllenNLPの係り受け解析モデルをdeplacyに繫ぐには

日記 by yasuoka

AllenNLPの係り受け解析モデルを、Google Colaboratoryで動かしてみた。

!pip install -U allennlp allennlp-models urllib3
from allennlp.predictors.predictor import Predictor
predictor=Predictor.from_path("https://storage.googleapis.com/allennlp-public-models/biaffine-dependency-parser-ptb-2020.04.06.tar.gz")
doc=predictor.predict("I saw a horse yesterday which had no name.")
print(doc)

「I saw a horse yesterday which had no name.」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果が得られた。

{'arc_loss': 0.47957390546798706, 'tag_loss': 0.23244254291057587, 'loss': 0.7120164632797241, 'words': ['I', 'saw', 'a', 'horse', 'yesterday', 'which', 'had', 'no', 'name', '.'], 'pos': ['PRON', 'VERB', 'DET', 'NOUN', 'NOUN', 'DET', 'AUX', 'DET', 'NOUN', 'PUNCT'], 'predicted_dependencies': ['root', 'dep', 'dep', 'dep', 'dep', 'nsubj', 'dep', 'dep', 'dobj', 'punct'], 'predicted_heads': [0, 1, 4, 2, 2, 7, 2, 9, 7, 2], 'hierplane_tree': {'text': 'I saw a horse yesterday which had no name .', 'root': {'word': 'I', 'nodeType': 'root', 'attributes': ['PRON'], 'link': 'root', 'spans': [{'start': 0, 'end': 2}], 'children': [{'word': 'saw', 'nodeType': 'dep', 'attributes': ['VERB'], 'link': 'dep', 'spans': [{'start': 2, 'end': 6}], 'children': [{'word': 'horse', 'nodeType': 'dep', 'attributes': ['NOUN'], 'link': 'dep', 'spans': [{'start': 8, 'end': 14}], 'children': [{'word': 'a', 'nodeType': 'dep', 'attributes': ['DET'], 'link': 'dep', 'spans': [{'start': 6, 'end': 8}]}]}, {'word': 'yesterday', 'nodeType': 'dep', 'attributes': ['NOUN'], 'link': 'dep', 'spans': [{'start': 14, 'end': 24}]}, {'word': 'had', 'nodeType': 'dep', 'attributes': ['AUX'], 'link': 'dep', 'spans': [{'start': 30, 'end': 34}], 'children': [{'word': 'which', 'nodeType': 'nsubj', 'attributes': ['DET'], 'link': 'nsubj', 'spans': [{'start': 24, 'end': 30}]}, {'word': 'name', 'nodeType': 'dobj', 'attributes': ['NOUN'], 'link': 'dobj', 'spans': [{'start': 37, 'end': 42}], 'children': [{'word': 'no', 'nodeType': 'dep', 'attributes': ['DET'], 'link': 'dep', 'spans': [{'start': 34, 'end': 37}]}]}]}, {'word': '.', 'nodeType': 'punct', 'attributes': ['PUNCT'], 'link': 'punct', 'spans': [{'start': 42, 'end': 44}]}]}]}, 'nodeTypeToStyle': {'root': ['color5', 'strong'], 'dep': ['color5', 'strong'], 'nsubj': ['color1'], 'nsubjpass': ['color1'], 'csubj': ['color1'], 'csubjpass': ['color1'], 'pobj': ['color2'], 'dobj': ['color2'], 'iobj': ['color2'], 'mark': ['color2'], 'pcomp': ['color2'], 'xcomp': ['color2'], 'ccomp': ['color2'], 'acomp': ['color2'], 'aux': ['color3'], 'cop': ['color3'], 'det': ['color3'], 'conj': ['color3'], 'cc': ['color3'], 'prep': ['color3'], 'number': ['color3'], 'possesive': ['color3'], 'poss': ['color3'], 'discourse': ['color3'], 'expletive': ['color3'], 'prt': ['color3'], 'advcl': ['color3'], 'mod': ['color4'], 'amod': ['color4'], 'tmod': ['color4'], 'quantmod': ['color4'], 'npadvmod': ['color4'], 'infmod': ['color4'], 'advmod': ['color4'], 'appos': ['color4'], 'nn': ['color4'], 'neg': ['color0'], 'punct': ['color0']}, 'linkToPosition': {'nsubj': 'left', 'nsubjpass': 'left', 'csubj': 'left', 'csubjpass': 'left', 'pobj': 'right', 'dobj': 'right', 'iobj': 'right', 'pcomp': 'right', 'xcomp': 'right', 'ccomp': 'right', 'acomp': 'right'}}}

何となく結果が変だ。とりあえず、deplacyに繫いでみよう。

!pip install -U deplacy allennlp allennlp-models urllib3
from allennlp.predictors.predictor import Predictor
predictor=Predictor.from_path("https://storage.googleapis.com/allennlp-public-models/biaffine-dependency-parser-ptb-2020.04.06.tar.gz")
def nlp(t):
  s=predictor.predict(t)
  return "\n".join(["\t".join([str(i+1),w,"_",p,p,"_",str(h),d,"_","_"]) for i,(w,p,h,d) in enumerate(zip(s["words"],s["pos"],s["predicted_heads"],s["predicted_dependencies"]))])+"\n\n"
doc=nlp("I saw a horse yesterday which had no name.")
import deplacy
deplacy.render(doc)

私の手元では、以下の結果が得られた。

I         PRON  ═══════════╗ root
saw       VERB  ═══╗═╗═╗═╗<╝ dep
a         DET   <╗ ║ ║ ║ ║   dep
horse     NOUN  ═╝<╝ ║ ║ ║   dep
yesterday NOUN  <════╝ ║ ║   dep
which     DET   <════╗ ║ ║   nsubj
had       AUX   ═══╗═╝<╝ ║   dep
no        DET   <╗ ║     ║   dep
name      NOUN  ═╝<╝     ║   dobj
.         PUNCT <════════╝   punct

解析結果を見る限り、係り受けタグがdepばかりで、正直なところ使い物にならない。うーん、どこかインストール方法か、あるいは使用法をミスってるのかしら?

typodupeerror

計算機科学者とは、壊れていないものを修理する人々のことである

読み込み中...