yasuokaの日記: roberta-base-thai-syllable-uposによるタイ語の係り受け解析
9月11日と一昨日の日記の手法を合わせた上に、SuParの助けを借りて、タイ語の係り受け解析モデルを試作してみた。Google Colaboratoryで動かしてみよう。
!pip install transformers'>='4.7.0 supar'>='1.1.1 deplacy'>='2.0.1
from transformers import AutoModelForTokenClassification,AutoTokenizer,TokenClassificationPipeline
from transformers.file_utils import cached_path,hf_bucket_url
from supar import Parser
brt="KoichiYasuoka/roberta-base-thai-syllable-upos"
mdl=AutoModelForTokenClassification.from_pretrained(brt)
tkz=AutoTokenizer.from_pretrained(brt)
pos=TokenClassificationPipeline(model=mdl,tokenizer=tkz,aggregation_strategy="simple")
prs=Parser.load(cached_path(hf_bucket_url(brt,"supar.model")))
def nlp(s):
d=pos(s)
e=prs.predict([[t["word"] for t in d]])
e.sentences[0].values[3]=tuple([t["entity_group"] for t in d])
e.sentences[0].values[9]=tuple(["SpaceAfter=No" if t["end"]==u["start"] else "_" for t,u in zip(d,d[1:])]+["_"])
return e
doc=nlp("หลายหัวดีกว่าหัวเดียว")
import deplacy
deplacy.render(doc,WordRight=True)
deplacy.serve(doc,port=None)
「หลายหัวดีกว่าหัวเดียว」を係り受け解析してみたところ、私(安岡孝一)の手元では以下の結果になった。
det ╔> DET หลาย
advmod ╔════>╚═ NOUN หัว
root ╚═╔═════ ADJ ดี
case ║ ╔══> ADP กว่า
obl ╚>╚═╔═ NOUN หัว
amod ╚> ADJ เดียว
1 หลาย _ DET _ _ 2 det _ SpaceAfter=No
2 หัว _ NOUN _ _ 3 advmod _ SpaceAfter=No
3 ดี _ ADJ _ _ 0 root _ SpaceAfter=No
4 กว่า _ ADP _ _ 5 case _ SpaceAfter=No
5 หัว _ NOUN _ _ 3 obl _ SpaceAfter=No
6 เดียว _ ADJ _ _ 5 amod _ _
SVGで可視化すると、こんな感じ。「หัว」⇐advmod=「ดี」を除いて、まずまずの解析結果だ。ただ、このままだと、ちょっと使いにくいので、さて、どういう形でパッケージ化したらいいかな。
roberta-base-thai-syllable-uposによるタイ語の係り受け解析 More ログイン