You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Pegasus进行整段复述时仅处理后半段的问题求助

问题:Pegasus复述段落仅处理后半段,无法覆盖完整内容

使用tuner007/pegasus_paraphrase模型做文本复述时,单句效果达标,但处理完整段落时,生成结果只保留后半段内容(比如示例输入里的开头“Randal去商场买衣服”部分完全丢失)。调整过max_length、min_length等参数后问题仍未解决,当前实现代码如下:

from transformers import *

class SomeClass:
    def __init__(self):
        self.model = PegasusForConditionalGeneration.from_pretrained("tuner007/pegasus_paraphrase")
        self.tokenizer = PegasusTokenizerFast.from_pretrained("tuner007/pegasus_paraphrase")

    def get_paraphrased_sentences1(self, model, tokenizer, sentence, num_return_sequences=5, num_beams=5):
        # tokenize the text to be form of a list of token IDs
        inputs = tokenizer([sentence], truncation=True, padding="longest", return_tensors="pt")
        # generate the paraphrased sentences
        outputs = model.generate(
            **inputs,
            max_length=8096,
            length_penalty=2.0,
            num_beams=num_beams,
            num_return_sequences=num_return_sequences,
        )
        # decode the generated sentences using the tokenizer to get them back to text
        return tokenizer.batch_decode(outputs, skip_special_tokens=True)

示例输入:

Randal went to the mall to get some clothes. When he got home he found his wife cheating on him. Randal ended up kicking her out of the house. The kids stay with Randal and not the cheating wife.

当前输出(仅保留后半段):

When he got home, he found his wife cheating on him, so he kicked her out of the house and the kids stayed with him.
When he got home, he found his wife cheating on him, so he kicked her out of the house and put the kids with him.
...(其余输出均丢失开头买衣服的信息)

解决方案

1. 调整生成参数,强化全信息保留

tuner007/pegasus_paraphrase是针对短文本复述微调的模型,默认生成逻辑会倾向于压缩信息,加上你设置的length_penalty=2.0会进一步强化短文本偏好,同时默认开启的early_stopping=True会让模型提前终止生成,直接丢失前半段信息。

修改生成参数,调整后代码如下:

from transformers import PegasusForConditionalGeneration, PegasusTokenizerFast

class SomeClass:
    def __init__(self):
        self.model = PegasusForConditionalGeneration.from_pretrained("tuner007/pegasus_paraphrase")
        self.tokenizer = PegasusTokenizerFast.from_pretrained("tuner007/pegasus_paraphrase")

    def get_paraphrased_paragraph(self, paragraph, num_return_sequences=5, num_beams=5):
        # 计算输入文本的token长度,用于设置生成的最小长度阈值
        input_token_len = self.tokenizer(paragraph, return_tensors="pt")['input_ids'].shape[1]
        
        inputs = self.tokenizer([paragraph], truncation=True, padding="longest", return_tensors="pt")
        outputs = self.model.generate(
            **inputs,
            max_length=input_token_len + 60,  # 比输入长度稍长,给复述留冗余空间
            min_length=int(input_token_len * 0.9),  # 强制生成至少90%输入长度的内容,避免信息丢失
            length_penalty=1.1,  # 降低短文本偏好,让模型更愿意保留完整信息
            num_beams=num_beams,
            num_return_sequences=num_return_sequences,
            early_stopping=False,  # 关闭提前终止,确保模型遍历更多生成可能
            no_repeat_ngram_size=2,  # 避免重复生成,同时保留上下文逻辑
            do_sample=False
        )
        return self.tokenizer.batch_decode(outputs, skip_special_tokens=True)

2. 备选方案:分句复述后拼接

如果模型本身对长段落的信息整合能力有限,可以拆分段落为单句,分别复述后再拼接成完整段落,这样能确保每句信息都被处理:

def paraphrase_paragraph_by_sentences(self, paragraph, num_return_sequences=1):
    # 按句号拆分句子(可根据实际文本调整拆分逻辑)
    sentences = [s.strip() for s in paragraph.split('.') if s.strip()]
    paraphrased_list = []
    
    for sent in sentences:
        inputs = self.tokenizer([sent], truncation=True, padding="longest", return_tensors="pt")
        outputs = self.model.generate(
            **inputs,
            max_length=150,
            length_penalty=2.0,
            num_beams=5,
            num_return_sequences=1
        )
        paraphrased_sent = self.tokenizer.batch_decode(outputs, skip_special_tokens=True)[0]
        paraphrased_list.append(paraphrased_sent)
    
    # 拼接成完整段落
    return '. '.join(paraphrased_list) + '.'

内容的提问来源于stack exchange,提问作者W01v3n

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:36:42