tf.keras TextVectorization自定义标准化报Invalid pattern错误
问题根因
tf.strings.regex_replace 底层遵循RE2正则语法规则,你当前代码里直接将(、)、[、]、.这类正则元字符作为匹配模式传入,没有做转义处理:
(、)在正则中是分组捕获的标记符,单独传入(时正则引擎会将其识别为分组起点,找不到对应的闭合)就会抛出你看到的missing )报错[、]是正则字符集的标记符,.是匹配任意单字符的通配符,不转义的话要么触发正则语法错误,要么匹配逻辑完全偏离预期(比如.会匹配所有字符,而非仅匹配英文句号)
修复方案
对所有正则元字符做转义处理:由于Python字符串中反斜杠本身是转义符,正则转义用的\需要写为双反斜杠\\,修正后的标准化函数如下:
def code_standaridization(input_data): """ Helps with finding correct embedding. """ input_data = tf.strings.regex_replace(input_data, "-", " - ") input_data = tf.strings.regex_replace(input_data, "_", " _ ") input_data = tf.strings.regex_replace(input_data, "\\(", " ( ") input_data = tf.strings.regex_replace(input_data, "\\)", " ) ") input_data = tf.strings.regex_replace(input_data, "\\{", " { ") input_data = tf.strings.regex_replace(input_data, "\\}", " } ") input_data = tf.strings.regex_replace(input_data, "\\[", " [ ") input_data = tf.strings.regex_replace(input_data, "\\]", " ] ") input_data = tf.strings.regex_replace(input_data, '"', ' " ') input_data = tf.strings.regex_replace(input_data, "'", " ' ") input_data = tf.strings.regex_replace(input_data, "\\.", " . ") input_data = tf.strings.regex_replace(input_data, ",", " , ") return input_data
优化写法
你可以把所有需要拆分的特殊字符整合到同一个正则字符集中,单次替换完成所有处理,减少重复的函数调用,执行效率更高:
def code_standaridization(input_data): """ Helps with finding correct embedding. """ # 正则字符集内捕获所有目标特殊字符,替换为前后带空格的格式 input_data = tf.strings.regex_replace(input_data, "([-_(){}[\\]\"'.,])", r" \1 ") return input_data
注意:字符集内的
]必须放在转义后靠前位置,避免被正则引擎识别为字符集的闭合标记,触发语法错误。
内容的提问来源于stack exchange,提问作者somethingnew
相关产品推荐
相关产品推荐

