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

yasuokaの日記: 日本語BERT/RoBERTa/ALBERTモデルのトークナイザ比較

日記 by yasuoka

昨日の日記を読み返しつつ、日本語BERT/RoBERTa/ALBERTモデルのトークナイザが現状どうなっているのか、「国境の長いトンネルを抜けると雪国であった。」と「夜の底が白くなった。」で比べてみることにした。まずはKoichiYasuoka/roberta-base-japanese-aozoraで、トークナイザはJapanese-LUW-Tokenizer

$ pip3 install -U transformers fugashi unidic_lite ipadic sentencepiece
$ python3
>>> from transformers import AutoTokenizer
>>> tokenizer=AutoTokenizer.from_pretrained("KoichiYasuoka/roberta-base-japanese-aozora")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '国境', 'の', '長い', 'トンネル', 'を', '抜け', 'る', 'と', '雪国', 'であっ', 'た', '。', '[SEP]', '夜', 'の', '底', 'が', '白く', 'な', 'っ', 'た', '。', '[SEP]']

次にcl-tohoku/bert-base-japaneseで、トークナイザはfugashi+ipadic。

>>> tokenizer=AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '##国', 'で', 'あっ', 'た', '。', '[SEP]', '夜', 'の', '底', 'が', '白く', 'なっ', 'た', '。', '[SEP]']

続けてcl-tohoku/bert-base-japanese-v2で、トークナイザはfugashi+unidic_lite。

>>> tokenizer=AutoTokenizer.from_pretrained("cl-tohoku/bert-base-japanese-v2")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '##国', 'で', 'あっ', 'た', '。', '[SEP]', '夜', 'の', '底', 'が', '白く', 'なっ', 'た', '。', '[SEP]']

続けてcolorfulscoop/bert-base-jaで、トークナイザはSentencePiece

>>> tokenizer=AutoTokenizer.from_pretrained("colorfulscoop/bert-base-ja")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '国', 'であった', '。', '[SEP]', '夜の', '底', 'が', '白', 'くなった', '。', '[SEP]']

続けてALINEAR/albert-japanese-v2で、トークナイザはSentencePiece。

>>> tokenizer=AutoTokenizer.from_pretrained("ALINEAR/albert-japanese-v2")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '_', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '国', 'であった', '。', '[SEP]', '_', '夜の', '底', 'が', '白', 'くなった', '。', '[SEP]']

続けてken11/albert-base-japanese-v1で、トークナイザはSentencePiece。

>>> tokenizer=AutoTokenizer.from_pretrained("ken11/albert-base-japanese-v1")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '_', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '国', 'であった', '。', '[SEP]', '_', '夜の', '底', 'が', '白', 'くなった', '。', '[SEP]']

続けてrinna/japanese-roberta-baseで、トークナイザはSentencePiece。

>>> tokenizer=AutoTokenizer.from_pretrained("rinna/japanese-roberta-base")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['_', '国境', 'の', '長い', 'トンネル', 'を', '抜ける', 'と', '雪', '国', 'であった', '。', '</s>', '_', '夜の', '底', 'が', '白', 'くなった', '。', '</s>']

最後にGeotrend/bert-base-ja-casedで、トークナイザはBertTokenizerFast

>>> tokenizer=AutoTokenizer.from_pretrained("Geotrend/bert-base-ja-cased")
>>> tokenizer.convert_ids_to_tokens(tokenizer("国境の長いトンネルを抜けると雪国であった。","夜の底が白くなった。")["input_ids"])
['[CLS]', '国', '境', 'の', '長', 'い', '##トン', '##ネル', '##を', '抜', 'ける', '##と', '雪', '国', 'であった', '。', '[SEP]', '夜', 'の', '底', 'が', '白', 'くなった', '。', '[SEP]']

品詞付与や係り受け解析の立場からすると、「くなった」が1語になってしまうようなトークナイザは、扱いに困る。一方で、fugashi(というかBertJapaneseTokenizer)をトークナイザに使うと、オプションにreturn_offsets_mapping=Trueが効かないため、11月26日の日記で書いたような手法が適用できない。うーん、国語研短単位をサポートするようなPreTrainedTokenizerFastを、何とかデッチ上げるしかないかな。

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

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

読み込み中...