Korpora in NLTK Vortrag im Seminar Computerlinguis6sche Textanalyse WS 2014/15 (B- GSW- 12, M- GSW- 09) Johannes Hellrich Lehrstuhl für Computerlinguis6k Ins6tut für Germanis6sche SprachwissenschaQ Friedrich- Schiller- Universität Jena hwp://www.julielab.de
Was ist eigentlich Korpus Annota6on POS- Tag
Was ist eigentlich Korpus: Für Analyse gesammelte Sprachdaten Annota6on POS- Tag
Was ist eigentlich Korpus: Für Analyse gesammelte Sprachdaten Annota6on: Beschreibung/Analyseergebnis für (Teile von) Sprachdaten POS- Tag
Was ist eigentlich Korpus: Für Analyse gesammelte Sprachdaten Annota6on: Beschreibung/Analyseergebnis für (Teile von) Sprachdaten POS- Tag: POS = Part of speech - > Annota6on mit der Wortart, dabei werden typischerweise 30-50 Wortarten unterschieden
Korpustypen Annota6onen: Wortarten, Emo6onen, Medium: Geschrieben, gesprochen, Video, mul6medial, Domäne: Zeitungstexte, Telefongespräche, ParlamentsdebaWen, wissenschaqliche Ar6kel, Sprache: Monolingual, mul6lingual (parallel/ vergleichbar)
BeispielhaQes Annota6onstool: BRAT hwp://brat.nlplab.org Try brat online - > editable - > tutorial - > news - > 666 Login (rechts oben, username: "crunchy", password: "frog )
Korpora in NLTK laden NLTK ermöglicht das einfache Herunterladen diverser (anno6erter) Korpora Herunterladbar über nltk.download() Auswahl einzelner Korpora oder Collec6ons - > all
BeispielhaQe Korpora in NLTK Brown Corpus Amerikanisches Englisch (1960er) aus gemischten Domänen Erste Korpus mit 1 Millionen Wörtern Nachträglich mit POS anno6ert Projekt Gutenberg Von Freiwilligen digitalisierte gemeinfreie literarische Texte hwp://www.gutenberg.org Vorrangig Englisch Keine Annota6onen Movie Reviews Filmkri6ken, eingeteilt in posi6v und nega6v
API für Korpora in NLTK NLTK stellt Methoden zur Interak6on mit Korpora zur Verfügung: Genereller Aufruf: nltk.corpus.korpus. oder KORPUS. nach Import fileids() listet die Dateien auf, aus denen das Korpus besteht raw() bietet den blanken Text words(), sents(), paras() die Wörter, Sätze und Paragraphen als Listen ihrer jeweiligen Bestandteile Bei anno6erten Korpora können wir über tagged_words(), tagged_sents(), tagged_paras() die anno6erten Wörter, Sätze und Paragraphen abfragen, dabei erhalten wir Paare aus Wort und POS staw nur Wörter als Listenelemente Bei in Kategorien eingeteilten Korpora liefert categories() eine Liste der Kategorien Wir können die Ergebnisse dieser Aufrufe durch Keywordargumente wie fileids= foo oder categories= bar filtern, z.b. nltk.corpus.gutenberg.words(fileids='austen- emma.txt') liefert nur die Wörter aus der Datei austen- emma.txt Siehe hwp://www.nltk.org/howto/corpus.html#overview für mehr Beispiele, z.b. zu geparsten Korpora
Beispiel für die Nutzung der API for x in y führt alles darunter Eingerückte für jedes x aus, das sich in y befindet len(x) gibt die Länge von x zurück, z.b. eines Strings oder einer Liste round(y) rundet eine Zahl y
(Condi6onal) Frequency Distribu6on Zählt wie oq ein Wort vorgekommen ist, die Condi6onal Frequency Distribu6on unterscheidet dabei noch nach Gruppen (Condi6on) Erstellt über: nltk.probability.freqdist(liste), LISTE enthält einzelne Wörter nltk.condioonalfreqdist(liste), LISTE enthält Paare (Gruppe, Wort) Frequency Distribu6ons ermöglicht Abfrage von: Häufigkeit eines Worts distribuoon[wort] Häufigste Wörter distribuoon.items()[von:bis] Tabellenansicht distribuoon.tabulate() Plot distribuoon.plot ()? Condi6onal Frequency Distribu6ons ermöglicht Abfrage von: Enthaltene Frequency Distribu6on cfd[name] Tabellenansicht cfd.tabulate()
>>> wordswithgroup = [] Beispiel für Nutzung >>> for cat in nltk.corpus.movie_reviews.categories():... for word in nltk.corpus.movie_reviews.words(categories=cat): wordswithgroup.append((cat, word.lower())) >>> cfd = nltk.condioonalfreqdist(wordswithgroup) >>> cfd["pos"].items()[:10] [(',', 42448), ('the', 41471), ('.', 33714), ('a', 20196), ('and', 19896), ('of', 18636), ('to', 16517), ("'", 15268), ('is', 14059), ('in', 11725)] >>> cfd.tabulate(samples=["good","bad"]) good bad neg 1163 1034 pos 1248 361
Laden eigener Korpora Unanno6erte Texte werden mit dem PlaintextCorpusReader geladen Für anno6erte Texte gibt es spezielle Reader, z.b. den TaggedCorpusReader Details zu dessen Benutzung (und analog zur Benutzung anderer Python Klassen) bietet help(nltk.corpus.reader.tagged.taggedcorpusreader) Grundsätzlich erwarten alle Reader als Argumente: Das Verzeichnis in dem sich die Korpusdatei(en) befinden Entweder eine Liste an Dateinamen oder ein Muster (als regulärer Ausdruck) dem diese folgen (z.b..* für alle beliebigen Dateien in dem Verzeichnis) Beispiel: >>> from nltk.corpus import PlaintextCorpusReader >>> corpus_root = /home/nutzer/desktop/ordner >>> wordlists = PlaintextCorpusReader(corpus_root,.* ) >>> wordlists.fileids() [NAME1, NAME2,...] >>> wordlists.words(name1)
Übungsaufgaben Was ist das 1728te Wort im Brown Corpus? Benutzen Sie die POS Annota6onen im Brown Corpus und eine Frequency Distribu6on um die 20 häufigsten Adjek6ve zu ermiweln (Tags: JJ, JJR, JJS, JJT; Sie müssen if verwenden) Benutzen Sie diese Adjek6vliste gemeinsam mit einer Condi6onal Frequency Distribuion basierend auf den movie_reviews um eine Tabelle zu erstellen, die diese Wörter und ihre Häufigkeit zeigt. Erstellen Sie einen Ordner und eine darin befindliche Textdatei. Kopieren Sie den Inhalt der Wikipediaseite hwp://en.wikipedia.org/wiki/bee in diese Datei. Lesen Sie die Datei in NLTK ein und ermiweln Sie die Anzahl der Wörter pro Satz. (Vermutlich müssen Sie zuerst mit nltk.download() - > Models - > punkt herunterladen, damit NLTK die Sätze in ihrem Text erkennen kann)