Как мне отменить фразу в коде сгенерированного регулярного выражения? - PullRequest
0 голосов
/ 25 апреля 2019

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

Данные:

Мне интересно делать что-то приятное и веселое. я не интересует все, что не волнует. Пожалуйста, держите меня интересно.

Пример:

\b(interested|fun|enjoyable|exciting)\b

Количество будет: заинтересованным (3) + веселым (1) + приятным (1) + захватывающим (1) Всего: 6

Я хочу игнорировать определенные фразы, которые, я не думаю, должны быть включены в счет. Это может быть что угодно. В этом случае я хочу исключить слова «не заинтересованы» и «не заинтересованы».

Сложность в том, что я сгенерировал это в коде, поэтому я хочу, чтобы процесс был довольно простым и надежным.

1 Ответ

1 голос
/ 25 апреля 2019

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

Общее правило для определения более широких фраз для исключения может быть сложным упражнением в компьютерной лингвистике, но если вы хотите исключить совпавшие фразы, когда им предшествует "not", то это относительно просто:

String keywordsSubPattern = "\b(interested|fun|enjoyable|exciting)\b";
String negatedKeywordsSubPattern = "\bnot\s+" + keywordsSubPattern;

int keywordCount = countOfMatchesToPattern(keywordsSubPattern)
        - countOfMatchesToPattern(negatedKeywordsSubPattern);

Вы могли бы сделать это немного более аккуратно, вставив отрицательное утверждение lookbehind в шаблон ключевого слова, чтобы оно не соответствовало изначально отрицательным версиям, но утверждения lookbehind нельзя использовать с шаблонами, которые соответствуют переменной длины последовательности. \bnot\s+ - это такой шаблон из-за квантификатора +. Но если вы хотите исключить только ключевые слова, которым предшествует «not» и ровно один пробельный символ, вы можете сделать что-то вроде этого:

String keywordsSubPattern = "\b(interested|fun|enjoyable|exciting)\b";
String unnegatedKeywordsSubPattern = "(?<!\bnot\s)" + keywordsSubPattern;

int keywordCount = countOfMatchesToPattern(unnegatedkeywordsSubPattern);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...