Разделить строку на предложения - PullRequest
21 голосов
/ 22 апреля 2010

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

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

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

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

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

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

Ответы [ 3 ]

50 голосов
/ 22 апреля 2010

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

Лучше всего использовать 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. Это Т.Л.А. тест.
  3. Теперь с доктором.
11 голосов
/ 22 апреля 2010

Будет трудно заставить работать регулярное выражение во всех случаях, но чтобы решить вашу непосредственную проблему, вы можете использовать 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. и т. Д. ... И есть также предложения, которые не заканчиваются точками!

4 голосов
/ 22 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...