Нечеткое сопоставление строк и регулярное выражение

У меня есть вектор предложений, таких как:

example <- c("text text word1 text text word2 text text", ...)

и я пытаюсь определить, какие предложения соответствуют следующим правилам:

  • предложение содержит как "слово1", так и "слово2"
  • "word1" предшествует "word2"
  • между "word1" и "word2" находится от нуля до трех слов

Это можно сделать с помощью обычного регулярного выражения. Однако проблема в том, что "word1" или "word2" могут содержать опечатки (я ожидаю, что расстояние не более 3 для обоих слов вместе). Примерами опечаток могут быть «wrod1», «woord2», «wrd1» и т. Д. Я также хочу сопоставить предложения, содержащие опечатки для этих слов, в пределах ограничения расстояния. Поэтому я пытался использовать agrepl:

agrepl("(?:.*?)\\bword1\\b(?:\\s(?:\\w+\\s){0,3})\\bword2\\b(?:.*?)", example, fixed=FALSE, max=3)

Однако я считаю, что расстояние рассчитывается для всего предложения, а не только для «word1» и «word2», и поэтому я почти никогда не получу совпадений таким образом. Любые предложения о том, как это исправить, или соглашение об использовании / регулярное выражение не лучший инструмент для решения этой проблемы?


person drgxfs    schedule 17.02.2016    source источник
comment
Я вижу здесь большую проблему с устранением неоднозначности опечатки. Как можно быть уверенным, что woord2 не coord2? Как мы можем идентифицировать word экземпляры? Возможным решением было бы, возможно, извлечь пары слов из строки в определенных местах и ​​проверить их с помощью adist.   -  person Wiktor Stribiżew    schedule 17.02.2016
comment
В этом случае мне все равно было бы полезно, если бы совпадение вернуло TRUE, поскольку меня интересует контекст предложения. Это означает, что важная информация, которую мне нужно извлечь из этого, заключается в том, что слово 2 идет после слова 1 (с опечатками или без них) в этом предложении и с учетом других ограничений.   -  person drgxfs    schedule 17.02.2016
comment
Это может быть забавный комментарий, но, возможно, стоит подумать о том, чтобы разбить предложение на слова и оценить выражение для каждого слова, это решит вычислительные проблемы, связанные с вычислением нежелательного расстояния для всего предложения. Затем вы можете оценить объекты среднего уровня, чтобы увидеть, сколько слов было написано правильно или с ошибками, а затем, в зависимости от применяемых критериев, при желании объединить их обратно в одно предложение.   -  person Konrad    schedule 17.02.2016
comment
Что, если вы предположите, что слово - это одно и то же слово с опечатками, если оно начинается и заканчивается одним и тем же символом, но имеет внутренние символы в любом количестве и порядке? Нравится agrepl("\\bw[or]+d\\d+\\b(?:\\S+\\s+){0,3}\\s+w[or]+d\\d+", example, fixed=FALSE, max=3)?   -  person Wiktor Stribiżew    schedule 17.02.2016


Ответы (1)


Это соответствует вашим правилам, однако я не уверен, как будут выглядеть ваши опечатки. Если бы вы могли показать какой-нибудь пример, было бы здорово.

^(?=.*word1\s+(?:\S+\s+){0,3}word2.*$).* ДЕМО

person zolo    schedule 17.02.2016
comment
Да, это соответствует предложению при условии, что в нем нет опечаток. Однако мне все равно придется решить основную проблему, которая связана с орфографическими ошибками в словах word1 или word2. Добавлена ​​дополнительная информация в пост. - person drgxfs; 17.02.2016
comment
У этого подхода есть некоторые проблемы: для регулярного выражения требуется perl=T (это не поддерживается agrep), а . не соответствует новой строке в регулярном выражении PCRE. - person Wiktor Stribiżew; 17.02.2016