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

如何使用T5模型实现文本去噪及掩码文本填充?

用HuggingFace T5实现无标签文本掩码填充的可行方案

T5预训练采用的是span corruption任务(片段替换),而非BERT类模型的单token掩码,直接用[MASK]标记不符合T5的输入格式,这是你得到无意义输出的核心原因。以下是适配T5的无标签文本填充实现方案:

核心步骤说明

  1. 转换输入标记:将原文本中的[MASK]按顺序替换为T5专属的特殊标记<extra_id_0>、<extra_id_1>...,每个待填充位置对应唯一的extra_id。
  2. 适配T5任务格式:给输入文本添加任务指令前缀(如"fill the blanks: "),匹配T5预训练时的任务范式,提升生成效果。
  3. 模型生成与结果映射:用T5ForConditionalGeneration生成填充内容,再将生成结果按extra_id顺序替换回原文本的[MASK]位置。

完整代码实现

from transformers import T5Tokenizer, T5ForConditionalGeneration

# 加载预训练模型和tokenizer(可根据需求替换为t5-base/t5-large)
model_name = "t5-small"
tokenizer = T5Tokenizer.from_pretrained(model_name)
model = T5ForConditionalGeneration.from_pretrained(model_name)

# 待填充的掩码文本
my_masked_text = [
    "The kid went to the [MASK]",
    "The dog likes [MASK] and also [MASK]"
]

def fill_mask_with_t5(masked_texts):
    filled_results = []
    for text in masked_texts:
        # 1. 替换[MASK]为T5的extra_id标记,按顺序编号
        mask_count = text.count("[MASK]")
        temp_text = text
        for i in range(mask_count):
            temp_text = temp_text.replace("[MASK]", f"<extra_id_{i}>", 1)
        # 2. 添加任务指令前缀
        input_text = f"fill the blanks: {temp_text}"
        
        # 3. 编码输入
        inputs = tokenizer(input_text, return_tensors="pt", padding=True, truncation=True)
        # 4. 生成填充内容
        outputs = model.generate(
            **inputs,
            max_length=50,
            num_beams=5,  # 束搜索提升生成质量
            early_stopping=True
        )
        # 5. 解码生成结果,保留特殊token用于分割
        decoded_output = tokenizer.decode(outputs[0], skip_special_tokens=False)
        
        # 6. 提取每个extra_id对应的填充内容,映射回原文本
        fill_contents = []
        parts = decoded_output.split("<extra_id_")
        for i in range(1, mask_count+1):
            content = parts[i].split(">")[0].strip()
            fill_contents.append(content)
        
        # 替换原文本的[MASK]
        filled_text = text
        for content in fill_contents:
            filled_text = filled_text.replace("[MASK]", content, 1)
        filled_results.append(filled_text)
    return filled_results

# 执行填充并打印结果
results = fill_mask_with_t5(my_masked_text)
for res in results:
    print(res)

关键细节提示

  • 模型选择:t5-small速度快适合测试,若追求精度可换用t5-base或t5-large,但推理速度会下降。
  • 生成参数调整:num_beams控制束搜索宽度,值越大生成质量越高但速度越慢;max_length需根据输入文本长度调整,避免截断内容。
  • 特殊标记处理:T5的extra_id系列标记是模型预训练时的专用标记,必须严格按顺序替换,否则模型无法正确识别待填充位置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 22:43:16