Text nach Satzzeichen trennen

jacka

Mitglied
Hallo,
ich habe zum Beispiel einen String in dem mehrere Sätze stehen und ich will diesen in mehrere einzelne Strings trennen also dass ich dann ein String Array habe in dem jeder Satz in einem String steht.
Ich will jeden Satz mit einem . , ? oder ! trennen, also sozusagen splitten.
z.B. String [] saetze = line.split(".");
Und wie kann ich das erreichen das er bei mehreren Zeichen splittet und nicht nur bei einem?
 

Camill

Bekanntes Mitglied
Der [japi]StringTokenizer[/japi] bietet dafür eine Möglichkeit, könnte dann zb. so aussehen:
Java:
		final String string = "Dies.ist,ein!sinnloser?Satz.";
		final StringTokenizer tokenizer = new StringTokenizer(string, ".,?!");
		while (tokenizer.hasMoreElements()) {
			System.out.println(tokenizer.nextToken());
		}
 
T

Think

Gast
Oder vielleicht.

Java:
public class ZeichenTrennung {
 
 public static void main(String[] args) {
  ZeichenTrennung zt = new ZeichenTrennung();
  zt.trennen1();
 }

 public void trennen1() {
  String sb1 = "Das!gg:ll";
  String sb2 = sb1.replace('!',' ');
  String sb3 = sb2.replace(':',' ');
  System.out.println(sb3);
  trennen2();
 }
}

Wobei vielleicht könnte man irgendwie auch mehrmals [c]split()[/c] aufrufen ?
 

faetzminator

Gesperrter Benutzer
[c]split(".")[/c] ist insofern falsch, also dass in Regex das Zeichen [c].[/c] jedes beliebige Zeichen darstellt. Also müsstest du [c]split("\\.")[/c] verwenden. Da kannst du aber auch noch andere Zeichen reinnehmen [c]split("[.!?]")[/c] (wegen [c][][/c] kein \ mehr notwendig ;) ). Wenn du dann noch die Leerzeichen, Tabs etc. entfernen willst, nimmst du einfach [c]split("\\s*[.!?]\\s*")[/c].
 

Guybrush Threepwood

Top Contributor
Die vorgeschlagenen Ansätze sind zum Segmentieren von Sprache nicht brauchbar, da dabei Abkürzungen wie "z.B." nicht berücksichtigt werden. Das ist ein sehr kritischer Punkt, da man je nach Anwendung sonst kompletten Mist bekommt.
Das gilt sowohl für die split-Methode als auch für den StringTokenizer. In den JLanguagetools von Daniel Naber gibt es einen SetenceTokenizer, der einen sehr guten Job macht.
Ich habe das mal aus dem Code herausgeschält (LGPL). Vielleicht hilft es Dir. Die Quelle sind - wie gesagt - die JLanguageTools, allerdings eine ältere Fassung:


Java:
import java.util.List;

/**
 * Interface for classes that tokenize text into smaller units.
 * 
 * @author Daniel Naber
 */
public interface Tokenizer {

  public abstract List<String> tokenize(String text);
  
}

Java:
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.regex.Pattern;

/**
 * Tokenizes text into sentences by looking for typical end-of-sentence markers,
 * but considering exceptions (e.g. abbreviations).
 * 
 * @author Daniel Naber
 */
public class SentenceTokenizer implements Tokenizer {

	// end of sentence marker:
	private static final String EOS = "\0";

	// private final static String EOS = "#"; // for testing only
	private static final String P = "[\\.!?…]"; // PUNCTUATION

	private static final String AP = "(?:'|¬´|\"||\\)|\\]|\\})?"; // AFTER
																	// PUNCTUATION

	private static final String PAP = P + AP;

	// Check out the private methods for comments and examples about these
	// regular expressions:

	private Pattern paragraph = null;

	private static final Pattern paragraphByTwoLineBreaks = Pattern
			.compile("(\\n\\s*\\n)");

	private static final Pattern paragraphByLineBreak = Pattern
			.compile("(\\n)");

	private static final Pattern punctWhitespace = Pattern.compile("(" + PAP
			+ "\\s)");

