Соответствующий список слов в любом порядке, но только если они соседние / разделены максимум n словами - PullRequest
0 голосов
/ 25 марта 2020

Мне удалось найти совет только о том, как сопоставить количество подстрок в любом порядке или разделенных максимум n словами (не обоими одновременно).

Мне нужно реализовать условие в python, где несколько терминов появляются в любом порядке, но разделены, например, максимум одним словом или рядом. Я нашел способ реализовать часть «в любом порядке», используя обходные пути, но он не учитывает смежные / разделенные не более чем одним словом проблемы. Для иллюстрации:

re.search("^.*(?=.*word1\s*\w*\sword2)(?=.*\w*)(?=.*word3\w*).*$", "word1 filler word2 and word3")

Это должно совпадать с "word1 word2" или "word1 max1word word2" и "word3*" в любом порядке, разделенными одним словом, как в данном случае - что и происходит. Тем не менее, он также соответствует строке, где термины разделены двумя или более словами, что не следует. Я попытался сделать это следующим образом:

re.search("^.*(?=\s?word1\s*\w*\sword2)(?=\s?\w*)(?=\s?word3\w*).*$", "word1 word2 word3")

, надеясь, что использование \s? в начале каждого термина в скобках вместо .* исправит это, но это не работает вообще (нет совпадения, даже когда должен быть один).

Кто-нибудь знает решение?

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

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Я пытаюсь определить патенты, связанные с ИИ, используя поиск по ключевым словам в рефератах и ​​заголовках

В этом случае я бы вообще не рекомендовал регулярные выражения.

Вместо этого

  • Используйте библиотеку, которая обеспечивает stemming .

    Вот как ваш код знает, что это "программа", "программирование", "программист" и др. c. связаны друг с другом и гораздо более надежны, чем решение с регулярными выражениями, и с большей вероятностью будут семантически точными.

  • Используйте библиотеку, которая может генерировать n-граммы.

    N-граммы по сути являются кортежами последующих слов из текста. Вы можете сделать вывод, что слова, встречающиеся в одном кортеже, с большей вероятностью будут связаны друг с другом.

  • Используйте библиотеку стоп-слов.

    Это слова, которые настолько распространены, что вряд ли могут дать значение, например «и».

Собираем все это вместе, 3 грамма для

индуктивное случайное слово logi c и программирование

будет выглядеть примерно так:

  • (индуктивный, randomword, logi c)
  • (randomword, logi c, программа)

Применяя это к произвольной статье, вы можете затем искать n-граммы с любыми терминами, какими бы вы ни были sh. Отрегулируйте n, если обнаружите, что у вас слишком много ложных негативов или позитивов.

Это не место для полного урока, но библиотека вроде NLTK предоставляет все из этих функций.

0 голосов
/ 25 марта 2020

Ну, ваш вопрос не совсем понятен, но вы можете попробовать это, предполагая, что word1 , word2 и word3 являются известными словами

(?:word1(\s\w+)?\sword2)|(?:word2(\s\w+)?\sword1)|word3

Демо

...