AI
一个案例
tokenizer 说明
加载数据集
DatasetDict 类
logits 说明
langchain(一)
关键词提取
RAG与向量检索
RAG与向量检索(二)
TF-IDF 算法
本文档使用 MrDoc 发布
-
+
首页
tokenizer 说明
### 概述 在自然语言处理(NLP)中,tokenizer是一个重要的组件,它负责将原始文本转换成模型能够理解的格式。这个过程通常包括分割文本、去除无用信息(如标点符号、特殊字符等),以及将词汇转换成数字表示(通常是词汇索引或向量)。Tokenizer的具体任务和实现可以根据不同的模型和需求有很大的变化,但它们通常包括以下几个基本步骤: 1. 分割文本(Tokenization):将文本字符串拆分成一个个的token。 例如,句子`"The quick brown fox"`可能被拆分为`["The", "quick", "brown", "fox"]`。 2. 词汇映射(Vocabulary Mapping):每个独立的token会被映射到一个唯一的数字ID。 这个映射通常是预先定义好的,基于在预训练过程中使用的词汇表。 3. 添加特殊Token:为了满足特定模型的需求,tokenizer会添加一些特殊token,例如: `- 开始标记[CLS]` `- 分隔标记[SEP]` `- 填充标记[PAD]` 4. 转换为模型输入格式:最终,tokenizer会将文本转换为模型所需的输入格式,这通常包括: `- input_ids`:token的数字表示; `- attention_mask`:指示哪些部分是真实数据而哪些是填充的; `- token_type_ids`:在处理多个句子时标示不同句子的token; `Tokenizer` 有以下几种类型: 1. `基于词的Tokenizer`:按空格和标点符号将文本拆分成单词。这种方法简单直接,但可能会导致词汇量很大,而且对于未见过的词汇处理不佳。 2. `基于子词的Tokenizer`:如Byte Pair Encoding(BPE)、SentencePiece等,通过将常见单词保持完整,同时将罕见单词拆分成更小的单元(如子词或字符)来克服词汇量大和未知词问题。这种方法既能保持较小的词汇表,又能较好地处理未知词汇,是当前最流行的方法之一。 3. `基于字符的Tokenizer`:直接将文本拆分为字符,这种方法词汇表很小,但可能导致输入序列很长,且可能损失一些词汇层面的信息。 > Tokenizer是NLP任务中不可或缺的一环,它桥接了原始文本数据和模型能够理解的数字。合理选择和使用tokenizer对于模型的性能有直接影响。随着深度学习和NLP技术的发展,tokenizer技术也在不断进步,更加高效和智能的tokenizer对于处理复杂语言数据至关重要。 ### 函数用法 ``` from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained('bert-base-uncased') encoded_dataset = tokenizer(dataset, padding=False, truncation=True) ``` 参数说明: - `padding`:填充。由于模型需要以固定的长度处理批量的文本数据,而自然语言文本通常长度不一,padding参数用于在较短的序列后添加特殊的填充符号(通常是`[PAD]`),使所有序列长度统一,满足模型输入的要求。参数有效值如下: ``` True:启用自动填充,将所有序列填充到同一长度; False:默认值,不进行自动填充; 'longest':自动将所有序列填充到批次中最长序列的长度; max_length:手动指定填充长度,序列将被填充或截断到这个长度; ``` - `truncation`:截断。由于模型设计时对输入长度有限制(例如,BERT的标准模型限制为512个token),如果一个序列的长度超过了模型的最大长度限制,`truncation`参数用于截断这些序列,移除一部分token以符合长度要求。参数有效值如下: ``` True:启用自动截断,将超过最大长度的序列截断到允许的最大长度; False:默认值,不进行自动截断。如果序列超过模型的最大长度限制,将会引发错误; 'only_first':只截断第一个序列(用于双序列任务); 'only_second':只截断第二个序列(同样用于双序列任务); max_length:手动指定截断长度,序列将被截断到这个长度; ``` 输出结果: ``` { 'sms': 'Go until jurong point, crazy.. Available only in bugis n great world...', 'label': 0, 'input_ids': [101, 2175, 2127, 18414, 17583, 2391, ...], 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, ..., 0, 0, 0, 0], 'attention_mask': [1, 1, 1, 1, 1, 1, 1, ..., 1, 1, 1, 1] } ``` ### 输出结果说明 在使用BERT模型(或类似的Transformer模型)时,文本需要通过一个分词器(Tokenizer)进行预处理,转换成模型能够理解的格式。 tokenizer函数的输出通常包含三个关键字段: 1. `input_ids` 该字段是文本经过分词器处理后,`每个token对应的词汇表索引的列表`。BERT模型的词汇表中,每个唯一的词(或词片段)都被分配了一个唯一的ID。因此,`input_ids`实际上是将输入文本转换成一系列词汇表索引的过程,这些索引将被模型用来理解文本内容。 > 例如,如果输入文本是`"The cat sits on the mat"`,分词器可能会将其分词为`["The", "cat", "sits", "on", "the", "mat"]`,然后将每个词转换为对应的索引,比如`[101, 2023, 4937, 2006, 1996, 12654, 102]`(实际索引可能有所不同,取决于词汇表)。 2. `token_type_ids` 该字段用于区分输入中的不同序列。对于一些模型任务,如问答或句子对分类,输入可能包含两个不同的序列(比如两个句子),这时`token_type_ids`会用来标记每个token属于哪个序列。 > 在`token_type_ids`中,通常用0和1来区分这两个序列。第一个序列的所有token都被标记为0,第二个序列的所有token(如果存在)被标记为1。对于只包含单一序列的任务(如文本分类),`token_type_ids`可能全为0或不被使用。 例如,对于输入`["The", "cat", "sits", "[SEP]", "The", "dog", "sleeps"]`,`token_type_ids`可能是`[0, 0, 0, 0, 1, 1, 1]`,这里`[SEP]`标记用来分隔两个句子,前三个token(和`[SEP]`标记)属于第一个序列(标记为0),后三个token属于第二个序列(标记为1)。 3. `attention_mask` 该字段是一个与`input_ids`长度相同的二进制(0或1)序列,用于指示模型哪些token是真实的输入数据,哪些token是为了达到固定长度而添加的填充(padding)token。 > 在处理自然语言数据时,由于句子或文本片段的长度不一,我们通常需要将所有输入序列填充(或截断)到固定的长度以便批量处理。在这个过程中,较短的句子会在其末尾添加一些特殊的填充token(如[PAD]),以达到预设的长度。然而,这些填充token实际上是没有任何意义的,不应该影响模型对真实输入内容的理解和处理。 因此,`attention_mask`就被用来告诉模型,哪些token是真实的文本内容(用1表示),哪些是填充token(用0表示)。在模型的自注意力(Self-Attention)计算过程中,填充token不会对其他token的注意力分数产生影响,从而确保模型的注意力集中在有效的输入上,而不是无意义的填充部分。 ### 关于`token_type_ids`的说明 `token_type_ids`序列中只可能包含0和1,这是因为,在大多数基于BERT和Transformer架构的模型中,输入通常被设计为处理一到两个文本序列的情形,而无法处理更多序列。这是因为BERT模型及其变体主要针对以下任务设计: - 单序列任务:如文本分类、情感分析,其中只需要处理一个文本序列; - 双序列任务:如问答(将问题和段落作为两个序列)、句子关系判断(如判断两个句子是否相似),其中模型需要同时处理两个文本序列; ### 示例 ``` inputs = "After the storm, there was a calm" # 输出情况如下: token: ["After", "the", "storm", ",", "there", "was", "a", "calm"] input_ids: [101, 2044, 1996, 4040, 1010, 2045, 2001, 1037, 476, 102] # 如果我们将序列长度固定为12,则需要添加四个填充token([PAD]): input_ids:[101, 2044, 1996, 4040, 1010, 2045, 2001, 1037, 476, 102, 0, 0, 0, 0] attention_mask:[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0] # 前10个token(包括句子的实际内容和特殊的开始[CLS]及结束[SEP]token)被标记为1,表示它们是句子的有效部分; # 后面四个填充token则被标记为0,告诉模型忽略它们; # 通过`attention_mask`可以确保模型的注意力机制只关注句子的实际内容,提高了处理效率和模型性能。 ```
gaojian
2024年4月2日 20:00
分享文档
收藏文档
上一篇
下一篇
微信扫一扫
复制链接
手机扫一扫进行分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码