文本风格迁移:改变文本的语体与情感色彩

FreeGuideOnline 最新 2026-06-23

提示:将以下句子改写为极其正式、礼貌的商务语言,不要改变原意: 输入:“你们的方案太贵了,我们想再看看。” 输出:贵方方案报价超出我方当前预算,我方希望进一步评估比较。


**优势**:无需训练,灵活适配任意风格描述。  
**挑战**:生成结果不稳定,大型模型部署成本高。

## 4. 动手实践:用Hugging Face实现情感风格迁移

我们将使用Hugging Face上预训练的Style Transfer模型,快速体验文本情感转换。

### 4.1 环境准备
```bash
pip install transformers torch

4.2 使用 style_transfer Pipeline

Hugging Face提供直接可用的风格迁移管道(基于T5的模型,如prithivida/parrot_paraphraser_on_T5 或专用风格迁移模型)。这里使用csebuetnlp/mT5_multilingual_XLSum 演示简单的正式化,但针对情感,我们选用更适用的 humarin/chatgpt_paraphraser_on_T5,它能基于输入指令改写风格。

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM

tokenizer = AutoTokenizer.from_pretrained("humarin/chatgpt_paraphraser_on_T5")
model = AutoModelForSeq2SeqLM.from_pretrained("humarin/chatgpt_paraphraser_on_T5")

def transfer_style(text, target_style="formal"):
    # 用英文提示模拟风格指令
    prompt = f"Paraphrase this in {target_style} style: {text}"
    inputs = tokenizer(prompt, return_tensors="pt", truncation=True, max_length=128)
    outputs = model.generate(**inputs, max_length=128, temperature=0.7)
    return tokenizer.decode(outputs[0], skip_special_tokens=True)

source_text = "I don't like this product. It's so boring."
print(transfer_style(source_text, "positive"))
# 输出类似:The product may be better suited for others, but it didn't excite me.

4.3 专用中文情感迁移模型

对于中文,可以使用 uer/t5-base-chinese-cls 结合风格标签,或者直接调用百度飞桨PaddleNLP的unimo-text-1.0任务。这里演示加载一个中文情感改写模型(如有现成模型可替换路径):

from paddlenlp import Taskflow
style_transfer = Taskflow("text_style_transfer", style="positive")
print(style_transfer("这家餐厅太吵了,服务也慢"))
# 输出:这家餐厅氛围热闹,服务员忙碌但很认真。

如果不想使用PaddleNLP,也可以直接用大模型提示词实现:

from transformers import pipeline
generator = pipeline('text2text-generation', model='uer/t5-base-chinese-cls')
input_text = "改写为积极情感:" + "这部电影剧情拖沓,完全浪费时间"
result = generator(input_text, max_length=64)
print(result[0]['generated_text'])

4.4 构建你自己的风格迁移循环

下面演示一个极简的无监督训练思想,使用逆向翻译循环来保持内容:

  1. 使用两个“风格翻译器”:一个将正式→非正式,一个将非正式→正式。
  2. 循环一致性损失:正式非正式正式 应该等于原始句子。
  3. 用风格分类器确保生成的句子确实具有目标风格。

实际代码较长,这里仅给出循环逻辑的伪框架:

# 伪代码,需配合具体模型权重
class StyleCycleTransfer:
    def forward(self, x_style_a):
        # 生成风格B
        x_style_b = self.generator_a2b(x_style_a)
        # 从B还原回A
        x_rec = self.generator_b2a(x_style_b)
        # 内容保持损失
        content_loss = mse_loss(x_style_a, x_rec)
        # 风格判别损失
        style_loss = self.style_classifier(x_style_b, target_label=B)
        return content_loss + style_loss