kaggleの雑記

pythonのtokenizersのByteLevelBPETokenizerを利用してみた

tokenizersとは

https://github.com/huggingface/tokenizers

主に文章の形態素解析や分割(字句解析)を行うことができるライブラリです。

今回はその中のByteLevelBPETokenizerを利用してみます。

使い方

ROBERTA_PATH = "../"
tokenizer = tokenizers.ByteLevelBPETokenizer(
    vocab_file=f"{ROBERTA_PATH}/vocab.json", 
    merges_file=f"{ROBERTA_PATH}/merges.txt", 
)

encoded = tokenizer.encode("I can feel the magic, can you?").ids
print(encoded)
decoded = tokenizer.decode(encoded)
print(decoded)

# [939, 64, 619, 5, 8375, 6, 64, 47, 116]
# i can feel the magic, can you?

ByteLevelBPETokenizerでは訓練済みモデルを呼び出しています。訓練済みのモデルは2つのファイルとして保存されていて、vocab.jsonとmerges.txtです。

訓練済みモデルの保存方法は以下の「モデルの保存」を参照してください

transformersのRobertaTokenizerを試してみたRobertaTokenizerとは https://huggingface.co/transformers/model_doc/ro...

また、encodeメソッドの返り値にはoffsetsという属性もあり、これはどの文字を字句としたのか理解できます。

encoded = tokenizer.encode("I can feel the magic, can you?").offsets
print(encoded)
# [(0, 2), (2, 6), (6, 11), (11, 15), (15, 21), (21, 22), (22, 26), (26, 30), (30, 31)]

kaggleの話

この手法はTweet Sentiment Extractionというコンペで広く利用されていました。理由を調べてみると

from transformers import RobertaTokenizer
tokenizer = RobertaTokenizer.from_pretrained('roberta-base')

とRobertaTokenizerをkaggleのkernelでそのまま利用しようとすると、OSErrorが発生しました。

OSError: Model name 'roberta-base' was not found in tokenizers model name list (roberta-base, roberta-large, roberta-large-mnli, distilroberta-base, roberta-base-openai-detector, roberta-large-openai-detector). We assumed 'roberta-base' was a path, a model identifier, or url to a directory containing vocabulary files named ['vocab.json', 'merges.txt'] but couldn't find such vocabulary files at this path or url.

きっとインストールすることもできるのかもしれませんがそれは定かではありません。

確実に利用するために参加者は、RoBERTaのモデルを一度ファイルに保存し、それをtokenizersで呼び出すような使い方をしたのでしょう。

 

また本記事は以下のnotebookを参考にしています。

https://www.kaggle.com/cdeotte/tensorflow-roberta-0-705

ABOUT ME
hirayuki
今年で社会人3年目になります。 日々体当たりで仕事を覚えています。 テーマはIT・教育です。 少しでも技術に親しんでもらえるよう、noteで4コマ漫画も書いています。 https://note.mu/hirayuki