Подтвердить что ты не робот

Разделить строку на предложения

Я написал этот фрагмент кода, который разбивает строку и сохраняет ее в массиве строк: -

String[] sSentence = sResult.split("[a-z]\\.\\s+");

Однако я добавил [a-z], потому что мне хотелось иметь дело с некоторой проблемой сокращения. Но тогда мой результат проявляется так: -

Кроме того, когда Эверетт пытался наставлять их в основной математике, они оказались невосприимчивыми

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

Может ли кто-нибудь помочь мне с этим, и, кроме того, кто-нибудь может помочь мне справиться с сокращениями? Например, поскольку я разбил строку на основе периодов, я не хочу потерять сокращения.

4b9b3361

Ответ 1

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

Лучшим подходом является использование BreakIterator, настроенного с правильной локалью.

BreakIterator iterator = BreakIterator.getSentenceInstance(Locale.US);
String source = "This is a test. This is a T.L.A. test. Now with a Dr. in it.";
iterator.setText(source);
int start = iterator.first();
for (int end = iterator.next();
    end != BreakIterator.DONE;
    start = end, end = iterator.next()) {
  System.out.println(source.substring(start,end));
}

Выдает следующий результат:

  • Это тест.
  • Это T.L.A. тест.
  • Теперь с доктором в нем.

Ответ 2

Будет сложно получить регулярное выражение для работы во всех случаях, но для устранения вашей непосредственной проблемы вы можете использовать lookbehind:

String sResult = "This is a test. This is a T.L.A. test.";
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+");

Результат:

This is a test
This is a T.L.A. test.

Обратите внимание, что есть аббревиатуры, которые не заканчиваются прописными буквами, такими как abbrev., Mr. и т.д. И есть также предложения, которые не заканчиваются в периоды!

Ответ 3

Если вы можете, используйте инструмент обработки естественного языка, например LingPipe. Есть много тонкостей, которые очень трудно поймать с использованием регулярных выражений, например ( например:-)), Г-н., аббревиатуры, эллипсис (...) и т.д.

В веб-сайте LingPipe существует очень простое руководство по Обнаружение приговоров.