yasuokaの日記: spaCyと現代書き言葉UniDicで読む『吾輩は猫である』
一昨昨日にリリースしたunidic2udを改造して、spaCyの言語モジュールとして使えるようにしたところ、かなり高速化できてしまった。インストール方法は、以下の通り。
% pip3 install 'unidic2ud>=1.0.1'
% pip3 install 'spacy>=2.1.0'
さらなる高速化のために、現代書き言葉UniDicと、UDPipeのjapanese-gsdモデルも手元にダウンロードしておこう。
% python3 -m unidic2ud download.unidic gendai
% python3 -m unidic2ud download.udpipe japanese-gsd
インストールがうまくいったら、一昨日と同様に言語処理100本ノック2015の『吾輩は猫である』から、「バイオリンを始める」文、すなわち「バイオリン←obj─始める」という係り受けを、spaCyで探してみよう。
% python3
>>> import unidic2ud.spacy
>>> ja=unidic2ud.spacy.load("gendai")
>>> import urllib.request
>>> with urllib.request.urlopen("http://www.cl.ecei.tohoku.ac.jp/nlp100/data/neko.txt") as r:
... q=r.read()
...
>>> doc=ja(q.decode("utf-8"))
>>> g=set(t.sent for t in doc if t.lemma_=="バイオリン" and t.dep_=="obj" and t.head.lemma_=="始める")
>>> print(g)
[「君はヴァイオリンをいつ頃から始めたのかい。]
私(安岡孝一)の手元の非力なマシンでも、係り受け解析も含め、5分たらずで目的の文が探せてしまう。Universal Dependenciesの形で係り受けを見るなら
>>> print(unidic2ud.spacy.to_conllu(g))
# text = 「君はヴァイオリンをいつ頃から始めたのかい。
1 「 「 PUNCT 補助記号-括弧開 _ 2 punct _ SpaceAfter=No
2 君 君 PRON 代名詞 _ 8 nsubj _ SpaceAfter=No|Translit=キミ
3 は は ADP 助詞-係助詞 _ 2 case _ SpaceAfter=No|Translit=ハ
4 ヴァイオリン バイオリン NOUN 名詞-普通名詞-一般 _ 8 obj _ SpaceAfter=No
5 を を ADP 助詞-格助詞 _ 4 case _ SpaceAfter=No|Translit=ヲ
6 いつ頃 何時頃 NOUN 名詞-普通名詞-副詞可能 _ 8 obl _ SpaceAfter=No|Translit=イツゴロ
7 から から ADP 助詞-格助詞 _ 6 case _ SpaceAfter=No|Translit=カラ
8 始め 始める VERB 動詞-非自立可能 _ 0 root _ SpaceAfter=No|Translit=ハジメ
9 た た AUX 助動詞 _ 8 aux _ SpaceAfter=No|Translit=タ
10 の の ADP 助詞-準体助詞 _ 8 case _ SpaceAfter=No|Translit=ノ
11 か か PART 助詞-終助詞 _ 8 mark _ SpaceAfter=No|Translit=カ
12 い い PART 助詞-終助詞 _ 8 mark _ SpaceAfter=No|Translit=イ
13 。 。 PUNCT 補助記号-句点 _ 8 punct _ SpaceAfter=No
でOKだ。MeCabとUDPipeが高速な上に、spaCyもかなり高速なので、素晴らしく速い。さて、この方法で、古典中国語(漢文)向けudkanbunの方も、何とかspaCyモジュールにできないかな…。
spaCyと現代書き言葉UniDicで読む『吾輩は猫である』 More ログイン