Spark NLP Normalizer正则功能异常 误删除变音符号问题咨询
问题根因
- Spark NLP底层基于Java正则引擎实现,默认正则元字符
\w仅匹配ASCII范围内的大小写字母、数字、下划线,无法识别带变音符号的非ASCII拉丁字符(如德语的Ä、ü、ö等),你配置的排除规则[^\w -]会将这类变音字符判定为待清理内容,因此出现Äpfel变为pfel、Müller变为Mller的问题。 - 原清理规则中
-(?!\w)|(?<!\w)-用于过滤非单词中间的横杠,但因为\w不识别变音字符,Müller的首字符ü会被判定为非单词字符,最终导致Reutter-Müller中间的合法横杠被误删。
修复方案
将Normalizer组件的清理规则中的\w替换为可匹配所有Unicode字母的正则符\p{L}即可,修正后的代码如下:
normalizer = Normalizer() \ .setInputCols(["column_token"]) \ .setOutputCol("column_normalized")\ .setCleanupPatterns(["[^\p{L}0-9 -]|_|-(?!\p{L})|(?<!\p{L})-"])\ .setLowercase(True)
调整说明:
- 用
\p{L}替代原规则中的所有\w,兼容所有带变音符号的Unicode字母 - 规则中保留了
0-9用于匹配数字,若业务不需要保留数字可直接删除该部分 - 如果你不需要将输出统一转为小写,删除
.setLowercase(True)配置即可保留原文本的大小写格式
验证效果
针对你提供的输入示例,修正后输出完全匹配预期:
Ich esse gerne Äpfel vom Biobauernhof Reutter-Müller die schmecken besonders gut
内容的提问来源于stack exchange,提问作者jonas
相关产品推荐
相关产品推荐