	// \p{Lu} = uppercase, with obeying Unicode (\p{Upper} is just US-ASCII!):
	private static final Pattern punctUpperLower = Pattern.compile("(" + PAP
			+ ")([\\p{Lu}][^\\p{Lu}.])");

	private static final Pattern letterPunct = Pattern
			.compile("(\\s[\\wüöäÜÖÄß]" + P + ")");

	private static final Pattern abbrev1 = Pattern
			.compile("([^-\\wüöäÜÖÄß][\\wüöäÜÖÄß]" + PAP + "\\s)" + EOS);

	private static final Pattern abbrev2 = Pattern
			.compile("([^-\\wüöäÜÖÄß][\\wüöäÜÖÄß]" + P + ")" + EOS);

	private static final Pattern abbrev3 = Pattern
			.compile("(\\s[\\wüöäÜÖÄß]\\.\\s+)" + EOS);

	private static final Pattern abbrev4 = Pattern.compile("(\\.\\.\\. )" + EOS
			+ "([\\p{Ll}])");

	private static final Pattern abbrev5 = Pattern.compile("(['\"]" + P
			+ "['\"]\\s+)" + EOS);

	private static final Pattern abbrev6 = Pattern.compile("([\"']\\s*)" + EOS
			+ "(\\s*[\\p{Ll}])");

	private static final Pattern abbrev7 = Pattern.compile("(\\s" + PAP
			+ "\\s)" + EOS);

	// z.b. 3.10. (im Datum):
	private static final Pattern abbrev8 = Pattern
			.compile("(\\d{1,2}\\.\\d{1,2}\\.\\s+)" + EOS);

	private static final Pattern repair1 = Pattern.compile("('[\\wüöäÜÖÄß]" + P
			+ ")(\\s)");

	private static final Pattern repair2 = Pattern
			.compile("(\\sno\\.)(\\s+)(?!\\d)");

	private static final Pattern repair3 = Pattern
			.compile("([ap]\\.m\\.\\s+)([\\p{Lu}])");

	// some abbreviations:
	private static final String[] ABBREV_LIST = {
	// English -- but these work globally for all languages:
			"Mr", "Mrs", "No", "pp", "St", "no", "Sr", "Bros", "etc", "vs",
			"esp", "Fig", "fig", "Jan", "Feb", "Mar", "Apr", "Jun", "Jul",
			"Aug", "Sep", "Sept", "Oct", "Okt", "Nov", "Dec", "Ph.D", "PhD",
			"al", // in "et al."
			"cf", "Inc" };

	private static Set<String> abbreviations = new HashSet<String>();

	private StringTokenizer stringTokenizer = null;

	/**
	 * Month names like "Dezember" that should not be considered a sentence
	 * boundary in string like "13. Dezember".
	 */
	protected String[] monthNames = null;

	/**
	 * Create a sentence tokenizer that uses the built-in abbreviations.
	 */
	public SentenceTokenizer() {
		for (int i = 0; i < ABBREV_LIST.length; i++) {
			abbreviations.add(ABBREV_LIST[i]);
		}
		setSingleLineBreaksMarksParagraph(false);
	}

	/**
	 * Create a sentence tokenizer with the given list of abbreviations,
	 * additionally to the built-in ones.
	 */
	public SentenceTokenizer(final String[] abbrevList) {
		this();
		if (abbrevList != null)
			for (int i = 0; i < abbrevList.length; i++) {
				abbreviations.add(abbrevList[i]);
			}
	}

	/**
	 * @param lineBreakParagraphs
	 *            if <code>true</code>, single lines breaks are assumed to
	 *            end a paragraph, with <code>false</code>, only two ore more
	 *            consecutive line breaks end a paragraph
	 */
	public void setSingleLineBreaksMarksParagraph(boolean lineBreakParagraphs) {
		if (lineBreakParagraphs)
			paragraph = paragraphByLineBreak;
		else
			paragraph = paragraphByTwoLineBreaks;
	}

