Поскольку вы ищете только количество ключевых слов / фраз, самый простой подход, вероятно, состоит в том, чтобы получить это количество, как вы уже делаете, а затем вычислить количество более широких фраз, из которых вы хочу исключить совпадения. Вычтите количество последних из числа первых.
Общее правило для определения более широких фраз для исключения может быть сложным упражнением в компьютерной лингвистике, но если вы хотите исключить совпавшие фразы, когда им предшествует "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);