見出し画像

Simple Transformersでの日本語テキストのトークン化

「Simple Transformers」で日本語テキストをトークン化するとどうなるか、確認してみます。

1. bert-base-casedのトークン化

標準的なBERTモデル「bert-base-cased」で、日本語テキストのトークン化を行います。

from simpletransformers.classification import MultiLabelClassificationModel

# モデル「bert-base-cased」の生成
model = MultiLabelClassificationModel('bert', 'bert-base-cased')

# 日本語テキストのトークン化
text = '吾輩は猫である。名前はまだ無い。どこで生れたかとんと 見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。'
input_ids = model.tokenizer.encode(text, return_tensors='pt')
print('tokens:', model.tokenizer.convert_ids_to_tokens(input_ids[0].tolist()))
print('decode:', model.tokenizer.decode(input_ids[0].tolist()))
tokens: ['[CLS]', '[UNK]', '[UNK]', 'は', '[UNK]', '[UNK]', '。', '[UNK]', '[UNK]', '[UNK]', '[UNK]', 'い', '。', '[UNK]', '生', 'れ', '##た', '##か', '##と', '##ん', '##と', '[UNK]', '[UNK]', '[UNK]', '。', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', '[UNK]', 'い', '##て', '##い', '##た', '事', '[UNK]', '[UNK]', '[UNK]', 'し', '##て', '##い', '##る', '。', '[UNK]', '[UNK]', '[UNK]', '[UNK]', 'め', '##て', '人', '[UNK]', '[UNK]', '[UNK]', 'た', '。', '[SEP]']
decode: [CLS] [UNK] [UNK] は [UNK] [UNK] 。 [UNK] [UNK] [UNK] [UNK] い 。 [UNK] 生 れたかとんと [UNK] [UNK] [UNK] 。 [UNK] [UNK] [UNK] [UNK] [UNK] [UNK] [UNK] [UNK] いていた 事 [UNK] [UNK] [UNK] している 。 [UNK] [UNK] [UNK] [UNK] めて 人 [UNK] [UNK] [UNK] た 。 [SEP]

トークナイザーは「WordPiece」ベースが提供されています。トークンの多くが[UNK](Unknown : 不明)になってしまっています。WordPieceベースで、語彙を英語データセットで学習してるため、日本語の語彙はほとんどないようです。

2.  bert-base-japanese-whole-word-maskingのトークン化

日本語データセットで学習したBERTモデル「bert-base-japanese-whole-word-masking」で、日本語テキストのトークン化を行います。

from simpletransformers.classification import MultiLabelClassificationModel

# モデル「bert-base-japanese-whole-word-masking」の生成
model = MultiLabelClassificationModel('bert', 'cl-tohoku/bert-base-japanese-whole-word-masking')

# 日本語テキストのトークン化
text = '吾輩は猫である。名前はまだ無い。どこで生れたかとんと 見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。'
input_ids = model.tokenizer.encode(text, return_tensors='pt')
print('tokens:', model.tokenizer.convert_ids_to_tokens(input_ids[0].tolist()))
print('decode:', model.tokenizer.decode(input_ids[0].tolist()))
tokens: ['[CLS]', '吾', '輩', 'は', '猫', 'で', '##ある', '。', '名', '前', 'はま', '##だ', '無', 'い', '。', 'どこ', '##で', '生', 'れ', '##たか', '##と', '##んと', '見', '当', 'が', '##つか', '##ぬ', '。', '何', 'でも', '薄', '暗', 'いじめ', '##じめ', '##した', '所', 'で', '##ニャ', '##ーニャ', '##ー', '泣', 'い', '##てい', '##た', '事', 'だけ', '##は', '記', '憶', 'し', '##てい', '##る', '。', '吾', '輩', 'は', '##こ', '##こ', '##で', '始', 'め', '##て', '人', '間', 'という', '##もの', '##を', '見', 'た', '。', '[SEP]']
decode: [CLS] 吾 輩 は 猫 である 。 名 前 はまだ 無 い 。 どこで 生 れたかとんと 見 当 がつかぬ 。 何 でも 薄 暗 いじめじめした 所 でニャーニャー 泣 いていた 事 だけは 記 憶 している 。 吾 輩 はここで 始 めて 人 間 というものを 見 た 。 [SEP]

トークナイザーは「MeCab + WordPiece」ベースと「Character」ベースが提供されています。分割はこれで良いか不安ですが、日本語の語彙は表現できているようです。

3. gtp2のトークン化

GPT-2モデル「gpt2」で、日本語テキストのトークン化を行います。

from simpletransformers.language_modeling import LanguageModelingModel

# モデル「gtp2」の作成
model = LanguageModelingModel('gpt2', 'gpt2', 
    {"reprocess_input_data": True, "overwrite_output_dir": True})

# 日本語テキストのトークン化
text = '吾輩は猫である。名前はまだ無い。どこで生れたかとんと 見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。'
input_ids = model.tokenizer.encode(text, return_tensors='pt')
print('tokens:', model.tokenizer.convert_ids_to_tokens(input_ids[0].tolist()))
print('decode:', model.tokenizer.decode(input_ids[0].tolist()))
tokens: ['åIJ', '¾', 'è', '¼', '©', 'ãģ¯', 'ç', 'Į', '«', 'ãģ§', 'ãģĤ', 'ãĤĭ', 'ãĢĤ', 'åIJ', 'į', 'åī', 'į', 'ãģ¯', 'ãģ¾', 'ãģł', 'çĦ', '¡', 'ãģĦ', 'ãĢĤ', 'ãģ', '©', 'ãģĵ', 'ãģ§', 'çĶŁ', 'ãĤĮ', 'ãģŁ', 'ãģĭ', 'ãģ¨', 'ãĤĵ', 'ãģ¨', 'Ġè', '¦', 'ĭ', 'å½', 'ĵ', 'ãģĮ', 'ãģ', '¤', 'ãģĭ', 'ãģ', '¬', 'ãĢĤ', 'ä½', 'ķ', 'ãģ§', 'ãĤĤ', 'è', 'ĸ', 'Ħ', 'æ', 'ļ', 'Ĺ', 'ãģĦ', 'ãģ', 'ĺ', 'ãĤ', 'ģ', 'ãģ', 'ĺ', 'ãĤ', 'ģ', 'ãģĹ', 'ãģŁ', 'æī', 'Ģ', 'ãģ§', 'ãĥĭ', 'ãĥ£', 'ãĥ¼ãĥ', 'ĭ', 'ãĥ£', 'ãĥ¼', 'æ³', '£', 'ãģĦ', 'ãģ¦', 'ãģĦ', 'ãģŁ', 'äº', 'ĭ', 'ãģł', 'ãģ', 'ij', 'ãģ¯', 'è', '¨', 'ĺ', 'æ', 'Ĩ', '¶', 'ãģĹ', 'ãģ¦', 'ãģĦ', 'ãĤĭ', 'ãĢĤ', 'åIJ', '¾', 'è', '¼', '©', 'ãģ¯', 'ãģĵ', 'ãģĵ', 'ãģ§', 'å§', 'ĭ', 'ãĤ', 'ģ', 'ãģ¦', '人', 'éĸ', 'ĵ', 'ãģ¨', 'ãģĦ', 'ãģĨ', 'ãĤĤ', 'ãģ®', 'ãĤĴ', 'è¦', 'ĭ', 'ãģŁ', 'ãĢĤ']
decode: 吾輩は猫である。名前はまだ無い。どこで生れたかとんと 見当がつかぬ。何でも薄暗いじめじめした所でニャーニャー泣いていた事だけは記憶している。吾輩はここで始めて人間というものを見た。

HuggingfaceのGPT2Tokenizerは「byte-level Byte-Pair Encoding」ベースが提供されています。分割はこれで良いか不安ですが、日本語の語彙は表現できているようです。

4. 日本語のトークン化と事前学習済みモデル

「BERT」「GPT-2」で日本語を扱う際、日本語はスペースで単語が別れてないため、トークン化をどのように行えば良いかという問題があります。多言語対応のトークナイザーもありますが、ほぼ文字単位になってしまうため、あまり良くないと言われています。

日本語対応の「事前学習済みモデル」の多くは、形態素解析にかけてから各種前処理が行われています。

cl-tohoku/bert-japanese

・日本語Wikipedia
・MeCab, SentencePiece

◎ tanreinama/gpt2-japanese

コーパス2020
Japanese-BPEEncoder

◎ BERT日本語Pretrainedモデル - KUROHASHI-CHU-MURAWAKI LAB

・日本語Wikipedia
・JUMAN++, BPE

大規模日本語ビジネスニュースコーパスを学習したBERT事前学習済(MeCab利用)モデル

・日本語ビジネスニュースコーパス
・MeCab

◎ yoheikikuta/bert-japanese

・日本語Wikipedia
・SentencePiece

4. 参考



この記事が気に入ったらサポートをしてみませんか?