日本語生成AIでのFew-Shot Promptingによる品詞付与

[生成AIに関する記事を書こう！](https://qiita.com/official-events/12da67d1f5723af75e60)というイベントが面白そうだったので、とりあえず、国語研短単位でのUPOS (Universal Part-Of-Speech)品詞付与をFew-Shot Promptingでやってみた結果を、まとめておくことにした。プログラムは、こんな感じ。

```
#! /usr/bin/python3
model="tokyotech-llm/Swallow-MS-7b-v0.1"
class TextUPOSList(list):
  __str__=lambda self:"\n".join("###text:"+"".join(t for t,u in s)+"\n###UPOS:"+"|".join(t+"_"+u for t,u in s) for s in self)+"\n"
ex=TextUPOSList()
ex.append([("一","NUM"),("直線","NOUN"),("に","ADP"),("伸びる","VERB"),("電撃","NOUN"),("を","ADP"),("放ち","VERB"),("、","PUNCT"),("電撃","NOUN"),("ダメージ","NOUN"),("を","ADP"),("与える","VERB"),("。","PUNCT")])
ex.append([("色々","ADV"),("と","ADP"),("面白い","ADJ"),("メニュー","NOUN"),("の","ADP"),("ある","VERB"),("店","NOUN"),("。","PUNCT")])
ex.append([("しかも","CCONJ"),("、","PUNCT"),("ここ","PRON"),("は","ADP"),("コース","NOUN"),("が","ADP"),("リーズナブル","ADJ"),("な","AUX"),("の","SCONJ"),("です","AUX"),("。","PUNCT")])
ex.append([("彼","PRON"),("は","ADP"),("コンピュータ","NOUN"),("を","ADP"),("個人","NOUN"),("の","ADP"),("持ち物","NOUN"),("に","ADP"),("し","VERB"),("まし","AUX"),("た","AUX"),("。","PUNCT")])
ex.append([("2007","NUM"),("年","NOUN"),("9","NUM"),("月","NOUN"),("現在","ADV"),("、","PUNCT"),("以下","NOUN"),("の","ADP"),("メーカー","NOUN"),("から","ADP"),("対応","NOUN"),("製品","NOUN"),("が","ADP"),("発売","VERB"),("さ","AUX"),("れ","AUX"),("て","SCONJ"),("いる","VERB"),("。","PUNCT")])
from transformers import pipeline
tgn=pipeline("text-generation",model,max_new_tokens=128)
nlp=lambda t:"\n".join(tgn(str(ex)+f"###text:{t}\n###UPOS:")[0]["generated_text"].split("\n")[len(ex)*2:len(ex)*2+2])
print(nlp("国境の長いトンネルを抜けると雪国であった。"))
```

2行目の`model`を変更しつつ、いくつかの日本語生成AIで品詞付与を試してみよう。

* [`model="tokyotech-llm/Swallow-MS-7b-v0.1"`](https://qiita.com/KoichiYasuoka/items/b604dbe94db2207d9aa1)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜ける_VERB|と_ADP|雪国_NOUN|で_ADP|あっ_VERB|た_AUX|。_PUNCT
* [`model="Fugaku-LLM/Fugaku-LLM-13B"`](https://qiita.com/KoichiYasuoka/items/be84c2049963d5847745)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_NOUN|トンネル_NOUN|を_ADP|抜ける_VERB|と_ADP|雪国_NOUN|で_ADP|あった_VERB|。_PUNCT
* [`model="lightblue/karasu-7B"`](https://huggingface.co/lightblue/karasu-7B)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜ける_VERB|と_PUNCT|雪国_NOUN|で_AUX|あ_AUX|った_AUX|。_PUNCT
* [`model="stabilityai/japanese-stablelm-base-gamma-7b"`](https://huggingface.co/stabilityai/japanese-stablelm-base-gamma-7b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜ける_VERB|と_CCONJ|雪国_NOUN|であった_AUX|。_PUNCT
* [`model="rinna/youri-7b"`](https://huggingface.co/rinna/youri-7b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜ける_VERB|と_PUNCT|雪国_NOUN|であった_ADJ|。_PUNCT
* [`model="elyza/ELYZA-japanese-Llama-2-13b"`](https://huggingface.co/elyza/ELYZA-japanese-Llama-2-13b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜けると_ADP|雪国_NOUN|であった_AUX|。_PUNCT
* [`model="cyberagent/calm2-7b"`](https://huggingface.co/cyberagent/calm2-7b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_ADV|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜けると_ADP|雪国_NOUN|で_ADP|あった_VERB|。_PUNCT
* [`model="Rakuten/RakutenAI-7B"`](https://qiita.com/KoichiYasuoka/items/36eaef9f0b60ea6f5758)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜け_VERB|ると_ADP|雪国_NOUN|であった_AUX|。_PUNCT
* [`model="llm-jp/llm-jp-13b-v2.0"`](https://huggingface.co/llm-jp/llm-jp-13b-v2.0)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_NOUN|長い_NOUN|トンネル_NOUN|を_NOUN|抜け_VERB|る_VERB|と_PUNCT|雪国_NOUN|で_NOUN|あっ_AUX|た_AUX|。_PUNCT
* [`model="stockmark/stockmark-13b"`](https://huggingface.co/stockmark/stockmark-13b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_NOUN|トンネル_NOUN|を_ADP|抜けると_NOUN|雪国_NOUN|で_NOUN|あっ_NOUN|た_NOUN|。_PUNCT

これらの結果を見る限り、品詞付与の精度は、トークナイザの精度に強く依存しているように思える。ただし、以下のモデルは、そもそもFew-Shot Promptingがうまくいってないので、他の要因も関係しているのだろう。

* [`model="rinna/llama-3-youko-8b"`](https://qiita.com/KoichiYasuoka/items/00182cf23d780397fb9a)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN|を_ADP|抜け_VERB|ると_SCONJ|雪国_NOUN|であ_AUX|た_AUX|。_PUNCT
* [`model="lightblue/suzume-llama-3-8B-japanese"`](https://huggingface.co/lightblue/suzume-llama-3-8B-japanese)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境_NOUN|の_PSP|長い_ADJ|トンネル_NOUN|を_ADP|抜ける_VERB|と   AUX|雪_VN|国_NOUN|であった_AUX|。_PUNCT
* [`model="cyberagent/open-calm-7b"`](https://huggingface.co/cyberagent/open-calm-7b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境の長いトンネル_NUM|、_PUNCT|雪国_NUM|の_ADP|長い_NUM|トンネル_NUM|を抜けると_ADP|雪国_NUM|の_ADP|あった_NUM|。_PUNCT
* [`model="line-corporation/japanese-large-lm-3.6b"`](https://huggingface.co/line-corporation/japanese-large-lm-3.6b)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:国境の長いトンネルを_ADP|抜けると_ADP|、_PUNCT|雪国_NOUN|であった_ADP|。_PUNCT###text:このトンネルは、全長何キロあるでしょうか?_ADP###UPOS:この_ADP|トンネルは、_ADP|全長_NOUN|何キロ_NOUN|ある_ADP|でしょうか?_ADP###text:このトンネルは、全長何キロあるでしょうか?_ADP###UPOS:この_ADP|トンネルは、_ADP|全長_NO
* [`model="ku-nlp/gpt2-large-japanese-char"`](https://huggingface.co/ku-nlp/gpt2-large-japanese-char)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:2007_NUM|年_NOUN|9_NUM|月_NOUN|現在_ADV|、_PUNCT|以下_NOUN|の_ADP|メーカー_NOUN|から_ADP|対応_NOUN|製品_NOUN|が_ADP|発売_VERB|さ_AUX|れ_AUX|て_SCONJ|いる\_
* [`model="nlp-waseda/gpt2-xl-japanese"`](https://huggingface.co/nlp-waseda/gpt2-xl-japanese)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS: 2007 _ NU M | 年 _ NO UN | 9 _ NU M | 月 _ NO UN | が _ AD P | の _ AD P | を _ AD P | する _ AD P | を _ AD P | する _ AD P | を _ AD P | する _ AD P | 。 _ AD P | 。 _ AD P | 。 _ AD P | 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。 。
* [`model="okazaki-lab/japanese-gpt2-medium-unidic"`](https://huggingface.co/okazaki-lab/japanese-gpt2-medium-unidic)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS: 2014 _ punct # # # text : 国境 線 _ の _ adp | は _ adp | が _ adp _ を _ adp _ を _ adp _ と _ accos _ を _ し 、 次 なる 壁 に 挑む 。 # # # # http : / / shinwa - gwan. com. com / # # # # dogs _ dvd _ dog?. jpg > に _ adp | に _ し _ し _ に _ し _ に _ つ _ から _ と _ つ _ が _ noun _ と _ し
* [`model="rinna/japanese-gpt2-medium"`](https://huggingface.co/rinna/japanese-gpt2-medium)
> ###text:国境の長いトンネルを抜けると雪国であった。
> ###UPOS:彼の_|国_|の_|から_|、度|の_|から_|る_|。_度 #:彼は_|を_|から_|る_|です_ |度。 ##:国の元締めに殺される。 ##:国の元締めに殺される。 ##:国の元締めに殺される。 #:国の元締めに殺される。 ##:国の元締めに殺される。 ##:国の元締め