【问题标题】:Regex (with lookaround) optimization正则表达式(带环视)优化
【发布时间】:2014-06-08 16:43:48
【问题描述】:

我正在尝试从文本中提取实体,并希望有一个简单的机制(直到我们部署 NLP 解决方案)来避免否定。例如: 我要找

患者有犬炎病史

但要避免

无犬瘟病史

也要避免

犬瘟的家族史

为此,我使用多个lookbehinds 使我的正则表达式看起来像这样:

((?<!(?i)no.{1,25}|denies.{1,35}|family.{1,35}|father.{1,10}|mother.{1,10})(?-i)${stringToMatch})

我尝试将 \b 添加到负面的lookbehind中,认为这会减少处理器将拥有的入口点,但这实际上使性能变得更糟。

问题是 - 这似乎表现得很糟糕。

【问题讨论】:

    标签: regex regex-lookarounds


    【解决方案1】:

    你可以做什么:

    • 使用\b 来避免错误匹配(尤其是“no”一词)
    • 删除无用的(?-i)(内联修饰符仅适用于它所在的组。)
    • 在可以减少.{m,n} 的性能影响时进行分解

    您获得:

    (?&lt;!(?i)\b(?:no\b.{1,25}|(?:denies|family)\b.{1,35}|(?:fa|mo)ther\b.{1,10})\b)history of Cynicisimitis\b

    你可以尝试什么:

    • 使用惰性量词代替贪婪量词:\bno\b.{1,25}?

    • 将lookbehind放在stringToMatch之后:

      \bhistory of Cynicisimitis\b(?&lt;!(?i)\b(?:no\b.{1,25}|(?:denies|family)\b.{1,35}|(?:fa|mo)ther\b.{1,10})\bhistory of Cynicisimitis)

    • 使用基本字符串搜索(比正则表达式快得多)查找 stringToMatch 的偏移量,提取从 offset-50offset+stringToMatch.length+1 的子字符串,并且仅在对子字符串测试您的模式之后。

    【讨论】:

    • Tnx 的答案,我正在尝试。很快就会更新。
    【解决方案2】:

    好吧,在阅读了 Casimir(.*) 的答案后,我最终得到了这个正则表达式 -

    (?<!(?i)\\bno\\b.{1,40})(?<!(?i)denie[sd].{1,50})(?<!(?i)family.{1,40})(?<!(?:(?i)fa|mo)ther.{1,20})(?<!(?:(?i)fr|m|p)aternal.{1,20})(${stringToMatch})"
    

    基本上,我将单一的、长期的负面环视分解为几个负面的环视。 这是提高性能最多的步骤,处理速度提高了约 30%。

    如果我有更多进展,我会更新。

    【讨论】:

      猜你喜欢
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多