0
0

suzume-llama-3-8B-japaneseでのFew-Shot Promptingによる日本語品詞付与

Posted at

suzume-llama-3-8B-japaneseは、Meta-Llama-3-8Bを日本語に拡張したモデルらしいのだが、拡張に際してトークナイザの日本語化をおこなっていない。これがどういう問題を引き起こすか、国語研短単位でのUPOS (Universal Part-Of-Speech)品詞付与をFew-Shot Promptingで挑戦してみよう。5つの例文は、この記事と全く同じものを選んだ。

>>> 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","lightblue/suzume-llama-3-8B-japanese",max_new_tokens=128)
>>> print("\n".join(tgn(str(ex)+"###text:国境の長いトンネルを抜けると雪国であった。\n###UPOS:")[0]["generated_text"].split("\n")[len(ex)*2:len(ex)*2+2]))
###text:国境の長いトンネルを抜けると雪国であった。
###UPOS:国境的_NOUN|の_ADP|長い_NUM|トンネル_NOUN|を_ADP|抜けると_ADP|雪国_NOUN|であった_AUX|。_PUNCT

『雪国』の冒頭文に品詞付与させてみたところ、私(安岡孝一)の手元では、suzume-llama-3-8Bは「国境_NOUN|の_ADP|長い_ADJ|トンネル_NOUN」にいきなり「的」を挿入してしまって、その後は「抜ける_VERB|と_ADP|雪国_NOUN|で_AUX|あっ_AUX|た_AUX」が全くトークナイズできてない。もう一度やってみよう。

>>> print("\n".join(tgn(str(ex)+"###text:国境の長いトンネルを抜けると雪国であった。\n###UPOS:")[0]["generated_text"].split("\n")
###text:国境の長いトンネルを抜けると雪国であった。
###UPOS:国境の_NOUN|長い_ADJ_NOUN|トンネル_NOUN|を_ADP|抜けると_VERB|、_PUNCT|雪_NOUN|国_NOUN|であった_ADJ|。_PUNCT

今度は「国境_NOUN|の_ADP」が1語にくっついてしまい、結果として「長い」の品詞が崩壊している。しかも「、_PUNCT」が勝手に挿入されている。もう一度やってみよう。

>>> print("\n".join(tgn(str(ex)+"###text:国境の長いトンネルを抜けると雪国であった。\n###UPOS:")[0]["generated_text"].split("\n")
###text:国境の長いトンネルを抜けると雪国であった。
###UPOS:国境_NOUN|の_ADJ|長い_ADJ|トンネル_NOUN|を_ADP|抜け_VERB|ると_CONJ|雪_NOUN|国の_ADP|ありた_AUX|た_AUX|。_PUNCT

どんどん悪化しているように見える。4月20日の記事にも書いたとおり、現時点のLLaMA-3は日本語対応が未熟で、まずはトークナイザを改良しなければいけない、ということだ。 さて、どうすればいいかな。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0