Формирование предложения: Пунктуальные проверки в Java

Я хочу проверить качество формирования предложения. В частности, я смотрю, если конечный пользователь печатает пробел после пунктуации. Я в порядке с библиотекой NLP или с простым решением для регулярных выражений Java.

Например:

  1. "Привет, меня зовут Том Круз. Мне нравятся фильмы"
  2. "Привет, меня зовут Том Круз. Мне нравятся фильмы"
  3. "Привет, меня зовут Том Круз. Мне нравятся фильмы"

Предложение 1 является идеальным, предложение 2 - плохим, поскольку в нем 1 пунктуация без пробела, а предложение 3 - наихудшее, поскольку ни одна из знаков препинания не заменяется пробелом.

Можете ли вы предложить подход Java к этому? Я попробовал API languagetool, но не сработал.

2 ответа

Решение

Почему бы вам не попробовать категории Patterns и Unicode?

Например:

Pattern pattern = Pattern.compile("\\p{P} ");
        Matcher matcher = pattern.matcher("Hi, my name is Tom Cruise. I like movies");
        while (matcher.find()) {
            System.out.println(matcher.group());
        }

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

, 
. 

(обратите внимание на пробел после запятой и точки)

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

Наконец, для проверки на обратное (знак препинания, за которым не следует пробел):

Pattern otherPattern = Pattern.compile("\\p{P}\\S");
Pattern pattern = Pattern.compile("\\p{P}\\S");

String[] tests = new String[] {
    "Hi, my name is Tom Cruise. I like movies",
    "Hi,my name is Tom Cruise. I like movies",
    "Hi,my name is Tom Cruise.I like movies"
};

int[] results = new int[] { 0, 0, 0 };

for (int i = 0; i < tests.length; i++) {
    Matcher matcher = pattern.matcher(tests[i]);
    while(matcher.find()) {
        results[i] += 1;
    }
    if (results[i] == 0) {
        System.out.println("Sentence " + (i + 1) + " is perfect");
    } else if (results[i] > 1 && results[i] < 3) {
        System.out.println("Sentence " + (i + 1) + " is good");
    } else {
        System.out.println("Sentence " + (i + 1) + " is bad");
    }
}
// now you know how many violations there were on every line.
// do whatever you want with them.
Другие вопросы по тегам