TOKENIZER

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
BUXHO
User
Beiträge: 5
Registriert: Samstag 23. Mai 2009, 06:24

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
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

sicher, dass du nur einen tokenizer brauchst?
scheint nicht so...?

schau mal beim NLTK vorbei.

http://www.nltk.org/
http://www.kinderpornos.info
BUXHO
User
Beiträge: 5
Registriert: Samstag 23. Mai 2009, 06:24

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.
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]
Benutzeravatar
snafu
User
Beiträge: 6740
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Vielleicht ist pyparsing etwas für dich.
Antworten