使用Hugging Face摘要功能时触发IndexError问题求助
解决YouTube字幕摘要的IndexError问题
你的报错核心原因有两个:
- 默认使用的
sshleifer/distilbart-cnn-12-6模型最大支持1024个token,但你的字幕文本转换成token后有11628个,远超限制,直接输入触发了索引越界错误。 - 未明确指定模型,不符合生产环境使用规范(虽不是直接报错原因,但官方不推荐)。
解决方案
1. 分割超长文本为符合模型限制的片段
用NLTK将字幕分割成句子,再合并成不超过模型最大token长度的文本块,确保每个块都能被模型正常处理。
2. 明确指定模型(可选但推荐)
直接指定默认模型或更换支持更长序列的模型,同时符合生产环境的使用要求。
修改后的完整代码
import nltk nltk.download('punkt') from youtube_transcript_api import YouTubeTranscriptApi from transformers import pipeline, AutoTokenizer video_id = 'wK4XmXJ299k' # 获取字幕并合并成完整文本 transcript = YouTubeTranscriptApi.get_transcript(video_id) corpus = ' '.join([line['text'] for line in transcript]) # 初始化摘要模型和tokenizer,明确指定模型 model_name = "sshleifer/distilbart-cnn-12-6" summarizer = pipeline("summarization", model=model_name) tokenizer = AutoTokenizer.from_pretrained(model_name) # 模型允许的最大token长度 max_token_len = 1024 # 用NLTK将完整文本分割成句子 sentences = nltk.sent_tokenize(corpus) # 构建符合长度限制的文本块 text_chunks = [] current_chunk = [] current_length = 0 for sentence in sentences: # 计算当前句子的token长度 sentence_len = len(tokenizer.encode(sentence)) # 如果当前块加新句子会超限制,就保存当前块并重置 if current_length + sentence_len > max_token_len: text_chunks.append(' '.join(current_chunk)) current_chunk = [sentence] current_length = sentence_len else: current_chunk.append(sentence) current_length += sentence_len # 加入最后一个未完成的文本块 if current_chunk: text_chunks.append(' '.join(current_chunk)) # 对每个文本块单独生成摘要,再合并结果 summaries = [] for chunk in text_chunks: # 可根据需求调整摘要的长度范围 summary = summarizer(chunk, max_length=150, min_length=30, do_sample=False) summaries.append(summary[0]['summary_text']) # 合并所有片段的摘要得到最终结果 final_summary = ' '.join(summaries) print(final_summary)
关键说明
- 文本分割逻辑:通过tokenizer精准计算句子的token长度,确保每个文本块不超过模型限制,从根源避免索引越界错误。
- 模型指定:明确声明模型名称,既符合生产环境规范,也方便后续更换其他支持更长序列的摘要模型。
- 摘要参数调整:
max_length和min_length可根据需求修改,控制输出摘要的长度范围。
内容的提问来源于stack exchange,提问作者ahhhgetit
相关产品推荐
相关产品推荐

