Seite 1 von 1

TOKENIZER

Verfasst: Samstag 23. Mai 2009, 07:19
von BUXHO
Hallo,

ich hoffe, dass mir jemand, der mit Korpora arbeitet helfen kann.

habe ein Text (roman) und möchte den annotieren mit POS-Tags.
Ich brauche einen Tokenizer.
Dafür habe ich einen Sentence Splitter programmiert (nicht so gut, aber es läuft).
Jetzt soll (jeder) der Satz in Token zerlegt werden.
Ich kann zerlegen in z.B.: "sagte:" ("Er sagte: Korpus..."), oder "Korpus..."

Die Frage ist:
1. Wie kann man alle Wörter zerlegen (ohne Satzzeichen-die brauche ich aber wieder)
2. mit POS-Tags annotieren (den Annotations-Tagset habe ich), und
3. wieder zurück (mit Annotationen) in Output.
4. Gibt es einen TOKENIZER (Sprachunabhängig) for free, mit Python code.
Z.B.:
B/ (Satzanfang)
Er Pron (Pronomen)
sagte V (Verb)
:
Korpus N (Nomen)
...
$ (Satzende)

Noch eine linguistische Frage (wie sind die Konventionen):
Wörter mit Bindestrich (z.B.: "Tausender-Zahlen") - bekommt "Tausender" ein POS-Tag und "Zahlen" ein POS-Tag, oder beide bekommen nur einen POS-Tag?

Danke

Verfasst: Samstag 23. Mai 2009, 09:04
von sma
Hallo Buxho, willkommen.

Ich verstehe ehrlich gesagt nicht, was du willst. Hilft dir http://www.ling.uni-potsdam.de/~timo/le ... eumann.pdf oder http://typo.uni-konstanz.de/~mayer/cour ... zung11.pdf weiter?

Oder suchst du einfach

Code: Alles auswählen

import re
s = u"Preußen besiegte Österreich in Leuthen."
print re.findall("(?u)\w+|[.,!?]", s)
Stefan

Verfasst: Samstag 23. Mai 2009, 11:02
von Dill
sicher, dass du nur einen tokenizer brauchst?
scheint nicht so...?

schau mal beim NLTK vorbei.

http://www.nltk.org/

Verfasst: Montag 25. Mai 2009, 00:35
von BUXHO
sma hat geschrieben:...Oder suchst du einfach

Code: Alles auswählen

import re
s = u"Preußen besiegte Österreich in Leuthen."
print re.findall("(?u)\w+|[.,!?]", s)
Stefan
Hi, dieser re Ausdruck ist super. (ich kann es noch nicht so gut... :) )
Man bekommt: [u'Preu\xdfen', u'besiegte', u'\xd6sterreich', u'in', u'Leuthen', u'.']

Die Trennung von Satzzeichen ist echt super.

Nur wie macht man das wenn man in Schleife ist und eine Liste von Sätzen hat?
z.B.:

Code: Alles auswählen

satzListe = ["Sie ist Krankenschwester.", "Er ist Student."]
...
def tokenizer(satzListe):
    for a in satzListe:
        for satz in a.split(): ##"Sie ist Krankenschwester.".split()
            ...
dannach kommt: ##"Er ist Student.".split()
usw...

und wie kann ich dann den obigen Satz [u'Preu\xdfen', u'besiegte', u'\xd6sterreich', u'in', u'Leuthen', u'.'] in einfache Liste (ohne u) umwandeln?
z.B. in: ['Preu\xdfen', 'besiegte', '\xd6sterreich', 'in', 'Leuthen', '.']


Vielen, vielen Dank

Edit (BlackJack): Quelltext in Code-Tags gesetzt.

Verfasst: Montag 25. Mai 2009, 06:41
von BlackJack
@BUXHO: Das sind ziemlich grundlegende Fragen. Du solltest lernen die Dir selbst zu beantworten.

Zum Beispiel könntest Du Dir bei dem Quelltext da mal in der innersten Schleife `a` und `satz` ausgeben lassen und wirst vielleicht feststellen, dass die Namen nicht besonders passend gewählt sind. `a` sowieso nicht, weil der Namen nicht aussagekräftig ist, und `satz` repräsentiert dort keine ganzen Sätze.

Dann musst Du nur noch herausfinden was ganze Sätze dort sind und darauf dann das `re.split()` anwenden.

Was Du da hast *sind* normale Listen. Die enthalten Unicode-Objekte. Was Du anscheinend gerne hättest, sind ISO-8859-1 kodierte Zeichenketten. Dazu gibt's diese Lektüre: [wiki]Von Umlauten, Unicode und Encodings[/wiki]

Verfasst: Montag 25. Mai 2009, 13:14
von snafu
Vielleicht ist pyparsing etwas für dich.