Разделить строку на предложения
Я написал этот фрагмент кода, который разбивает строку и сохраняет ее в массиве строк: -
String[] sSentence = sResult.split("[a-z]\\.\\s+");
Однако я добавил [a-z], потому что мне хотелось иметь дело с некоторой проблемой сокращения. Но тогда мой результат проявляется так: -
Кроме того, когда Эверетт пытался наставлять их в основной математике, они оказались невосприимчивыми
Я вижу, что теряю шаблон, указанный в функции split. Это нормально для меня, чтобы потерять период, но потеря последней буквы слова нарушает его значение.
Может ли кто-нибудь помочь мне с этим, и, кроме того, кто-нибудь может помочь мне справиться с сокращениями? Например, поскольку я разбил строку на основе периодов, я не хочу потерять сокращения.
Ответы
Ответ 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 существует очень простое руководство по Обнаружение приговоров.