Как разбить текст на предложения - PullRequest
7 голосов
/ 07 декабря 2010

Я пытаюсь разбить абзац на предложения. Вот мой код:

import java.util.*;

public class StringSplit {
 public static void main(String args[]) throws Exception{
     String testString = "The outcome of the negotiations is vital, because the current tax levels signed into law by President George W. Bush expire on Dec. 31. Unless Congress acts, tax rates on virtually all Americans who pay income taxes will rise on Jan. 1. That could affect economic growth and even holiday sales.";
     String[] sentences = testString.split("[\\.\\!\\?]");
     for (int i=0;i<sentences.length;i++){  
         System.out.println(i);
      System.out.println(sentences[i]);  
     }  
 }
}

Обнаружены две проблемы:

  1. Код разбивается в любое время, когда он приходит к символу точки ("."), Даже когда это фактически одно предложение. Как мне это предотвратить?
  2. Каждое предложение, которое разделено, начинается с пробела. Как удалить лишнее пространство?

Ответы [ 7 ]

14 голосов
/ 07 декабря 2010

Упомянутая вами проблема - это проблема НЛП (обработка естественного языка). Можно написать грубый механизм правил, но он может не масштабироваться для поддержки полного текста на английском языке.

Чтобы получить более глубокое понимание и библиотеку Java, перейдите по этой ссылке http://nlp.stanford.edu/software/lex-parser.shtml, http://nlp.stanford.edu:8080/parser/index.jsp и аналогичный вопрос для ruby язык Как вы разбираете абзац текста в предложения ? (желательно в рубине)

например: Текст -

Итог переговоров жизненно важно, потому что текущий уровень налогов подписано президентом Джорджем У. Буш истекает 31 декабря. Конгресс действует, ставки налога практически на все американцы, которые платят подоходный налог повысится 1 января. Это может повлиять экономический рост и даже отпуск продажи.

после пометки становится:

Результат / DT / NN / IN / DT переговоры / NNS is / VBZ vital / JJ, /, потому что / IN / DT ток / JJ налог / NN уровни / NNS подписано / VBN в / IN закон / NN / IN President / NNP George / NNP W./NNP Буш / NNP истекает / VBP на / RP Dec./NNP 31 / CD ./. Если не / В Конгрессе / NNP действует / ВБЗ, /, Налог / НН ставки / ННС на / В практически / РБ все / РБ американцы / NNPS кто / WP платит / VBP доход / NN налоги / NNS будет / MD расти / VB на / IN Jan./NNP 1 / CD ./. Что / DT может / MD повлиять / VB Экономический / JJ рост / NN и / CC даже / РБ праздник / NN продажи / NNS ./. Разбираем

Проверьте, как он распознал полный стоп (.) И период после 31 декабря ...

2 голосов
/ 01 августа 2013

Вы можете попытаться использовать класс java.text.BreakIterator для разбора предложений.Например:

BreakIterator border = BreakIterator.getSentenceInstance(Locale.US);
border.setText(text);
int start = border.first();
//iterate, creating sentences out of all the Strings between the given boundaries
for (int end = border.next(); end != BreakIterator.DONE; start = end, end = border.next()) {
    System.out.println(text.substring(start,end));
}
2 голосов
/ 07 декабря 2010

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

"The outcome of the negotiations is vital, because the current tax levels signed into law by President George W. Bush expire on Dec. 31.  Unless Congress acts, tax rates on virtually all Americans who pay income taxes will rise on Jan. 1.  That could affect economic growth and even holiday sales."

Второй можно решить, используя String.trim () .

Пример:

String one = "   and now...    ";
String two = one.trim();
System.out.println(two);          // output: "and now..."
0 голосов
/ 22 февраля 2015

Вы можете использовать класс SentenceSplitter, предоставляемый этой библиотекой с открытым исходным кодом здесь .

SentenceSplitter sp = new SentenceSplitter("filename");
String str = null;
while((str = sp.next().toString()) != null)
{
    //Your code here.
}
0 голосов
/ 07 декабря 2010

first Trim () Your String ... и используйте эту ссылку

http://www.java -examples.com / java-string-split-example & http://www.rgagnon.com/javadetails/java-0438.html

и вы также можете использовать класс StringBuffer ... просто используйте эту ссылку, я надеюсь, что это поможет вам

0 голосов
/ 07 декабря 2010

Учитывая текущий формат ввода, будет трудно разделить на предложения. Вы должны наложить какое-то правило, дополнительное правило, чтобы определить конец предложения, в дополнение к периоду. Например, это правило может быть «предложение должно заканчиваться точкой (.) И двумя пробелами». (Вот как инструмент UNIX grep определяет предложения.

0 голосов
/ 07 декабря 2010

Отделка это ...

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