LLM 用トークナイザー

大規模な言語モデルのトークナイザーは、大規模なテキスト データのトレーニングと学習によって取得されます。
一般的なトークナイザーのトレーニング プロセスは次のとおりです。

  1. データ収集:学習データとして大量のテキストデータを収集します。これらのデータは、インターネット、書籍、ニュース記事などのさまざまなソースから取得できます。モデルが幅広い言語構造と使用法を学習できるように、データが多様で代表的なものであることを確認することが重要です。

  2. データ前処理:収集したテキストデータを前処理します。これには、特殊文字、句読点、HTML タグ、URL などの削除や、正規化、スペル修正、形式変換などの操作の実行が含まれます。前処理の目的は、後続の処理とトレーニングのためにテキスト データをクリーンアップおよび正規化することです。

  3. トークン化: テキスト データをトークンと呼ばれる個別のワードまたはサブワード単位に分割します。トークン化の目的は、モデルが処理して理解できるように、テキストの連続ストリームを個別の意味単位に変換することです。単語の分割には、スペースや句読点に基づく単純な単語分割、統計や機械学習 (バイト ペア エンコーディング、WordPiece など) に基づくより複雑な単語分割アルゴリズムなど、さまざまな方法を使用できます。

  4. 語彙の構築 (Vocabulary): 単語の分割結果に基づいて語彙を構築し、各トークンを一意の整数識別子 (トークン ID と呼ばれる) にマッピングします。通常、語彙には、開始文字、終了文字、フィラー文字などの特別なトークンも含まれます。語彙の構築は、単語分割結果の頻度統計またはその他の方法に基づいて行うことができます。

  5. 学習エンコーダー: BERT、GPT などの単語セグメンテーションと語彙を使用して構築されたエンコーダー モデルは、前処理されたテキスト データでトレーニングされます。エンコーダー モデルは、文脈情報、文法規則、言語の意味表現を学習して、テキストを生成または理解するときに予測と推論を行います。

  6. トークナイザーのエクスポート: トレーニングが完了したら、エンコーダー モデルからトークナイザーをエクスポートします。トークナイザーには、テキストをトークン ID に変換する、特別なトークンを追加するなど、テキストをモデルで必要な入力形式に変換するための関数が含まれています。エクスポートされたトークナイザーは、後で使用するときに新しいテキスト データをエンコードおよびデコードするために使用できます。

特定のトークナイザーのトレーニング プロセスはモデルや実装によって異なる場合があることに注意してください。上記の手順は、一般的なトレーニング プロセスの例を示しているだけです。

データ.py

from datasets import list_datasets,load_dataset,load_from_disk

# print(list_datasets())
# dataset = load_dataset(path="CyberHarem/mobius_honkai3",split="train")
#从磁盘加载数据
datset = load_from_disk("data/ChnSentiCorp")
print(datset)
#取出训练集
train_data = datset["train"]
print(train_data)
#查看数据
for data in train_data:
    print(data)

MyData.py

from torch.utils.data import Dataset
from datasets import load_from_disk

class MyDataset(Dataset):
    def __init__(self,spilt):
        #从磁盘加载数据
        self.dataset = load_from_disk("data/ChnSentiCorp")
        if spilt == "train":
            self.dataset = self.dataset["train"]
        elif spilt == "validation":
            self.dataset = self.dataset["validation"]
        elif spilt == "test":
            self.dataset = self.dataset["test"]

    def __len__(self):
        return len(self.dataset)

    def __getitem__(self, index):
        text = self.dataset[index]["text"]
        label = self.dataset[index]["label"]
        return text,label

if __name__ == '__main__':
    dataset = MyDataset("validation")
    for data in dataset:
        print(data)

トークンテスト.py

from transformers import BertTokenizer

#加载字典和分词工具
token = BertTokenizer.from_pretrained("bert-base-chinese")
# print(token)

sents = ["从我下",
         "入住前的期待还是很高,不过到达后感觉还是比较失望,这个价值和七斗星、如家等不到200元房价的经济型酒店还是有一定的差距,同去的同事的评价也不高,有点后悔 没要什么服务,这方面不清楚 退房速度还可以",
         "5月8日付款成功,当当网显示5月10日发货,可是至今还没看到货物,也没收到任何通知,简不知怎么说好!!!"]

#批量编码句子
out = token.batch_encode_plus(
    batch_text_or_text_pairs=[sents[0],sents[1]],
    add_special_tokens=True,
    #当句子长度大于max_length时,截断
    truncation=True,
    #一律补0到max_length长度
    padding="max_length",
    max_length=150,
    #可选参数:tf,pt,np,默认返回为list
    return_tensors=None,
    #是否返回attention_mask
    return_attention_mask=True,
    #返回token_type_ids
    return_token_type_ids=True,
    #返回special_tokens_mask特殊符号标志
    return_special_tokens_mask=True,
    #返回offsets_mapping标识每个词的起止位置,这个参数只能在BertTokenizerFast使用。
    # return_offsets_mapping=True,
    #返回length标识长度
    return_length=True,
)

print(out)
for k,v in out.items():
    print(k,":",v)

print(token.decode(out["input_ids"][0]),token.decode(out["input_ids"][1]))

おすすめ

転載: blog.csdn.net/weixin_44659309/article/details/132288054