如何使用T5模型实现文本去噪及掩码文本填充?
用HuggingFace T5实现无标签文本掩码填充的可行方案
T5预训练采用的是span corruption任务(片段替换),而非BERT类模型的单token掩码,直接用[MASK]标记不符合T5的输入格式,这是你得到无意义输出的核心原因。以下是适配T5的无标签文本填充实现方案:
核心步骤说明
- 转换输入标记:将原文本中的
[MASK]按顺序替换为T5专属的特殊标记<extra_id_0>、<extra_id_1>...,每个待填充位置对应唯一的extra_id。 - 适配T5任务格式:给输入文本添加任务指令前缀(如
"fill the blanks: "),匹配T5预训练时的任务范式,提升生成效果。 - 模型生成与结果映射:用
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
相关产品推荐
相关产品推荐

