LLM的Tokenizer

大型语言模型的tokenizer是通过在大规模文本数据上进行训练和学习得到的。
下面是一般的tokenizer训练过程:

  1. 数据收集:收集大量的文本数据来作为训练数据。这些数据可以来自各种来源,如互联网、书籍、新闻文章等。重要的是要确保数据的多样性和代表性,以便模型可以学习到广泛的语言结构和用法。

  2. 数据预处理:对收集到的文本数据进行预处理。这包括去除特殊字符、标点符号、HTML标签、URL等,以及进行标准化、拼写纠正和格式转换等操作。预处理的目的是清洗和规范化文本数据,以便后续处理和训练。

  3. 分词(Tokenization):将文本数据划分为离散的词或子词单元,称为tokens。分词的目的是将连续的文本流转化为离散的语义单位,以便模型可以处理和理解。分词可以采用不同的方法,如基于空格或标点符号的简单分词,或者更复杂的基于统计和机器学习的分词算法(如Byte Pair Encoding、WordPiece等)。

  4. 构建词表(Vocabulary):根据分词结果构建词表,将每个token映射到一个唯一的整数标识符(称为token ID)。词表中通常还包括一些特殊token,如起始符、结束符、填充符等。词表的构建可以基于分词结果的频率统计或其他方法。

  5. 学习编码器:使用分词和词表构建的编码器模型,如BERT、GPT等,对预处理的文本数据进行训练。编码器模型会学习语言的上下文信息、语法规则和语义表示等,以便在生成或理解文本时进行预测和推断。

  6. 导出tokenizer:在训练完成后,从编码器模型中导出tokenizer。tokenizer包含了将文本转换为模型所需输入格式的功能,例如将文本转换为token IDs、添加特殊标记等。导出的tokenizer可以在后续使用中用于对新的文本数据进行编码和解码。

需要注意的是,具体的tokenizer训练过程可能因模型和实现而有所不同。上述过程仅提供了一个一般的训练流程示例。

data.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)

token_test.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