如何修改正则代码删除问候语后的单词,完成数据匿名化任务?
德语客户邮件/对话的PII匿名化:问候语后姓名移除方案
我手头有德语客户的邮件和对话记录,需要完成数据匿名化任务——移除其中的个人可识别信息(PII),但要保留对话内容用于后续分析。文本里的典型PII场景比如:
"Hello Mr. Smith"、"Dear Mr Smith"、"Hello Lisa"
我评估过三种解决方案:
- 方案A:编译姓名列表:不清楚所有可能出现的姓名,也无法访问CRM数据库,手动整理姓名列表加入停用词库不仅耗时,还容易遗漏出错,不可行。
- 方案B:词性标注(PoS)/命名实体识别(NER):这类工具会误删产品名称、地点信息,而这些内容是我需要保留的,所以NER也不适用。
- 方案C:正则表达式(regex):思路是匹配问候语(比如"Dear"),然后删除后续的姓名。我参考过一段示例代码,但这段代码假设知道姓名后的固定单词,而我没有这个前提:
import re print re.sub(r'(?<=copy )(.*)(?=from)', '', "copy table values from 'a.dat';")
我想知道:怎么修改这段代码实现删除问候语后的姓名?是否需要先对字符串做分词?也希望能提供基于pandas str.replace的解决方案。
正则表达式修改方案
不需要提前分词,我们可以通过匹配问候语+后续的姓名部分(覆盖德语/英语的称呼格式,比如Mr./Ms.、Frau/Herr、直接名字的情况),用正则替换掉姓名部分,既保留问候语,又完成匿名化。
基础Python re实现
针对问候语场景,正则可以这样写:
import re # 匹配常见问候语(含德语、英语),可根据实际场景补充 pattern = r'(Hello|Dear|Sehr geehrter|Sehr geehrte|Liebe|Lieber|Guten Tag)\s+(Mr\.|Ms\.|Frau|Herr)?\s*([\w-]+)\s*' def anonymize_greeting(text): # 替换为「问候语 + 前缀(如果有) + [匿名用户]」,可按需调整格式 return re.sub(pattern, r'\1 \2[匿名用户] ', text) # 测试示例 test_texts = [ "Hello Mr. Smith, I want to know about your product.", "Dear Lisa, thanks for your reply.", "Sehr geehrter Herr Müller, ich habe eine Frage zum Produkt.", "Liebe Anna-Schmidt, vielen Dank für Ihre Nachricht." ] for text in test_texts: print(anonymize_greeting(text))
正则说明:
(Hello|Sehr geehrter|...):匹配常见问候语,可根据德语场景补充更多(比如Guten Morgen)\s+(Mr\.|Frau|Herr)?:匹配可选的称呼前缀(有的问候语后直接跟名字)[\w-]+:匹配姓名部分,支持带连字符的姓名- 替换时保留问候语和前缀,将姓名替换为统一的匿名标识
pandas str.replace批量处理方案
如果数据存在pandas DataFrame中,可以直接用str.replace批量处理:
import pandas as pd # 构造测试数据 df = pd.DataFrame({ 'conversation': [ "Hello Mr. Smith, I want to know about your product.", "Dear Lisa, thanks for your reply.", "Sehr geehrter Herr Müller, ich habe eine Frage zum Produkt." ] }) # 应用正则替换 pattern = r'(Hello|Dear|Sehr geehrter|Sehr geehrte|Liebe|Lieber)\s+(Mr\.|Ms\.|Frau|Herr)?\s*([\w-]+)\s*' df['anonymized_conversation'] = df['conversation'].str.replace(pattern, r'\1 \2[匿名用户] ', regex=True) # 查看结果 print(df[['conversation', 'anonymized_conversation']])
补充提示
- 如果姓名有特殊字符(比如德语变音字母),可以把
[\w-]+替换为[\wäöüÄÖÜß-]+适配德语姓名 - 可根据实际业务场景,扩展问候语的匹配列表,确保覆盖所有可能的开头格式
内容的提问来源于stack exchange,提问作者Simone
相关产品推荐
相关产品推荐

