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

yasuokaの日記: ku-nlp/deberta-v2-base-japaneseのトークナイザをBertJapaneseTokenizerに置き換える

日記 by yasuoka

1月5日の日記で紹介したku-nlp/deberta-v2-base-japaneseのトークナイザを、BertJapaneseTokenizerのjumanppで置き換えてみた。ただし、内部で使用しているpyknpがrhoknpに変更予定なこともあって、かなり汚い手法になってしまった。Google Colaboratoryだと、こんな感じ。

!test -d jumanpp-2.0.0-rc3 || curl -L https://github.com/ku-nlp/jumanpp/releases/download/v2.0.0-rc3/jumanpp-2.0.0-rc3.tar.xz | tar xJf -
!test -x /usr/local/bin/jumanpp || ( mkdir jumanpp-2.0.0-rc3/build && cd jumanpp-2.0.0-rc3/build && cmake .. -DCMAKE_BUILD_TYPE=Release && make install )
!pip install 'transformers>=4.24.0' sentencepiece pyknp rhoknp
from transformers import BertJapaneseTokenizer,AutoModelForMaskedLM,FillMaskPipeline
from transformers.utils import cached_file
tkz=BertJapaneseTokenizer(vocab_file=None,spm_file=cached_file("ku-nlp/deberta-v2-base-japanese","spm.model"),word_tokenizer_type="jumanpp",subword_tokenizer_type="sentencepiece")
tkz._tokenize=lambda text:[sub_token.replace("〓",tkz.mask_token) for token in tkz.word_tokenizer.tokenize(text.replace(tkz.mask_token,"\u2581"),never_split=tkz.all_special_tokens) for sub_token in tkz.subword_tokenizer.tokenize(("\u2581"+token).replace("\u2581\u2581","〓"))]
mdl=AutoModelForMaskedLM.from_pretrained("ku-nlp/deberta-v2-base-japanese")
fmp=FillMaskPipeline(model=mdl,tokenizer=tkz)
print(fmp("夜の底が[MASK]なった。"))

端的には、各単語の先頭にSPIECE_UNDERLINEを付加しつつ、[MASK]がJuman++SentencePieceでバラされる問題をゲタで回避している。このトークナイザを使いつつ「夜の底が[MASK]なった。」の[MASK]を穴埋めさせてみたところ、私(安岡孝一)の手元では以下の結果になった。

[{'score': 0.29466712474823, 'token': 4130, 'token_str': '深く', 'sequence': '夜 の 底 が 深く なった 。'}, {'score': 0.10997577756643295, 'token': 19502, 'token_str': '暗く', 'sequence': '夜 の 底 が 暗く なった 。'}, {'score': 0.10800448060035706, 'token': 17340, 'token_str': '熱く', 'sequence': '夜 の 底 が 熱く なった 。'}, {'score': 0.07135284692049026, 'token': 27473, 'token_str': '浅く', 'sequence': '夜 の 底 が 浅く なった 。'}, {'score': 0.06170506030321121, 'token': 27949, 'token_str': '冷たく', 'sequence': '夜 の 底 が 冷たく なった 。'}]

「深く」「暗く」「熱く」「浅く」「冷たく」となっており、scoreも含め、1月5日の結果とほぼ同等である。このあたりのSPIECE_UNDERLINEやnever_splitに関する問題を、rhoknpが吸収してくれるとうれしいのだけど、さて、どういうオプションを付けてもらったらいいかしら。

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

※ただしPHPを除く -- あるAdmin

読み込み中...