	/**
	 * Tokenize the given string to sentences.
	 */
	public List<String> tokenize(String s) {
		s = firstSentenceSplitting(s);
		s = removeFalseEndOfSentence(s);
		s = splitUnsplitStuff(s);
		stringTokenizer = new StringTokenizer(s, EOS);
		List<String> l = new ArrayList<String>();
		while (stringTokenizer.hasMoreTokens()) {
			final String sentence = stringTokenizer.nextToken();
			l.add(sentence);
		}
		return l;
	}

	/**
	 * Add a special break character at all places with typical sentence
	 * delimiters.
	 */
	private String firstSentenceSplitting(String s) {
		// Double new-line means a new sentence:
		s = paragraph.matcher(s).replaceAll("$1" + EOS);
		// Punctuation followed by whitespace means a new sentence:
		s = punctWhitespace.matcher(s).replaceAll("$1" + EOS);
		// New (compared to the perl module): Punctuation followed by uppercase
		// followed
		// by non-uppercase character (except dot) means a new sentence:
		s = punctUpperLower.matcher(s).replaceAll("$1" + EOS + "$2");
		// Break also when single letter comes before punctuation:
		s = letterPunct.matcher(s).replaceAll("$1" + EOS);
		return s;
	}

	/**
	 * Repair some positions that don't require a split, i.e. remove the special
	 * break character at those positions.
	 */
	private String removeFalseEndOfSentence(String s) {
		// Don't split at e.g. "U. S. A.":
		s = abbrev1.matcher(s).replaceAll("$1");
		// Don't split at e.g. "U.S.A.":
		s = abbrev2.matcher(s).replaceAll("$1");
		// Don't split after a white-space followed by a single letter followed
		// by a dot followed by another whitespace.
		// e.g. " p. "
		s = abbrev3.matcher(s).replaceAll("$1");
		// Don't split at "bla bla... yada yada" (TODO: use \.\.\.\s+ instead?)
		s = abbrev4.matcher(s).replaceAll("$1$2");
		// Don't split [.?!] when the're quoted:
		s = abbrev5.matcher(s).replaceAll("$1");

		// Don't split at abbreviations:
		for (String abbrev : abbreviations) {
			Pattern pattern = Pattern.compile("(\\b" + abbrev + PAP + "\\s)"
					+ EOS);
			s = pattern.matcher(s).replaceAll("$1");
		}
		// Don't break after quote unless there's a capital letter:
		// e.g.: "That's right!" he said.
		s = abbrev6.matcher(s).replaceAll("$1$2");

		// fixme? not sure where this should occur, leaving it commented out:
		// don't break: text . . some more text.
		// text=~s/(\s\.\s)$EOS(\s*)/$1$2/sg;

		// e.g. "Das ist . so." -> assume one sentence
		s = abbrev7.matcher(s).replaceAll("$1");

		// e.g. "Das ist . so." -> assume one sentence
		s = abbrev8.matcher(s).replaceAll("$1");

		// extension by dnaber --commented out, doesn't help:
		// text = re.compile("(:\s+)%s(\s*[%s])" % (self.EOS, string.lowercase),
		// re.DOTALL).sub("\\1\\2", text)

		// "13. Dezember" etc. -> keine Satzgrenze:
		if (monthNames != null) {
			for (int i = 0; i < monthNames.length; i++) {
				s = s
						.replaceAll("(\\d+\\.) " + EOS + "(" + monthNames[i]
								+ ")", "$1 $2");
			}
		}

		// z.B. "Das hier ist ein(!) Satz."
		s = s.replaceAll("([\\(\\[])([!?]+)([\\]\\)]) " + EOS, "$1$2$3 ");

		// z.B. "Das hier ist (genau!) ein Satz."
		s = s.replaceAll("([!?]+)([\\)\\]]) " + EOS, "$1$2 ");
		return s;
	}

	/**
	 * Treat some more special cases that make up a sentence boundary. Insert
	 * the special break character at these positions.
	 */
	private String splitUnsplitStuff(String s) {
		// e.g. "x5. bla..." -- not sure, leaving commented out:
		// text = re.compile("(\D\d+)(%s)(\s+)" % self.P,
		// re.DOTALL).sub("\\1\\2%s\\3" % self.EOS, text)
		// Not sure about this one, leaving out four now:
		// text = re.compile("(%s\s)(\s*\()" % self.PAP,
		// re.DOTALL).sub("\\1%s\\2" % self.EOS, text)
		// Split e.g.: He won't. #Really.
		s = repair1.matcher(s).replaceAll("$1" + EOS + "$2");
		// Split e.g.: He won't say no. Not really.
		s = repair2.matcher(s).replaceAll("$1" + EOS + "$2");
		// Split at "a.m." or "p.m." followed by a capital letter.
		s = repair3.matcher(s).replaceAll("$1" + EOS + "$2");
		return s;
	}

}

