コード補完ファーストフードチュートリアル(3)-分詞

5185 ワード

コード補完ファーストフードチュートリアル(3)-分詞
前回は,予備訓練モデルの入力と出力を紹介した.次に、入力テキストからtokenへの最初の変換について説明します.
分詞器のベースクラスはPreTrainedTokenizerです.
分詞器の作成
分詞器は予め訓練されたモデルにロードすることができ,これは最も簡単な方法である.前の2つのセクションで使用したように、
tokenizer = GPT2Tokenizer.from_pretrained('gpt2')

ローカルに保存されているモデルを読み込むことによっても作成できます.
tokenizer = GPT2Tokenizer.from_pretrained('./test/saved_model/')

さらに、ロードされたローカルファイル名を指定することもできます.
tokenizer = GPT2Tokenizer.from_pretrained('./test/saved_model/my_vocab.txt')

最後に、ロードと同時にtokenの特殊なパラメータを指定することもできます.たとえば、次のようにします.
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased', unk_token='')

分詞器の3つのコア操作:tokenize,encode,decode
分詞器のコア操作は3つしかありません:tokenize,encode,decode.tokenizeは分詞を担当し、encodeは分詞tokenをidに変換し、decodeはidをテキストに変換します.
まず、分詞の使い方を見てみましょう.
inputs = "let disposable_begin_buffer = vscode.commands.registerCommand('extension.littleemacs.beginningOfBuffer',
move.beginningOfBuffer);
let disposable_end_buffer = vscode.commands." tokens = tokenizer.tokenize(inputs) print(tokens)

印刷結果は次のとおりです.
['let', 'Ġdisposable', '_', 'begin', '_', 'buffer', 'Ġ=', 'Ġv', 'sc', 'ode', '.', 'comm', 'ands', '.', 'register', 'Command', "('", 'ext', 'ension', '.', 'little', 'em', 'acs', '.', 'begin', 'ning', 'Of', 'Buffer', "',", 'Ċ', 'move', '.', 'begin', 'ning', 'Of', 'Buffer', ');', 'Ċ', 'let', 'Ġdisposable', '_', 'end', '_', 'buffer', 'Ġ=', 'Ġv', 'sc', 'ode', '.', 'comm', 'ands', '.']

Encodeは実際にはtokenizeとconvert_tokens_to_idsの2つの操作の組み合わせは、以下に相当します.
self.convert_tokens_to_ids(self.tokenize(text))

すなわち,まず分詞し,tokensを語表中のidに変換する.
もう一つconvert_tokens_to_idsの例:
token_ids = tokenizer.convert_tokens_to_ids(tokens)
print(token_ids)

出力は次のとおりです.
[1616, 32445, 62, 27471, 62, 22252, 796, 410, 1416, 1098, 13, 9503, 1746, 13, 30238, 21575, 10786, 2302, 3004, 13, 31629, 368, 16436, 13, 27471, 768, 5189, 28632, 3256, 198, 21084, 13, 27471, 768, 5189, 28632, 1776, 198, 1616, 32445, 62, 437, 62, 22252, 796, 410, 1416, 1098, 13, 9503, 1746, 13]

同様にdecodeも2つの操作の組合せであり,それぞれconvert_である.ids_to_tokensとconvert_tokens_to_string.次のようになります.
self.convert_tokens_to_string(self.convert_ids_to_tokens(token_ids))

新規tokenの追加
モデルの既存と用語集が足りない場合は、新しいtokenを追加したいと思っています.もちろんできます.作り方は2つのステップに分かれています.最初のステップはadd_を通過します.tokens関数は新しいtokenを追加します.ステップ2 resize_を使用token_Embeddings関数は、モデルにワードテーブルサイズの更新を通知します.
例を見てみましょう
num_added_toks = tokenizer.add_tokens(['new_tok1', 'my_new-tok2'])
print('We have added', num_added_toks, 'tokens')
model.resize_token_embeddings(len(tokenizer))

通常のtokenに加えて、特殊なtokenを追加することもできます.これらの特殊なtokenの役割は、後で原理を述べるときにさらに紹介します.通常のtokenと唯一異なるのは、特殊なtokenの関数add_を追加することです.special_tokensは、どの特殊な項目を変更するかを指定するために辞書を提供する必要があります.ステップ2のresize_token_Embeddings関数は同じです.
例を見てみましょう
special_tokens_dict = {'cls_token': ''}
num_added_toks = tokenizer.add_special_tokens(special_tokens_dict)
print('We have added', num_added_toks, 'tokens')
model.resize_token_embeddings(len(tokenizer))
print(tokenizer.cls_token)

tokenの保存
新しいtokenを追加した後、追加した結果を永続的なストレージに保存する必要があります.これはsave_を通じてpretrained関数で実現します.保存後、from_pretrained関数がロードされます.
例:
tokenizer.save_pretrained("./save/")

保存すると、次のファイルが生成されます.
  • added_tokens.json:新しく追加されたtokenと対応するidを保存しました:
  • {"new_tok1": 50257, "my_new-tok2": 50258, "": 50259}
    
  • special_tokens_map.json:特殊tokenリスト
  • が保存されています.
    {"bos_token": "", "eos_token": "", "unk_token": "", "cls_token": ""}
    
  • tokenizer_config.json:いくつかの分詞器の構成情報
  • が保存されている.
    {"max_len": 1024, "init_inputs": []}
    
  • vocab.json:これは本物のワードテーブルで、すべてのtokenと対応するid値
  • が保存されています.
    {"!": 0, "\"": 1, "#": 2, "$": 3, "%": 4, "&": 5, "'": 6}
    
  • merges.txt:対応テーブル
  • を1部格納
    #version: 0.2
    Ġ t
    Ġ a
    h e
    i n
    r e
    o n
    Ġt he
    e r
    Ġ s
    a t
    Ġ w
    Ġ o
    e n
    Ġ c
    i t
    i s
    a n
    o r
    e s
    Ġ b
    e d
    Ġ f
    in g
    Ġ p
    o u
    Ġa n
    a l
    a r
    Ġt o
    Ġ m
    Ġo f
    Ġ in
    Ġ d
    Ġ h
    Ġan d
    

    またtokenizerにはsave_vocabulary関数は、新規tokenを保存しないのでvocabのみです.jsonとmerges.txt.
    例:
    tokenizer.save_vocabulary('./save2')