Оптимизация 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% быстрее обработки.
Я буду обновлять, если я сделаю больше прогресса.