如何基于Helsinki-NLP预训练模型保留PII及组织术语不翻译
基于Helsinki-NLP预训练模型保留PII与专属术语的翻译管道实现方案
因为不涉及模型微调,核心思路采用**「替换-翻译-还原」**的流水线模式,通过预处理屏蔽目标内容、后处理恢复的方式实现需求,具体步骤如下:
1. 预处理:识别并替换需保留的内容
1.1 识别PII数据
用正则表达式匹配常见PII类型(可根据组织实际格式调整):
- 邮箱:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,} - 手机号:国内示例
1[3-9]\d{9},国际号可扩展正则规则 - 地理数据:可维护组织专属地址/地名列表,或用轻量实体识别工具(如spaCy基础模型)批量识别
1.2 识别组织专属术语
维护一个术语字典,键为术语原文,值为唯一占位符(如TERM_001),按术语长度从长到短匹配替换,避免短术语匹配长术语的子串。
1.3 执行替换并记录映射
把识别到的PII和术语替换为占位符,同时生成替换映射表(占位符→原始内容),用于后续还原。
示例代码(Python):
import re # 定义PII正则规则 email_pattern = re.compile(r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}') phone_pattern = re.compile(r'1[3-9]\d{9}') # 组织专属术语字典 org_terms = {"XX业务平台": "TERM_001", "总部园区": "TERM_002"} def preprocess_text(text): replace_map = {} count = 1 # 替换邮箱 for match in email_pattern.findall(text): placeholder = f"__PII_EMAIL_{count:03d}__" replace_map[placeholder] = match text = text.replace(match, placeholder) count += 1 # 替换手机号 for match in phone_pattern.findall(text): placeholder = f"__PII_PHONE_{count:03d}__" replace_map[placeholder] = match text = text.replace(match, placeholder) count += 1 # 替换专属术语 sorted_terms = sorted(org_terms.keys(), key=len, reverse=True) for term in sorted_terms: if term in text: placeholder = org_terms[term] replace_map[placeholder] = term text = text.replace(term, placeholder) return text, replace_map
2. 调用Helsinki-NLP模型翻译
直接用transformers库加载预训练模型翻译预处理后的文本,由于占位符为无意义的特殊格式字符串,模型会大概率保留原内容。
示例代码:
from transformers import MarianMTModel, MarianTokenizer # 加载中英翻译模型(按需调整语言对) model_name = "Helsinki-NLP/opus-mt-zh-en" tokenizer = MarianTokenizer.from_pretrained(model_name) model = MarianMTModel.from_pretrained(model_name) def translate_text(preprocessed_text): inputs = tokenizer(preprocessed_text, return_tensors="pt", padding=True) outputs = model.generate(**inputs) return tokenizer.decode(outputs[0], skip_special_tokens=True)
3. 后处理:还原原始内容
根据预处理阶段的映射表,把翻译文本中的占位符替换回原始的PII和术语。
示例代码:
def postprocess_text(translated_text, replace_map): for placeholder, original in replace_map.items(): translated_text = translated_text.replace(placeholder, original) return translated_text
4. 整合流水线
把三步整合为完整的翻译管道:
def translate_pipeline(text): preprocessed, replace_map = preprocess_text(text) translated = translate_text(preprocessed) return postprocess_text(translated, replace_map) # 测试示例 test_text = "请将这份报告发送到user@example.com,抄送给13812345678,涉及XX业务平台的内容需同步到总部园区。" print(translate_pipeline(test_text))
额外注意事项
- 若出现占位符被模型翻译的情况,可给占位符添加特殊前缀(如
__),降低模型识别概率 - 地理数据若为动态未收录内容,可结合spaCy的实体识别模块自动提取后再替换
- 专属术语字典需定期更新,确保覆盖最新业务术语
内容的提问来源于stack exchange,提问作者chaitu
相关产品推荐
相关产品推荐

