首页 > 解决方案 > 使用正则表达式从 Tensorflow 2 中的 tf.Tensor 中提取字符串?

问题描述

我将我的 tf.keras 模型与 TF2 中的签名一起保存,以便与 TFServing 一起使用。在签名函数中,我想用正则表达式提取一些实体。

我的输入是数据类型为 tf.string 的张量。我不能在其中使用 numpy(),导致“张量对象没有属性 numpy”。tf.py_function() 在 TFServing 中也不可用。

所以我只剩下张量流操作了。我将如何提取带有模式的子字符串?

@tf.function
def serve_fn(input):
    # Returns Today's date is  . Tomorrow is another day. But I need 11/2020
    output = tf.strings.regex_replace("Today's date is 11/2020. Tomorrow is another day.", pattern=r'[\d]{2}/[\d]{4}', rewrite=" ")
    
    # model inference ...

    return {'output': output}

这将返回内容为“今天的日期。明天是另一天”的张量。

只返回日期的模式会是什么样子?如果我没记错的话, tf.strings.regex_replace 使用不支持前瞻的 re2。是否有其他解决方案?

提前致谢

标签: regextensorflowtensorflow-serving

解决方案


您可以使用

 tf.strings.regex_replace("Today's date is 11/2020. Tomorrow is another day.", pattern=r'.*?(\d{2}/\d{4}).*', rewrite=r'\1')

请参阅RE2 正则表达式演示。细节:

  • .*?(\d{2}/\d{4}).*匹配除换行符之外的 0 个或多个字符,尽可能少,将任意两位数(\d{2}/\d{4}) 捕获/到第 1 组,然后捕获任意四位数,然后仅将行的其余部分与.*(贪婪地,尽可能多)匹配
  • \1是对第 1 组值的括号引用。参见regex_replace参考regex_rewrite支持反斜杠转义数字(\1to \9)可以插入匹配对应括号组的文本。 ”。

推荐阅读