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

yasuokaの日記: Re: Question Answeringを係り受け解析に応用するには

日記 by yasuoka

一昨日の日記の手法を、もう少しtransformers向けに改造して、国語研長単位向けdeberta-base-japanese-aozora-ud-headを試作してみた。ただ、QuestionAnsweringPipelineにはバグがあるらしく、日本語がうまく通らない。仕方ないので、torch.argmaxを手で叩く方法にしてみた。最新のtransformersをインストールしつつ、Question Answeringによる係り受け解析を試してみよう。

$ pip3 install -U transformers --user
$ python3
>>> import torch
>>> from transformers import AutoTokenizer,AutoModelForQuestionAnswering
>>> tokenizer=AutoTokenizer.from_pretrained("KoichiYasuoka/deberta-base-japanese-aozora-ud-head")
>>> model=AutoModelForQuestionAnswering.from_pretrained("KoichiYasuoka/deberta-base-japanese-aozora-ud-head")
>>> def head(question,context):
...   inputs=tokenizer(question,context,return_tensors="pt",return_offsets_mapping=True)
...   offsets=inputs.pop("offset_mapping").tolist()[0]
...   outputs=model(**inputs)
...   start,end=torch.argmax(outputs.start_logits),torch.argmax(outputs.end_logits)
...   answer=context[offsets[start][0]:offsets[end][-1]]
...   return answer if answer!=tokenizer.mask_token else question
...
>>> print(head("世界中","世界中が刮目している"))
刮目し
>>> print(head("が","世界中が刮目している"))
世界中
>>> print(head("刮目し","世界中が刮目している"))
刮目し
>>> print(head("ている","世界中が刮目している"))
刮目し

なかなかイイ線だ。ただ、単純なtorch.argmaxでは語境界との矛盾が起こる可能性が高く、そのあたりtorch.topkによる確率処理を入れるべきだろう。また、同じ単語が複数あらわれるような文においては、今のところcontext中で[MASK]指定する手法を採用しているが、これの妥当性も考えなければならない。さて、どう進めて行こうかな。

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

ナニゲにアレゲなのは、ナニゲなアレゲ -- アレゲ研究家

読み込み中...