当前位置: 首页 > news >正文

tokenizer截断丢失信息,如何处理?

简短回答:

标准的 truncation 会丢失末尾信息,但我们可以通过以下方法缓解或避免:

方法是否推荐说明
1. 滑动窗口 + 池化✅✅✅ 强烈推荐将长文本分段编码,再融合
2. 保留尾部 truncation✅ 推荐让 tokenizer 保留最后部分
3. 使用长文本模型(Longformer, BigBird)✅✅ 强烈推荐原生支持 4k~16k 长度
4. 提取关键句 + 摘要✅ 推荐预处理阶段压缩内容
5. 双向截断(首尾结合)✅ 可用同时保留开头和结尾

下面我们详细讲解每种方法,并给出代码示例。


方法1:滑动窗口 + 池化(Sliding Window + Pooling)

思路:

将长文本切分为多个重叠的窗口,分别编码,然后对所有 token 或 [CLS] 向量做 池化(如 mean/max pooling),得到最终表示。

优点:

  • 保留全文信息
  • 兼容 BERT 等标准模型
  • 可控制计算量

缺点:

  • 计算开销增加
  • 实现稍复杂

示例代码:

import torch
from transformers import AutoTokenizer, AutoModeltokenizer = AutoTokenizer.from_pretrained('bert-base-uncased')
model = AutoModel.from_pretrained('bert-base-uncased')def encode_long_text_sliding(text, max_length=128, stride=64):# 分词但不截断inputs = tokenizer(text,max_length=max_length,truncation=False,  # 先不分段return_tensors='pt',return_overflowing_tokens=True,  # 启用滑动窗口stride=stride  # 重叠部分)input_ids = inputs['input_ids']  # (num_segments, max_length)attention_mask = inputs['attention_mask']with torch.no_grad():outputs = model(input_ids=input_ids, attention_mask=attention_mask)# 取最后一层所有 token 的隐藏状态last_hidden_states = outputs.last_hidden_state  # (num_segments, max_length, 768)# 对每个 segment 做 mean pooling(去掉 [PAD])pooled_vectors = []for i in range(last_hidden_states.size(0)):mask = attention_mask[i].unsqueeze(-1)  # (max_length, 1)seg_vec = last_hidden_states[i] * maskpooled = seg_vec.sum(dim=0) / mask.sum()  # mean poolingpooled_vectors.append(pooled)# 对所有 segment 的 pooled vector 再做 mean poolingfinal_vector = torch.stack(pooled_vectors).mean(dim=0)  # (768,)return final_vector

适用场景:长篇财经报道、年报、研报摘要。


方法2:保留尾部截断(Truncate from Beginning)

思路:

默认 truncation 是从开头保留,但我们可以通过设置让 tokenizer 保留末尾部分

优点:

  • 简单!一行代码
  • 适合“结论在后”的文本

缺点:

  • 丢失开头信息(如主语、背景)

示例代码:

text = "The company reported strong revenue growth in Q2, however management lowered full-year guidance due to supply chain issues."enc = tokenizer(text,max_length=32,truncation=True,padding='max_length',return_tensors='pt',# 关键参数:truncation='only_first',      # 只对第一个句子截断stride=0,pad_to_max_length=True,# 让 tokenizer 从前面截断(即保留后面)# 实际上:PyTorch Transformers 默认保留前面,但我们可以手动控制
)# 更直接的方法:使用 return_overflowing_tokens 并取最后一个 segment
inputs = tokenizer(text,max_length=32,truncation=True,return_tensors='pt',return_overflowing_tokens=True,stride=16
)# 取最后一个 segment(即末尾部分)
input_ids_tail = inputs['input_ids'][-1]  # 保留最后 32 tokens

适用场景:新闻结尾常有“但是…”、“然而…”、“展望…”等关键信息。


方法3:使用长文本模型(Longformer / BigBird / LED)

推荐模型:

