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

yasuokaの日記: DiaParserの英語係り受け解析をGoogle Colaboratoryで動かす

日記 by yasuoka

一昨日の日記で紹介したDiaParserだが、単語切りモジュールを内蔵せずStanzaに頼っており、しかも作りがヘボい。なので、英語の係り受け解析に対しては、たとえばnltk.tokenizeを併用すべきだと思う。Google Colaboratoryで、nltk.tokenizeとDiaParserをdeplacyに繫いでみよう。

!pip install deplacy diaparser
import nltk
nltk.download("punkt")
from nltk.tokenize import word_tokenize
from diaparser.parsers import Parser
parser=Parser.load("en_ewt.electra-base")
nlp=lambda t:"\n".join([str(s) for s in parser.predict(data=word_tokenize(t),prob=True,text=None).sentences])
doc=nlp("I saw a horse yesterday which had no name.")
import deplacy
deplacy.render(doc,Japanese=True)
deplacy.serve(doc,port=None)

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

I         <══════════════╗   nsubj(主語)
saw       ═══════════╗═╗═╝═╗ root(親)
a         <════════╗ ║ ║   ║ det(決定詞)
horse     ═══════╗═╝<╝ ║   ║ obj(目的語)
yesterday <══════║═════╝   ║ obl:tmod(斜格補語[時])
which     <════╗ ║         ║ nsubj(主語)
had       ═══╗═╝<╝         ║ acl:relcl(連体修飾節[relcl])
no        <╗ ║             ║ det(決定詞)
name      ═╝<╝             ║ obj(目的語)
.         <════════════════╝ punct(句読点)

1    I    _    _    _    _    2    nsubj    _    _
2    saw    _    _    _    _    0    root    _    _
3    a    _    _    _    _    4    det    _    _
4    horse    _    _    _    _    2    obj    _    _
5    yesterday    _    _    _    _    2    obl:tmod    _    _
6    which    _    _    _    _    7    nsubj    _    _
7    had    _    _    _    _    4    acl:relcl    _    _
8    no    _    _    _    _    9    det    _    _
9    name    _    _    _    _    7    obj    _    _
10    .    _    _    _    _    2    punct    _    _

SVGで可視化すると、こんな感じ。係り受けの交差がちゃんと解析できていて非常に素晴らしいが、品詞が全て「???」になってしまうのはツライ。うーむ、単語切りと品詞付与を、何か良さげなモジュールに「外注」すべきかしら。

この議論は、yasuoka (21275)によって「 ログインユーザだけ」として作成されている。 ログインしてから来てね。
typodupeerror

海軍に入るくらいなら海賊になった方がいい -- Steven Paul Jobs

読み込み中...