大型语言模型的tokenizer是通过在大规模文本数据上进行训练和学习得到的。
下面是一般的tokenizer训练过程:
-
数据收集:收集大量的文本数据来作为训练数据。这些数据可以来自各种来源,如互联网、书籍、新闻文章等。重要的是要确保数据的多样性和代表性,以便模型可以学习到广泛的语言结构和用法。
-
数据预处理:对收集到的文本数据进行预处理。这包括去除特殊字符、标点符号、HTML标签、URL等,以及进行标准化、拼写纠正和格式转换等操作。预处理的目的是清洗和规范化文本数据,以便后续处理和训练。
-
分词(Tokenization):将文本数据划分为离散的词或子词单元,称为tokens。分词的目的是将连续的文本流转化为离散的语义单位,以便模型可以处理和理解。分词可以采用不同的方法,如基于空格或标点符号的简单分词,或者更复杂的基于统计和机器学习的分词算法(如Byte Pair Encoding、WordPiece等)。
-
构建词表(Vocabulary):根据分词结果构建词表,将每个token映射到一个唯一的整数标识符(称为token ID)。词表中通常还包括一些特殊token,如起始符、结束符、填充符等。词表的构建可以基于分词结果的频率统计或其他方法。
-
学习编码器:使用分词和词表构建的编码器模型,如BERT、GPT等,对预处理的文本数据进行训练。编码器模型会学习语言的上下文信息、语法规则和语义表示等,以便在生成或理解文本时进行预测和推断。
-
导出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]))