2010-04-21 3 views
21

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

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

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

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

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

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

ответ

45

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

Лучшим подходом является использование 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. Теперь с доктором в нем.
+6

Когда я использую это предложение - «У моего друга, мистера Джонса, есть новая собака». Это ломается после г-на Это происходит из-за капитализации Джонса. Вы знаете, как это сделать? В противном случае BreakIterator отлично! – nbz

11

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

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. 

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

+0

Благодарим вас за ответ. –

+1

Это не удастся в 9.3% предложений. И предложения, которые ... используют многоточие. И предложения с typo.s в них. И так далее. Независимо от того, что вы делаете, ваш код будет делать ошибки, с точки зрения человека. –

4

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

На сайте LingPipe существует очень простое руководство по обучению на Sentence Detection.

+0

Привет, я проверил учебник. Это казалось идеальным, однако я не могу понять, как использовать его с затмением.Не могли бы вы мне помочь? –