使用philschmid/bart-large-cnn-samsum处理长文本遇IndexError如何解决?
解决长文本处理时的IndexError问题
问题原因
你遇到的IndexError: index out of range in self,是因为输入的通话日志经过token化后,长度超过了philschmid/bart-large-cnn-samsum模型的最大输入序列限制(该模型基于BART-large架构,默认支持的最大输入token数为1024)。短文本长度在限制范围内所以正常运行,而Hugging Face的Hosted Inference API会自动处理长文本的分块或截断逻辑,因此能正常处理该长通话日志。
解决方案
方案1:自动截断超出长度的文本
调用summarization pipeline时开启truncation=True,让tokenizer自动截断超过模型最大长度的部分。这种方法操作简单,但会丢失超出部分的文本信息。
from transformers import pipeline summarizer = pipeline("summarization", model="philschmid/bart-large-cnn-samsum") # 开启自动截断 summarizer(conversation, truncation=True)
方案2:长文本分块后汇总(推荐)
将长通话日志分割为多个不超过模型最大输入长度的文本块,分别生成每个块的摘要后再合并,能最大程度保留上下文信息。
示例代码:
from transformers import pipeline, AutoTokenizer summarizer = pipeline("summarization", model="philschmid/bart-large-cnn-samsum") tokenizer = AutoTokenizer.from_pretrained("philschmid/bart-large-cnn-samsum") # 获取模型支持的最大输入token数 max_input_length = tokenizer.model_max_length # 定义文本分块函数 def split_long_text(text, max_len): # 先将文本转为token序列 tokens = tokenizer.encode(text, add_special_tokens=False) chunks = [] # 按max_len-100的步长分割,预留冗余避免边界问题 for i in range(0, len(tokens), max_len - 100): chunk_tokens = tokens[i:i + max_len - 100] chunk_text = tokenizer.decode(chunk_tokens) chunks.append(chunk_text) return chunks # 分块处理并合并摘要 conversation_chunks = split_long_text(conversation, max_input_length) chunk_summaries = [summarizer(chunk)[0]['summary_text'] for chunk in conversation_chunks] final_summary = " ".join(chunk_summaries) print(final_summary)
方案3:扩展模型位置嵌入(进阶)
如果需要处理更长文本且不想分块,可以修改模型的位置嵌入层以扩展最大支持长度,但这种方法需要重新训练位置嵌入参数,适合有深度学习经验的用户,不推荐快速解决问题时使用。
内容的提问来源于stack exchange,提问作者Digil
相关产品推荐
相关产品推荐

