使用Hugging Face Transformers生成摘要时末尾句子截断问题求助
解决Hugging Face Transformers文本摘要末尾截断问题
你的核心问题出在自定义停止条件的实现错误以及停止逻辑不合理,另外还有generate参数的搭配问题,以下是具体修正方案:
1. 修复自定义停止条件的实现
你当前用lambda包装普通函数的方式不符合StoppingCriteria的要求,必须继承transformers.StoppingCriteria类并实现__call__方法。同时原逻辑只要生成文本中出现句号就停止,会导致中途截断,应该判断生成的完整文本末尾是否包含句子结束标记(如.、!、?)。
修正后的停止条件代码:
from transformers import StoppingCriteria, StoppingCriteriaList class SentenceEndStoppingCriteria(StoppingCriteria): def __call__(self, input_ids, scores, **kwargs): # 解码当前生成的文本 generated_text = tokenizer.decode(input_ids[0], skip_special_tokens=True) # 判断末尾是否是句子结束标记 return generated_text.endswith(('.', '!', '?')) stopping_criteria = StoppingCriteriaList([SentenceEndStoppingCriteria()])
2. 优化generate参数配置
除了修复停止条件,还需要调整generate的参数避免截断:
- 确保
max_length足够大,同时设置min_length避免生成过短文本 - 若使用beam搜索,
early_stopping=True可以让模型在满足停止条件时及时停止,无需设为False - 检查tokenizer的
pad_token是否设置,部分模型默认pad_token为None,需要指定为eos_token
调整后的generate调用:
# 若tokenizer无pad_token,先设置 if tokenizer.pad_token is None: tokenizer.pad_token = tokenizer.eos_token inputs = tokenizer(texto, return_tensors="pt", padding=True, truncation=True).input_ids outputs = model.generate( inputs, max_length=1000, min_length=50, # 根据需求调整最小长度 stopping_criteria=stopping_criteria, num_beams=3, no_repeat_ngram_size=2, early_stopping=True, pad_token_id=tokenizer.pad_token_id ) summary = tokenizer.decode(outputs[0], skip_special_tokens=True) print(summary)
3. 更简便的替代方案:使用stop_sequences参数
如果不需要复杂的停止逻辑,可以直接用stop_sequences参数指定停止标记,无需自定义StoppingCriteria:
inputs = tokenizer(texto, return_tensors="pt", padding=True, truncation=True).input_ids outputs = model.generate( inputs, max_length=1000, min_length=50, stop_sequences=['.', '!', '?'], # 遇到这些标记就停止 num_beams=3, no_repeat_ngram_size=2, early_stopping=True, pad_token_id=tokenizer.pad_token_id ) summary = tokenizer.decode(outputs[0], skip_special_tokens=True).rstrip('.!?') # 移除末尾的停止标记
额外检查点
- 确认输入文本没有被过度截断:调整tokenizer的
truncation参数或max_length,确保输入完整 - 部分模型本身的生成特性:有些摘要模型会倾向于生成简洁文本,若需要更完整的句子,可以尝试调整
temperature参数(如设为0.7)增加生成多样性
内容的提问来源于stack exchange,提问作者Flix Francisco Enrquez Romero
相关产品推荐
相关产品推荐

