2016-02-17 3 views
3

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

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

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

  • предложение содержит как " word1" и „word2“
  • „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», и поэтому я почти никогда не получить какие-либо матчи в этом случае. Любые предложения о том, как исправить это, или agrepl/regex не лучший инструмент для этой проблемы?

+0

Я вижу большую проблему здесь с опечаткой неоднозначностью. Как можно быть уверенным, что 'woord2' не' coord2'? Как мы можем идентифицировать экземпляры 'word'? Возможным решением может быть, пожалуй, извлечение пар слов из строки в определенных местах и ​​проверка их с помощью «adist». –

+0

В этом случае мне все же было бы полезно, если бы совпадение вернуло 'TRUE', так как меня интересует контекст предложения. Смысл, соответствующая информация, которую мне нужно извлечь из этого, заключается в том, что слово «word2» появилось после слова «word1» (с или без опечаток для) для этого предложения и с учетом других ограничений. – drgxfs

+1

Это может быть женский комментарий, но, возможно, стоит подумать о том, чтобы сломать предложение на слова и оценить выражение для каждого слова, это решило бы вычислительные проблемы, связанные с вычислением нежелательных расстояний для всего предложения. Затем вы можете оценить объекты среднего уровня, чтобы увидеть, сколько слов написано правильно или неправильно написано, и затем, в зависимости от применяемых критериев, объедините его обратно к одному предложению по желанию. – Konrad

ответ

2

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

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

+0

Да, это соответствует предложению при условии, что у него нет опечаток. Я все равно должен решить основную проблему, хотя, имея дело с орфографическими ошибками для word1 или word2. Добавлено больше информации о сообщении. – drgxfs

+1

Есть некоторые проблемы с этим подходом: регулярное выражение требует 'perl = T' (это не поддерживается' agrep'), а '.' не соответствует новой строке в регулярном выражении PCRE. –

 Смежные вопросы

  • Нет связанных вопросов^_^