Tokenizing

S

sarschu

Gast
Hallo,

ich versuche momentan einen Tokenizer zu schreiben, der Satzzeichen aber nicht löscht oder ignoriert, sondern als eigenes Token behandelt. Dies ist aber nicht ganz so einfach, das Satzzeichen ja direkt an Wörter angeschlossen sind.
Ich möchte für den Input

'Wie geht's?'

Gerne den Output:
'
Wie
geht's
?
'

haben.

Ich habe versucht die einzelnen Buchstaben einzulesen und abzuprüfen, ob der Buchstabe ein Satzzeichen ist oder nicht. Wenn ja, wird er in eine Zeile geschrieben, wenn nein werden die Buchstaben gesammelt, bis das Wort vollständig ist, wieder zusammen gesetzt und dann gedruckt.

Das Ganze funktioniert aber leider so nicht. Hat jemand eine Idee?

Code:
import java.util.*; 
public class tokenizer{

	public static void main(String[] args){
	
	String word1 = "";
	Scanner in = new Scanner(System.in);

	ArrayList<String> words = new ArrayList<String>();	
	ArrayList<String> letters = new ArrayList<String>();

	while(in.hasNext())
	{
		 String wordWhatever = in.next();
		
		Scanner word = new Scanner(wordWhatever);
		while(word.hasNext())
		{
			letters.add(word.next());
			
		}
			for(int i=0; i < letters.size(); i++)
			{
			    if(!(letters.get(i).matches("\\p{Punct}")))
			         word1 = word1+letters.get(i);
			    else if(letters.get(i).matches("\\p{Punct}"))
			       // System.out.println("test");
			        words.add(letters.get(i));
			}
			letters.clear();
			words.add(word1);
			word1="";
		
    }

	System.out.println(words.size());	
	for(int i=0; i< words.size(); i++)
	{
		System.out.println(words.get(i));
	}
	
	
	}
}

Danke schon mal,

Sarah
 
M

Marcinek

Gast
An einem StringTokenizer gibt es eine Methode, die die Ausgabe von Delimitern ein und ausschaltet.
 
S

sarschu

Gast
So wie ich delimiter verstanden habe, geben sie an, an welcher Stelle gesplittet werden soll. Im Prinzip ist mein delimiter also ein whitespace, allerdings nicht in den Fällen in denen ein Satzzeichen auftaucht, denn zwischen Satzzeichen und Wort gibt es keinen whitespace.
 

eRaaaa

Top Contributor
Das ist aber legacy code, dann eher split verwenden. Das kann aber haarig werden, denn schon allein dass bei geht's jetzt das Zeichen nicht gesplittet werden soll usw macht die Sache nicht leichter :)
 
S

sarschu

Gast
Ja, das mit dem geht's ist ein Problem, wobei ich darüber fürs erste hinweg sehen könnte.
Das Problem bei split() ist doch aber wieder, dass das Zeichen, das als split-Markierung gegeben wird dadurch wegfällt. Mein Satzzeichen soll ja aber nicht wegfallen. Oder versteh ich hier was völlig falsch?
 

eRaaaa

Top Contributor
Ja, das mit dem geht's ist ein Problem, wobei ich darüber fürs erste hinweg sehen könnte.
Das Problem bei split() ist doch aber wieder, dass das Zeichen, das als split-Markierung gegeben wird dadurch wegfällt. Mein Satzzeichen soll ja aber nicht wegfallen. Oder versteh ich hier was völlig falsch?

Kommt auf den regulären Ausdruck drauf an den du verwendest :)
Java:
		String[] split = "'Wie geht's?'".split("(?<=\\p{Punct})| ");
		for (String string : split) {
			System.out.println(string);
		}

=
'
Wie
geht'
s?
'

Aber wie ich sagte, das ist nicht ganz trivial :D
 
S

sarschu

Gast
Was genau bedeutet die RE denn, die du hier verwendest?
Wie wäre es denn jetzt zu machen, dass auch das Fragezeichen und das ' von geht's in einer eigenen Zeile landen?

Vielen Dank für deine Hilfe!

Sarah
 
S

sarschu

Gast
Ok hab rausgefunden, was deine regular expression macht, aber das ist auch nicht ganz das, was ich suche. Es soll ja nicht nach einem Satzzeichen spalten, sondern vor und nach einem Satzzeichen.
Ich denke ich werds aufgeben. Aber nochmal danke an alle, die sich bemüht haben, mir zu helfen.
 

Neue Themen


Oben