yasuokaの日記: spaCy 2.3.1で読む『吾輩は猫である』
spaCyのバージョンが2.3.1に上がると同時に、日本語モデルja_core_news_mdのバージョンも2.3.2に上がったので、とりあえず使ってみることにした。まずは最新版をdeplacyとともにインストール。
$ pip3 install -U spacy deplacy
$ python3 -m spacy download ja_core_news_md
インストールがうまくいったら、言語処理100本ノック2020の『吾輩は猫である』から、「ヴァイオリンを始める」文を探してみよう。
$ python3
>>> import spacy,urllib.request
>>> ja=spacy.load("ja_core_news_md")
>>> with urllib.request.urlopen("https://nlp100.github.io/data/neko.txt") as r:
... q=r.read()
...
>>> u=ja(q.decode("utf-8"))
>>> s=set(w.sent for w in u if w.lemma_=="バイオリン" and w.dep_=="obj" and w.head.lemma_=="始める")
>>> print(s)
{「君はヴァイオリンをいつ頃から始めたのかい。}
>>> for v in s:
... 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 v))
...
180723 「 「 PUNCT 補助記号-括弧開 _ 180724 punct _ SpaceAfter=No
180724 君 君 PRON 代名詞 _ 180730 nsubj _ SpaceAfter=No
180725 は は ADP 助詞-係助詞 _ 180724 case _ SpaceAfter=No
180726 ヴァイオリン バイオリン NOUN 名詞-普通名詞-一般 _ 180730 obj _ SpaceAfter=No
180727 を を ADP 助詞-格助詞 _ 180726 case _ SpaceAfter=No
180728 いつ頃 いつ頃 NOUN 名詞-普通名詞-副詞可能 _ 180730 obl _ SpaceAfter=No
180729 から から ADP 助詞-格助詞 _ 180728 case _ SpaceAfter=No
180730 始め 始める VERB 動詞-非自立可能 _ 0 ROOT _ SpaceAfter=No
180731 た た AUX 助動詞 _ 180730 aux _ SpaceAfter=No
180732 の の SCONJ 助詞-準体助詞 _ 180730 mark _ SpaceAfter=No
180733 か か PART 助詞-終助詞 _ 180730 mark _ SpaceAfter=No
180734 い い PART 助詞-終助詞 _ 180730 aux _ SpaceAfter=No
180735 。 。 PUNCT 補助記号-句点 _ 180730 punct _ _
spaCy+ja_core_news_mdは、「ヴァイオリンを始める」文を、ちゃんと探せているようだ。結果をdeplacyで構文木にしてみよう。
>>> import deplacy
>>> for v in s:
... deplacy.render(v,Japanese=True)
...
「 PUNCT <══╗ punct(句読点)
君 PRON ═╗═╝<════╗ nsubj(主語)
は ADP <╝ ║ case(格表示)
ヴァイオリン NOUN ═╗<════╗ ║ obj(目的語)
を ADP <╝ ║ ║ case(格表示)
いつ頃 NOUN ═╗<══╗ ║ ║ obl(斜格補語)
から ADP <╝ ║ ║ ║ case(格表示)
始め VERB ═╗═╗═╝═╝═╝═╗═╗═╗ ROOT(親)
た AUX <╝ ║ ║ ║ ║ aux(動詞補助成分)
の SCONJ <══║═══════╝ ║ ║ mark(標識)
か PART <══║═════════╝ ║ mark(標識)
い PART <══╝ ║ aux(動詞補助成分)
。 PUNCT <══════════════╝ punct(句読点)
「始め=aux⇒い」の係り受けは、aux(動詞補助成分)ではなくmark(標識)の方が適切な気がするが、それ以外はうまく読めている。なお、spaCyの日本語モデルには、大(ja_core_news_lg)・中(ja_core_news_md)・小(ja_core_news_sm)の3種類があるので、よければ他のモデルも比較してみてほしい。
spaCy 2.3.1で読む『吾輩は猫である』 More ログイン