2014-06-08 60 views
0

我試圖從文本中拉出實體,並希望有一個簡單的機制(直到我們部署一個NLP解決方案)以避免否定。例如: 我想找到正則表達式(與環顧)優化

病人Cynicisimitis

的歷史,但避免

Cynicisimitis

的無病史

,也避免

Cynicisimitis

家族史爲此我使用多個lookbehinds讓我的正則表達式是這樣的:

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

我嘗試添加\ B向負回顧後,認爲這將減少處理器將擁有的入口點,但這實際上使性能更差。

問題是 - 這看起來表現非常糟糕。

回答

1

你可以做什麼:

  • 使用\b以避免錯誤匹配(尤其是與「不」字)
  • 在刪除無用(?-i)(內嵌修飾符僅適用於它在哪裏的組。)
  • 上分解時有可能減少.{m,n}

的性能影響您獲得:

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

你可以嘗試什麼:

  • 使用懶惰量詞,而不是貪婪量詞:把回顧後的stringToMatch後\bno\b.{1,25}?

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

  • 使用基本字符串搜索(即遠遠超過正則表達式)來查找stringToMatch的偏移量,將子字符串從offset-50提取到offset+stringToMatch.length+1,並且僅在子字符串上測試模式之後提取子字符串。

+0

Tnx爲答案,我正在嘗試。將盡快更新。 – YaDa

0

那麼,看完卡西米爾(。*)的回答,我結束了這個正則表達式 -

(?<!(?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%。

我會更新,如果我有更多的進展。