Оптимизация Regex (с поиском)

Я пытаюсь извлечь объекты из текста и хотел бы иметь простой механизм (пока мы не развернем решение NLP), чтобы избежать отрицания. например: я хотел бы найти

Пациент имеет историю циницимита

Но избегайте

Нет истории Cynicisimitis

а также избегать

Семейный анамнез циницисимита

С этой целью я использую несколько lookbehinds, чтобы мое регулярное выражение выглядело так:

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

Я попытался добавить \ b к отрицательному виду, думая, что это уменьшит точки входа, которые будет иметь процессор, но на самом деле это сделало производительность еще хуже.

Проблема в том, что это выглядит очень плохо.

2 ответа

Решение

Что ты можешь сделать:

  • с помощью \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

То, что вы можете попробовать:

  • используя ленивые квантификаторы вместо жадных квантификаторов: \bno\b.{1,25}?

  • поместив вид сзади после stringToMatch:

    \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 и только после проверки вашего шаблона на подстроки.

Что ж, после прочтения ответа Казимира (.*) Я получил следующее регулярное выражение -

(?<!(?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% быстрее обработки.

Я буду обновлять, если я сделаю больше прогресса.

Другие вопросы по тегам