P.S.: ABBREV_LIST kann man natürlich ggf. noch ergänzen
 

eRaaaa

Top Contributor
Die vorgeschlagenen Ansätze sind zum Segmentieren von Sprache nicht brauchbar, da dabei Abkürzungen wie "z.B." nicht berücksichtigt werden.

Korrekt, aber man weiß ja gar nicht so Recht ob er das hier überhaupt machen will, denn mir wäre sonst auch nicht klar, wann ein Satz nach einem "," enden sollte.

In den JLanguagetools von Daniel Naber gibt es einen SetenceTokenizer[...]


Ohne externe Klassen geht es dann evtl. schon mit dem BreakIterator und getSentenceInstance()
-> Galileo Computing :: Java ist auch eine Insel – 4.8 Zerlegen von Zeichenketten

Abkürzungen wie "z.B." sollten damit auch keine Probleme sein!
 

Guybrush Threepwood

Top Contributor
Ohne externe Klassen geht es dann evtl. schon mit dem BreakIterator und getSentenceInstance()
-> Galileo Computing :: Java ist auch eine Insel – 4.8 Zerlegen von Zeichenketten

Abkürzungen wie "z.B." sollten damit auch keine Probleme sein!

Der BreakIterator ist bereits ein Fortschritt, de facto ist er aber leider auch nicht sonderlich brauchbar. Ich habe mit allen diesen Sachen für ein Forschungsprojekt zu semantischen Technologien herumgespielt und bin letztlich mit den JLanguageTools am Besten gefahren.
 
N

Noch-so'n-Nerd

Gast
Man kann seinen gesamten Text vorher von einem Parser (z.B. den Stanford-Parser) bearbeiten lassen.
Dann bekommt man die Satzzeichen gesondert gekennzeichnet und Sonderfälle wie "z.B." oder "Prof." sind da auch schon berücksichtigt. danach nur schnell eine Trennung über ($. .) und ($. !) und ($. ?) laufen lassen und zum Schluss noch die Markierunge mit remove raus streichen.

