タイ語係り受け解析モデルLlama-3.2-1B-thai-ud-causalリリース

「[Llama-3.2-1B](https://huggingface.co/meta-llama/Llama-3.2-1B)」が英語・ドイツ語・フランス語・イタリア語・ポルトガル語・ヒンディー語・スペイン語・タイ語をサポートしているというので、タイ語係り受け解析モデル「[Llama-3.2-1B-thai-ud-causal](https://huggingface.co/KoichiYasuoka/Llama-3.2-1B-thai-ud-causal)」を試作してみた。Google Colaboratoryで動かしてみよう。

```
!pip install transformers deplacy
from transformers import pipeline
nlp=pipeline("universal-dependencies","KoichiYasuoka/Llama-3.2-1B-thai-ud-causal",trust_remote_code=True)
doc=nlp("แม่อย่าเก็บไว้คนเดียว")
import deplacy
deplacy.serve(doc,port=None)
```

「[แม่อย่าเก็บไว้คนเดียว](https://qiita.com/KoichiYasuoka/items/851bbe0299f43c7eb4e9)」を係り受け解析してみたところ、私(安岡孝一)の手元では、以下の結果が出力された。

```
# text = แม่อย่าเก็บไว้คนเดียว
1	แม่	_	NOUN	_	_	3	nsubj	_	SpaceAfter=No
2	อย่า	_	AUX	_	_	3	aux	_	SpaceAfter=No
3	เก็บ	_	VERB	_	_	0	root	_	SpaceAfter=No
4	ไว้	_	ADV	_	_	3	advmod	_	SpaceAfter=No
5	คน	_	NOUN	_	_	3	obl	_	SpaceAfter=No
6	เดียว	_	NUM	_	_	5	nummod	_	SpaceAfter=No
```

![thai.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428317/61f35157-ecde-21fb-9666-cafdecb717ed.png)

惜しい。「แม่」へのリンクはnsubj(主語)ではなく、vocative(呼称語)が正しい。それ以外は、正しく解析されているようだ。ただし「Llama-3.2-1B」のトークナイザは、タイ文字クラスター(คลัสเตอร์อักษรไทย)すら無視していたので、「Llama-3.2-1B-thai-ud-causal」ではトークナイザの入れ替えをおこなった。トークナイザの入れ替えをおこなった場合とおこなわなかった場合について、[9月12日の記事](https://qiita.com/KoichiYasuoka/items/80f8bdc300274805b638)の手法で、係り受け解析の「精度」を較べてみよう。Google Colaboratory (GPU版)だと、こんな感じ。

```
!pip install transformers
mdl="KoichiYasuoka/Llama-3.2-1B-thai-ud-causal"
import os,sys,subprocess
from transformers import pipeline
url="https://github.com/nlp-chula/TUD"
f=os.path.join(os.path.basename(url),"TUD","test.conllu")
os.system(f"test -f {f} || git clone --depth=1 {url}")
url="https://universaldependencies.org/conll18/conll18_ud_eval.py"
c=os.path.basename(url)
os.system(f"test -f {c} || curl -LO {url}")
with open(f,"r",encoding="utf-8") as r:
  s=r.read()
nlp=pipeline("universal-dependencies",mdl,trust_remote_code=True,device=0)
for tkz in ["refined tokenizer","original tokenizer"]:
  with open("result.conllu","w",encoding="utf-8") as w:
    for t in s.split("\n"):
      if t.startswith("# text = "):
        w.write(nlp(t[9:]))
  p=subprocess.run([sys.executable,c,"-v",f,"result.conllu"],encoding="utf-8",stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
  print(f"\n*** {mdl} ({tkz})",p.stdout,sep="\n",flush=True)
  nlp.tokenizer=nlp.oldtokenizer
```

私の手元では、以下の結果が出力された。

```
*** KoichiYasuoka/Llama-3.2-1B-thai-ud-causal (refined tokenizer)
Metric     | Precision |    Recall |  F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens     |     88.79 |     90.21 |     89.50 |
Sentences  |    100.00 |    100.00 |    100.00 |
Words      |     88.79 |     90.21 |     89.50 |
UPOS       |     77.80 |     79.04 |     78.42 |     87.62
XPOS       |     88.79 |     90.21 |     89.50 |    100.00
UFeats     |     87.60 |     89.00 |     88.29 |     98.66
AllTags    |     76.98 |     78.21 |     77.59 |     86.70
Lemmas     |     88.79 |     90.21 |     89.50 |    100.00
UAS        |     65.72 |     66.77 |     66.24 |     74.02
LAS        |     56.75 |     57.66 |     57.20 |     63.92
CLAS       |     53.96 |     54.14 |     54.05 |     61.35
MLAS       |     46.68 |     46.84 |     46.76 |     53.08
BLEX       |     53.96 |     54.14 |     54.05 |     61.35


*** KoichiYasuoka/Llama-3.2-1B-thai-ud-causal (original tokenizer)
Metric     | Precision |    Recall |  F1 Score | AligndAcc
-----------+-----------+-----------+-----------+-----------
Tokens     |     46.20 |     52.38 |     49.09 |
Sentences  |    100.00 |    100.00 |    100.00 |
Words      |     46.20 |     52.38 |     49.09 |
UPOS       |     39.70 |     45.01 |     42.19 |     85.93
XPOS       |     46.20 |     52.38 |     49.09 |    100.00
UFeats     |     45.45 |     51.53 |     48.30 |     98.38
AllTags    |     39.24 |     44.49 |     41.70 |     84.94
Lemmas     |     46.20 |     52.38 |     49.09 |    100.00
UAS        |     22.61 |     25.63 |     24.02 |     48.93
LAS        |     19.28 |     21.85 |     20.48 |     41.72
CLAS       |     16.87 |     19.80 |     18.22 |     39.72
MLAS       |     13.99 |     16.42 |     15.11 |     32.94
BLEX       |     16.87 |     19.80 |     18.22 |     39.72
```

トークナイザの入れ替えをおこなった場合のLAS/MLAS/BLEXが57.20/46.76/54.05、おこなわなかった場合が20.48/15.11/18.22で、差は歴然としている。ただ、それならば、最初からちゃんとしたトークナイザでLLaMAモデルを作ってほしいのだけど、やっぱり自分で作るしかないのかなあ。