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

如何基于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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:30:56