示例代码:
def _apply_chunking(self, corpus, tokenizer):
chunked_corpus = dict()
for k, v in corpus.items():
text = f"{v['title']} {v['text']}" if 'title' in v else v['text']
current_doc = []
chunk_annotations = self.chunker.chunk(
text,
tokenizer,
chunking_strategy=self.chunking_strategy,
**self.chunking_args,
)
tokens = tokenizer.encode_plus(text, add_special_tokens=False)
for start_token_idx, end_token_idx in chunk_annotations:
text_chunk = tokenizer.decode(
tokens.encodings[0].ids[start_token_idx:end_token_idx]
)
current_doc.append({'text': text_chunk})
chunked_corpus[k] = current_doc
return chunked_corpus
tokenizer.encode_plus(...)
tokenizer.decode(...)
这两个方法是 Hugging Face 中常用的 tokenizer 方法,主要用于:
- 把一句自然语言转成模型能理解的“数字 token”(encode)
- 把模型用的“数字 token”还原成人话文本(decode)
✅ 1. tokenizer.encode_plus(...)
是干什么的?
📌 通俗理解:
就像你把一句话翻译成大模型能懂的“机器语言”(一串数字)——每个词或字符都变成一个编号。
🧠 它返回一个字典,包含以下重要内容:
{
'input_ids': [...], # 把文字转成的 token id(核心)
'attention_mask': [...], # 哪些 token 是内容,哪些是 padding(可选)
'token_type_ids': [...], # 哪些是句子A,哪些是句子B(可选)
'encodings': [...] # 每个 token 的详细编码信息(比如原文中的位置等)
}
🔍 举个例子:
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
text = "北京欢迎你"
output = tokenizer.encode_plus(text, add_special_tokens=False)
你会得到:
{
'input_ids': [1266, 6206, 872],
'token_type_ids': [0, 0, 0],
'attention_mask': [1, 1, 1],
'encodings': [...] # 里面记录的是“原文中每个 token 的位置”
}
含义是:
token | 中文 | token id |
---|---|---|
1266 | 北 | 1266 |
6206 | 京 | 6206 |
872 | 欢迎你 | 872 |
注意:tokenizer.encode_plus(..., add_special_tokens=False)
表示不加 [CLS]
、[SEP]
等特殊符号。
✅ 2. tokenizer.decode(...)
是干什么的?
📌 通俗理解:
把模型语言(数字 token id)“翻译回人类语言”,也就是还原成可读文本。
🔍 举个例子:
ids = [1266, 6206, 872]
text = tokenizer.decode(ids)
print(text)
结果是:
北京欢迎你
所以,decode()
是用来“还原文本”的,和 encode_plus
是反操作。
🧩 二者在 chunk 切片中怎么配合?
我们来看一个“切 chunk”时怎么用它们配合的片段:
tokens = tokenizer.encode_plus(text, add_special_tokens=False)
for start, end in chunk_annotations:
ids = tokens.encodings[0].ids[start:end]
chunk_text = tokenizer.decode(ids)
encode_plus(...)
:把整篇文章变成 token IDchunk_annotations
:用索引表示一个 chunk 的 token 范围[start:end]
取出一个 chunk 的 token iddecode(...)
:把这一段 token 还原为文本,成为一个 chunk 文本
✅ 总结一句话
方法 | 通俗解释 | 举例 |
---|---|---|
encode_plus | 把“人话”转成“大模型能懂的数字 ID” | “北京欢迎你” → [1266, 6206, 872] |
decode | 把“大模型的数字 ID”转成人类能读懂的文本 | [1266, 6206, 872] → “北京欢迎你” |