如何在PMML字符串中去除特殊字符?自定义函数实现咨询
嘿,我来帮你搞定PMML里去除特殊字符的需求~
在PMML中去除特殊字符的有效方法
首先得明确:PMML标准里并没有内置你设想的removeSpecialCharacters函数,但我们可以用PMML原生支持的正则表达式替换函数来实现同样的效果,这是完全符合规范的做法。
实现思路
PMML 4.3及以上版本支持regexReplace字符串函数,我们可以通过它匹配目标特殊字符并替换为空字符串,从而达到“去除”的目的。
适配你场景的PMML代码示例
针对你给出的字段匹配逻辑,修改后的合规PMML片段如下:
<DerivedField name="stringmatch" datatype="string" optype="categorical"> <Apply function="if"> <Apply function="equal"> <!-- 对string1去除特殊字符 --> <Apply function="regexReplace"> <FieldRef field="string1"/> <Constant datatype="string">[^a-zA-Z0-9\s]</Constant> <Constant datatype="string"></Constant> </Apply> <!-- 对string2去除特殊字符 --> <Apply function="regexReplace"> <FieldRef field="string2"/> <Constant datatype="string">[^a-zA-Z0-9\s]</Constant> <Constant datatype="string"></Constant> </Apply> </Apply> <Constant datatype="string">match</Constant> <Constant datatype="string">no_match</Constant> </Apply> </DerivedField>
关键细节说明
- 正则表达式自定义:示例中的
[^a-zA-Z0-9\s]表示匹配所有非字母、数字、空格的字符。如果你需要保留其他字符(比如下划线、连字符),可以修改正则为[^a-zA-Z0-9\s_-],按需调整即可。 - 版本兼容性:
regexReplace是PMML 4.3及以后版本才支持的函数,如果你使用的是更早版本,建议升级到符合标准的版本;实在无法升级的话,可能需要依赖特定工具的扩展函数,但这会降低PMML的通用性。 - 参数顺序注意:
regexReplace的参数顺序是「待处理字符串 → 正则表达式 → 替换后的字符串」,别搞反了。
进阶扩展
如果需要更精细化的字符过滤(比如只保留中文字符+基础符号),可以调整正则表达式,例如用[^\u4e00-\u9fa5a-zA-Z0-9\s]来匹配并去除非中文字符、字母、数字、空格的内容。
内容的提问来源于stack exchange,提问作者apriori