Wie gesagt... kompliziert und etwas aufwändger. Aber es funktioniert dafür auch in Sonderfällen ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Text Pane Aktualisierung erst nach JOptionPane Java Basics - Anfänger-Themen 10
L Text einlesen nach Mausdruck auf Button Java Basics - Anfänger-Themen 12
L Textzeilen nach 2 Wörtern untersuchen wenn vorhanden Zeile in neuen Text ausgeben wenn nicht löschen Java Basics - Anfänger-Themen 10
K Nach x Sekunden neuer Text/Zeile Java Basics - Anfänger-Themen 11
B Suchen nach Teilstring, um Text danach ausgeben Java Basics - Anfänger-Themen 11
B Text nach Signalwörtern durchsuchen Java Basics - Anfänger-Themen 4
S Text separiert nach Komma auslesen Java Basics - Anfänger-Themen 4
P Text vor und nach dem Inhalt einer Datei einfügen Java Basics - Anfänger-Themen 3
richis-fragen JTable effektiv angezeigter Text ausgeben nicht Inhalt vom Model Java Basics - Anfänger-Themen 9
A Edit Text Negative Decimalzahlen Java Basics - Anfänger-Themen 18
P Aus Text Datei nur Zahlen übernehmen Java Basics - Anfänger-Themen 13
T Text einlesen code was kommt dahin? Java Basics - Anfänger-Themen 1
R Text in der DB abspeichern, und danach bearbeiten Java Basics - Anfänger-Themen 5
A JTextArea entfernen und durch neuen Text ersetzen Java Basics - Anfänger-Themen 8
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
GoenntHack Java Text von JLabel verändert sich nicht Java Basics - Anfänger-Themen 1
A Text zu Morsecode Java Basics - Anfänger-Themen 8
O Java Text Area Zeilenausgabe Java Basics - Anfänger-Themen 7
M Text wird in der Console nicht ausgegeben. Java Basics - Anfänger-Themen 11
berserkerdq2 An selbst ersteller txt Datei immer Text dranhängen, ohne den vorherign Text zu löschen Java Basics - Anfänger-Themen 8
M Text in Datei schreiben Java Basics - Anfänger-Themen 9
T208 Text Datei individuell benennen. Java Basics - Anfänger-Themen 5
A Werten aus dem Text ausliesten Java Basics - Anfänger-Themen 6
K Jlabel mit itemlistevent Text gegeben, wird nicht angezeigt Java Basics - Anfänger-Themen 5
Kiki01 Wie würde eine geeignete Schleife aussehen, die die relative Häufigkeit für jeden Charakter in einem Text bestimmt? Java Basics - Anfänger-Themen 3
O Text mit Regex trennen und wieder zusammenbauen Java Basics - Anfänger-Themen 5
xFlozen Text mehrspaltig ausgeben Java Basics - Anfänger-Themen 3
S Zufällige ungerade Zeile aus Text-Datei lesen Java Basics - Anfänger-Themen 5
K Rekursiver Vergleich von Textmuster und Text Java Basics - Anfänger-Themen 2
C Variablen Provided text for message may not be null Java Basics - Anfänger-Themen 9
H Klassen Die Länge einer Text-Node bestimmen Java Basics - Anfänger-Themen 2
F Erste Schritte java.util.Scanner: Beliebig langen Text per Paste in Console eingeben ? Java Basics - Anfänger-Themen 14
GermanPie Discord Text Channel erstellen? Java Basics - Anfänger-Themen 1
C JButton Text 2 Mal ändern funktioniert nicht Java Basics - Anfänger-Themen 8
yoskaem Text Color durch Klicken eines Buttons in anderer Activity ändern Java Basics - Anfänger-Themen 2
B Alle Links in einem Text suchen und ersetzen mit einem neuen Link Java Basics - Anfänger-Themen 18
J Java TextArea Text bei hinzufügen makieren Java Basics - Anfänger-Themen 1
T Text-Ausgabe für Textadventure - Organisation Java Basics - Anfänger-Themen 5
G Anklickbaren Text erzeugen Java Basics - Anfänger-Themen 2
B Text-Datei nur in Stream speichern und dann ausgeben Java Basics - Anfänger-Themen 3
M Java: BufferedReader liest nur die Hälfte der Text-Datei. Java Basics - Anfänger-Themen 4
M Apache POI PPT - Vertikales Alignment von Text im XSLFAutoShape Java Basics - Anfänger-Themen 2
I Nur auf Abfrage von einer Text Datei einlesen Java Basics - Anfänger-Themen 11
P Text Datei einlesen und übertragen Java Basics - Anfänger-Themen 15
P Taschenrechner Text übertragung Java Basics - Anfänger-Themen 3
J java.text.DecimalFormat Java Basics - Anfänger-Themen 5
AnnaBauer21 GridBagLayout JLabel weightx: Unterschiedliche Breite mit & ohne Text Java Basics - Anfänger-Themen 6
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
S Text-To-Speech mit Java Java Basics - Anfänger-Themen 2
L Text-Adventure Java Basics - Anfänger-Themen 3
M Input/Output Java Swing: Prüft ob Text aus JTextField ausschließlich Integer enthält Java Basics - Anfänger-Themen 15
ruutaiokwu Ausgegebene Zeile ersetzen mit neuem Text Java Basics - Anfänger-Themen 3
tsom Erste Schritte itext Text als Block auf neue Seite Java Basics - Anfänger-Themen 0
Dimax Programme ,als Text in MySql speichern Java Basics - Anfänger-Themen 7
CptK Datentypen Text Dateien einlesen Java Basics - Anfänger-Themen 3
Harlequin Compiler-Fehler Text Adventure - "Long Output" Fehler Java Basics - Anfänger-Themen 3
S Zeichen zählen kopierter Text Java Basics - Anfänger-Themen 6
D Text als Code in java-forum.com formatieren. Wie ? Java Basics - Anfänger-Themen 3
F Schreibprogramm nur markierten Text in kursiv oder fett schreiben Java Basics - Anfänger-Themen 3
A Rechnen mit Text und Zahl Java Basics - Anfänger-Themen 4
MaximilianTM Input/Output Einlesen und bearbeiten einer text Datei / Zeile Java Basics - Anfänger-Themen 5
M Erste Schritte Verschlüsselung von text Java Basics - Anfänger-Themen 21
S Text aus einer HTML Datei auslesen Java Basics - Anfänger-Themen 1
S Java Text splitten mit Tabs, Zeilen, Zeichen und Klammern. Java Basics - Anfänger-Themen 6
M Beliebigen Text in *** umwandeln Java Basics - Anfänger-Themen 15
K (JTable) Text einer Zelle auf der linken Seite kürzel Java Basics - Anfänger-Themen 2
H Suche in Text und Markierung Java Basics - Anfänger-Themen 14
H Suche in einem Text Java Basics - Anfänger-Themen 17
F Input/Output Text einlesen lassen Java Basics - Anfänger-Themen 14
L Text eingeben und im Textfeld auslesen lassen Java Basics - Anfänger-Themen 2
R Best Practice Palindrom in einem Text finden Java Basics - Anfänger-Themen 18
J Text Datei einlesen Java Basics - Anfänger-Themen 6
L Text und Ganzzahl in einer Dialogbox Java Basics - Anfänger-Themen 5
D Text Adventure Erstellen Java Basics - Anfänger-Themen 10
T Jlabel durch Text in 2 anderen Jlabels sichtbar machen Java Basics - Anfänger-Themen 4
J JTextArea visible ohne Text Java Basics - Anfänger-Themen 3
D Bild zu Text Java Basics - Anfänger-Themen 4
L Text/Befehle zu Programmen senden Java Basics - Anfänger-Themen 1
L Java Text datei nur bis zu einem Punkt auslesen? Java Basics - Anfänger-Themen 3
T Classpath Problem mit dem auslesen von Text-Dateien (Pfad) Java Basics - Anfänger-Themen 3
S Erste Schritte Sprachermittler - Datei öffnen, Text in TextArea, Bereinigen, Auswerten Java Basics - Anfänger-Themen 14
S Java Label hat komischen text Java Basics - Anfänger-Themen 4
F Text anhand bestimmter Trennzeichen in Textteile trennen (netbeans) Java Basics - Anfänger-Themen 7
S Ausgabe von Text Formatieren Java Basics - Anfänger-Themen 6
H Text in einen Button quetschen Java Basics - Anfänger-Themen 3
A Text mit "Scanner" eingeben und Umlaute ersetzen Java Basics - Anfänger-Themen 7
A Text teilen und Wörter zählen Java Basics - Anfänger-Themen 7
J Zahlen als Text übersetzen Java Basics - Anfänger-Themen 6
F Erste Schritte Label Text vor Methodenaufruf setzen Java Basics - Anfänger-Themen 17
I BufferedReader Text-Datei einlesen??? Java Basics - Anfänger-Themen 1
S Wort in Text suchen und ersetzen Java Basics - Anfänger-Themen 3
V Interface ich schäme mich das zu fragen, aber ich schaff nicht ein Text zu zentrieren :( [javaFX] Java Basics - Anfänger-Themen 6
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
W Klassen Fehler bei public void setLabelText(JLabel label, String text) Java Basics - Anfänger-Themen 11
Chava Testprojekt.Text.Image.Button Java Basics - Anfänger-Themen 4
Z JSlider - Text wird nich angezeigt Java Basics - Anfänger-Themen 0
A Problem mit set.Text und übergabe Java Basics - Anfänger-Themen 2
A Probleme mit equals und get.Text Java Basics - Anfänger-Themen 12
M Text innerhalb Anführungsstriche als "eins" auswerten Java Basics - Anfänger-Themen 5
V Text aus einer .txt dynamisch ins applet einpassen Java Basics - Anfänger-Themen 0

Ähnliche Java Themen

Neue Themen


Oben