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

yasuokaの日記: ポルトガル語と日本語の係り受け解析エンジンとしてのUDPipe

日記 by yasuoka

昨日のspaCyポルトガル語モデルがイマイチだったので、ゴールデンウィーク4日目はUDPipeを試してみることにした。LINDAT/CLARINのサーバAPIを使えば、UDPipeはインストール不要なので、ちょっとだけクラス定義してみよう。

% python3
>>> class UDPipe:
...   def __init__(self,lang):
...     self._url="http://lindat.mff.cuni.cz/services/udpipe/api/process?model="+lang+"&tokenizer&tagger&parser"
...   def __call__(self,text):
...     import urllib.parse,urllib.request,json
...     with urllib.request.urlopen(self._url+"&data="+urllib.parse.quote(text)) as r:
...       q=r.read()
...     return(json.loads(q)["result"])
...
>>>

これで、UDPipeの全ての言語モデルが使えるはずだ。とりあえず、日本語モデルを使って「笑顔で彼は座った」を係り受け解析してみよう。

>>> ja=UDPipe("ja")
>>> s=ja("笑顔で彼は座った")
>>> print(s)
# newdoc
# newpar
# sent_id = 1
# text = 笑顔で彼は座った
1    笑顔    笑顔    NOUN    NN    _    5    obl    _    SpaceAfter=No
2    で    で    ADP    PS    _    1    case    _    SpaceAfter=No
3    彼    彼    PRON    NP    _    5    nsubj    _    SpaceAfter=No
4    は    は    ADP    PK    _    3    case    _    SpaceAfter=No
5    座っ    座る    VERB    VV    _    0    root    _    SpaceAfter=No
6    た    た    AUX    AV    _    5    aux    _    SpaceAfter=No

SVGで可視化すると、こんな感じ。私(安岡孝一)の見る限り、変な部分は特に見当たらず、完璧に解析できていると思う。

次に、ポルトガル語モデルで「Ele se sentou com um sorriso no rosto」を係り受け解析してみよう。

>>> pt=UDPipe("pt")
>>> s=pt("Ele se sentou com um sorriso no rosto")
>>> print(s)
# newdoc
# newpar
# sent_id = 1
# text = Ele se sentou com um sorriso no rosto
1    Ele    _    PRON    PRON    _    3    nsubj    _    _
2    se    _    PRON    PRON    _    3    obj    _    _
3    sentou    sentar    VERB    VERB    _    0    root    _    _
4    com    _    ADP    ADP    _    6    case    _    _
5    um    _    DET    DET    _    6    det    _    _
6    sorriso    sorriso    NOUN    NOUN    _    3    nmod    _    _
7-8    no    _    _    _    _    _    _    _    _
7    en    en    ADP    ADP    _    9    case    _    _
8    o    o    DET    DET    Definite=Def|Gender=Masc|Number=Sing|PronType=Art    9    det    _    _
9    rosto    rosto    NOUN    NOUN    _    6    nmod    _    SpaceAfter=No

SVGで可視化すると、こんな感じ。「no」が、ちゃんとADP(前置詞)とDET(冠詞)に分かれていて、素晴らしい。惜しむらくは「sentou」─nmod→「sorriso」のリンクで、そこはnmodじゃなくoblのはずだ。そこを除けば、ほぼ完璧に解析できているのに、非常に惜しい。

こんな風にUniversal Dependenciesを用いれば、言語間の比較分析が、かなり容易になる。上の例に則して言えば、「彼」←nsubj─「座っ」という係り受けが、そのまま「Ele」←nsubj─「sentou」という係り受けに対応している。一方、「彼」─case→「は」という係り受けは、この例では日本語固有だし、「se」←obj─「sentou」という係り受けはポルトガル語固有だ。ただ、現在のAI自然言語処理の主流は、むしろend-to-endの翻訳にあって、こういう言語間の比較分析ってのは、あまり顧みられていない気がする。それとも、言語間の比較分析にAIを使うのは、すでに当たり前のことであって、研究する必要すらないのかしら?

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

弘法筆を選ばず、アレゲはキーボードを選ぶ -- アレゲ研究家

読み込み中...