模型最大长度特点
Longformer4096支持全局 attention(如 [CLS]
BigBird4096稀疏 attention,更快
LED16384专为长文档摘要设计

示例代码:

from transformers import AutoTokenizer, AutoModeltokenizer = AutoTokenizer.from_pretrained('allenai/longformer-base-4096')
model = AutoModel.from_pretrained('allenai/longformer-base-4096')text = "你的超长金融新闻文本..."  # 可达 4096 tokensinputs = tokenizer(text, return_tensors='pt', truncation=False, padding=True)
with torch.no_grad():outputs = model(**inputs)

优点

  • 原生支持长文本,无需分段
  • 信息完整保留

缺点

  • 显存消耗大
  • 推理速度慢

适用场景:年报、政策文件、完整研报。


方法4:预处理:提取关键句或摘要

思路:

在输入模型前,先用 NLP 方法提取最重要的句子。

方法:

  • TextRank / TF-IDF:无监督关键词/句提取
  • 预训练摘要模型:如 BART, Pegasus
  • 规则匹配:找“but”, “however”, “despite”, “guidance” 等关键词所在句

示例(使用 BART 摘要):

from transformers import pipelinesummarizer = pipeline("summarization", model="facebook/bart-large-cnn")text = "长文本..."
summary = summarizer(text, max_length=100, min_length=30, do_sample=False)
print(summary[0]['summary_text'])
# 输出精简版,再输入你的主模型

适用场景:数据预处理阶段,提升效率。


方法5:双向截断(首尾结合)

思路:

保留前半部分 + 后半部分,中间丢弃。

实现思路:

def truncate_keep_head_tail(text, tokenizer, max_length=128):tokens = tokenizer.tokenize(text)if len(tokens) <= max_length - 2:return tokenizer.encode(text, max_length=max_length, padding='max_length')# 保留 [CLS] + 前半 + 后半 + [SEP]half_len = (max_length - 4) // 2  # 减去 [CLS], [SEP], 和两个部分的平衡head = tokens[:half_len]tail = tokens[-half_len:]new_tokens = ['[CLS]'] + head + tail + ['[SEP]']input_ids = tokenizer.convert_tokens_to_ids(new_tokens)# 填充if len(input_ids) < max_length:input_ids += [0] * (max_length - len(input_ids))return input_ids

适用场景:中等长度文本,兼顾开头(主语)和结尾(结论)。


总结:如何选择?

你的需求推荐方法
想快速改进,且关键信息在结尾保留尾部 truncation
文本很长(>512),信息分散✅✅ Longformer / BigBird
显存有限,但想保留全文✅✅ 滑动窗口 + 池化
想减少输入长度,提升速度摘要提取 + BART
兼顾开头和结尾双向截断
http://www.dtcms.com/a/389066.html

相关文章:

  • Mybatis学习笔记03-XML映射配置
  • 时空预测论文分享:模仿式生成 动态局部化 解耦混淆因子表征 零样本/少样本迁移
  • 更新!Windows 11 25H2 四合一版【版本号:26200.5074】
  • CentOS 7.9 离线部署 KVM + WebVirtMgr,通过WebVirtMgr创建虚拟机教程
  • Python实现在模型上进行点云(下)采样
  • Vue 原理三大子系统:编译时、响应式与运行时
  • 黑马SpringCloud02
  • Windows安装Kafka(kafka_2.12-3.9.1),配置Kafka,以及遇到的问题解决方案
  • Kafka 硬件与操作系统选型与调优实战
  • ActiveMQ面试
  • ActiveMQ 系统知识全解析
  • 智慧园区:科技赋能城市单元,重塑未来运营新生态
  • 2025年9月17日学习笔记——模式识别与机器学习第11章——非监督学习与聚类
  • arcgispro基于森林的分类与回归 (空间统计)
  • npm run serve 和 npm run dev的区别
  • 2025 局域网内多台服务器时间统一,最稳定且无需联网的方案是部署 NTP 离线服务器部署chrony 轻量且兼容性强,支持纯离线环境
  • 机器学习如何改变AI?
  • rook-ceph的dashboard配置覆盖与生效
  • 在 macOS 上安装 Claude Code 的完整指南
  • RocketMQ Dashboard 消息重复问题排查与修复(rocketmq-dashboard-2.0.0-source-release)
  • 卓伊凡的第一款独立游戏-详细介绍游戏开发引擎unity-以及详细介绍windows和mac的安装步骤【01】
  • 多表联合查询
  • Day26_【深度学习(6)_神经网络NN(1中)激活函数_softmax详解篇】
  • 黑盒测试:测试用例设计之等价类设计方法(等价类划分:Equivalence Partitioning)有效等价类、无效等价类、边界值分析
  • 22 C++11 初始化新姿势:{} 统一初始化(省等号)+initializer_list 底层解析
  • 黑马头条_SpringCloud项目阶段二:FreeMarker组件以及MinIO系统集成
  • MySQL 数据库基础操作指南:从创建管理到备份恢复全解析
  • 【Java】-- rjvm 项目分析
  • Markdown 常用语法参考
  • 11.2.3 固定话题聊天实现