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

yasuokaの日記: 日本語係り受け解析エンジンとしてのGiNZA・StanfordNLP・UDPipe

日記 by yasuoka

GiNZA1.0.2が一昨日リリースされたので、StanfordNLP0.1.2およびUDPipe1.2.0と比較してみることにした。とりあえずは、python3.7とpip3で、日本語モデルのインストール。

% pip3 install 'https://github.com/megagonlabs/ginza/releases/download/v1.0.2/ja_ginza_nopn-1.0.2.tgz'
% pip3 install stanfordnlp
% python3
>>> import stanfordnlp
>>> stanfordnlp.download('en')
>>> stanfordnlp.download('ja')
>>> quit()

あちこちから色んなモノを取ってくることになるので、とにかくダウンロードに時間がかかるが、一回だけ我慢することになる。ここではUDPipeはインストールせずに、LINDAT/CLARINのサーバAPIを使うことにしよう。次に、各モデルのインターフェースの準備。

% python3
>>> import spacy
>>> ja_ginza=spacy.load("ja_ginza_nopn")
>>> def ginza2ud(sentence):
...   from spacy.lang.ja_ginza.cli import token_line
...   return("".join("".join(token_line(t,{})+"\n" for t in s)+"\n" for s in ja_ginza(sentence).sents))
...
>>> import stanfordnlp
>>> ja_stanfordnlp=stanfordnlp.Pipeline(lang="ja")
>>> def stanfordnlp2ud(sentence):
...   from stanfordnlp.models.common import conll
...   return(ja_stanfordnlp(sentence).conll_file.conll_as_string())
...
>>> def udpipe2ud(sentence):
...   import urllib.parse,urllib.request,json
...   with urllib.request.urlopen("http://lindat.mff.cuni.cz/services/udpipe/api/process?model=japanese&tokenizer&tagger&parser&data="+urllib.parse.quote(sentence)) as r:
...     q=r.read()
...   return(json.loads(q)["result"])
...
>>>

GiNZAとStanfordNLPとUDPipeで、それぞれUniversal Dependenciesを返す関数が、これで準備できたことになる。試しに「望遠鏡で泳ぐ彼女を見た」を解析してみよう。

>>> s="望遠鏡で泳ぐ彼女を見た"
>>> print(ginza2ud(s))
>>> print(stanfordnlp2ud(s))
>>> print(udpipe2ud(s))
>>>

この結果、私(安岡孝一)の手元では、以下の3種類のUniversal Dependenciesが出力された。

1 望遠鏡 望遠鏡 NOUN 名詞-普通名詞-一般 _ 3 nmod _ SpaceAfter=No
2 で で ADP 助詞-格助詞 _ 1 case _ SpaceAfter=No
3 泳ぐ 泳ぐ VERB 動詞-一般 _ 4 acl _ SpaceAfter=No
4 彼女 彼女 PRON 代名詞 _ 6 obj _ SpaceAfter=No
5 を を ADP 助詞-格助詞 _ 4 case _ SpaceAfter=No
6 見 見る VERB 動詞-非自立可能 _ 0 root _ SpaceAfter=No
7 た た AUX 助動詞 _ 6 aux _ SpaceAfter=No

1 望遠鏡 望遠鏡 NOUN _ _ 3 obl _ _
2 で で ADP _ _ 1 case _ _
3 泳ぐ 泳ぐ VERB _ _ 4 acl _ _
4 彼女 彼女 PRON _ _ 6 obj _ _
5 を を ADP _ _ 4 case _ _
6 見 見る VERB _ _ 0 root _ _
7 た た AUX _ _ 6 aux _ _

# newdoc
# newpar
# sent_id = 1
# text = 望遠鏡で泳ぐ彼女を見た
1 望遠鏡 望遠鏡 NOUN NN _ 6 obl _ SpaceAfter=No
2 で で ADP PS _ 1 case _ SpaceAfter=No
3 泳ぐ 泳ぐ ADV RB _ 6 advmod _ SpaceAfter=No
4 彼女 彼女 PRON NP _ 6 obj _ SpaceAfter=No
5 を を ADP PS _ 4 case _ SpaceAfter=No
6 見 見る VERB VV _ 0 root _ SpaceAfter=No
7 た た AUX AV _ 6 aux _ SpaceAfter=No

上から順に、GiNZA、StanfordNLP、UDPipeの結果である。正しく「望遠鏡←obl─見」となっているのはUDPipeだけで、GiNZAもStanfordNLPも現状では解析しきれていない。ただ、UDPipeは「泳ぐ」がADV(副詞)になってしまっており、これはこれでマズイと思う。うーん、今のところ一長一短だなぁ。

この議論は、yasuoka (21275)によって ログインユーザだけとして作成されたが、今となっては 新たにコメントを付けることはできません。
typodupeerror

未知のハックに一心不乱に取り組んだ結果、私は自然の法則を変えてしまった -- あるハッカー

読み込み中...