Строка разделения в предложения

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

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

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

Кроме того, когда Everett пытался сообщить им в базовой математике, они доказали unresponsiv

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

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

23
задан Pshemo 22 January 2016 в 18:48
поделиться

3 ответа

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

Лучше использовать 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));
}

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

  1. Это тест.
  2. Это T.L.A. тестовое задание.
  3. Теперь с доктором в нем.
52
ответ дан 29 November 2019 в 01:01
поделиться

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

На веб-сайте LingPipe есть очень простой учебник по Обнаружению предложений .

4
ответ дан 29 November 2019 в 01:01
поделиться

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

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. и т. д. И есть предложения, не оканчивающиеся точкой!

11
ответ дан 29 November 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: