2010-04-21 17 views
21

ich dieses Stück Code geschrieben haben, die einen String und speichert sie in einem String-Array teilt: -Split-String in Sätze

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

Allerdings habe ich die [az] hinzugefügt, weil ich behandeln wollte etwas von dem Abkürzungsproblem. Aber dann zeigt mein Ergebnis auf, als so: -

Außerdem, wenn Everett versucht, sie in grundlegende Mathematik zu unterrichten sie unresponsiv

ich bewiesen, dass ich das Muster verlieren in der Split-Funktion angegeben. Es ist in Ordnung für mich, die Periode zu verlieren, aber den letzten Buchstaben des Wortes zu verlieren stört seine Bedeutung.

Könnte mir jemand dabei helfen und zusätzlich könnte mir jemand beim Umgang mit Abkürzungen helfen? Zum Beispiel, weil ich die Zeichenfolge auf Perioden aufgeteilt habe, möchte ich die Abkürzungen nicht verlieren.

Antwort

45

Das Analysieren von Sätzen ist bei weitem keine triviale Aufgabe, auch nicht für lateinische Sprachen wie Englisch. Ein naives Vorgehen wie das, das Sie in Ihrer Frage skizzieren, wird oft genug scheitern, dass es sich in der Praxis als nutzlos erweisen wird.

Ein besserer Ansatz ist die Verwendung einer BreakIterator Konfiguration mit der richtigen Locale.

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)); 
} 

ergibt sich folgende Ergebnis:

  1. Dies ist ein Test.
  2. Dies ist ein T.L.A. Prüfung.
  3. Jetzt mit einem Dr. drin.
+6

Wenn ich diesen Satz verwende - "Mein Freund, Mr. Jones, hat einen neuen Hund." Es bricht nach Mr. Es passiert wegen der Kapitalisierung von Jones. Kennst du einen Umweg? Ansonsten ist der BreakIterator großartig! – nbz

11

Es wird schwierig sein, einen regulären Ausdruck zu bekommen in allen Fällen zu arbeiten, aber Ihr unmittelbares Problem zu beheben, können Sie einen Lookbehind verwenden:

String sResult = "This is a test. This is a T.L.A. test."; 
String[] sSentence = sResult.split("(?<=[a-z])\\.\\s+"); 

Ergebnis:

This is a test 
This is a T.L.A. test. 

Beachten Sie, dass es sind Abkürzungen, die nicht mit Großbuchstaben enden, wie zB Abkürzung, Herr, etc ... Und es gibt auch Sätze, die nicht in Perioden enden!

+0

Vielen Dank für Ihre Antwort. –

+1

Dies wird in 9,3% der Sätze fehlschlagen. Und Sätze, die ... Ellipse verwenden. Und Sätze mit Fehlern in ihnen. Und so weiter. Was auch immer Sie tun, Ihr Code wird aus menschlicher Sicht Fehler machen. –

4

Wenn Sie können, verwenden Sie ein Verarbeitungsprogramm für natürliche Sprache wie LingPipe. Es gibt viele Feinheiten, die sehr schwer sein wird, mit regulären Ausdrücken zu fangen, zum Beispiel (zum Beispiel :-)), Herr, Abkürzungen, Auslassungs (...), et cetera.

Es gibt ein sehr einfach zu folgen Tutorial auf Sentence Detection in der LingPipe-Website.

+0

Hallo, Ich habe das Tutorial überprüft. Es schien perfekt, aber ich kann nicht herausfinden, wie man es mit Eclipse verwendet.Könnten Sie mir bitte helfen? –