Übungen: Natural Language Processing

Aufgaben zu NLP-Bereichen, Bag-of-Words, tf-idf, n-Grammen, der scikit-learn-Pipeline, spaCy und einfachem Question Answering - alle Loesungen basieren ausschliesslich auf EKI07.

Beginner

Aufgabe 1 (Beginner) - Was ist das Bag-of-Words-Modell?

Welche Aussage beschreibt das Bag-of-Words-Modell (BoW) korrekt?

a) Ein Text wird als Sequenz von Woertern mit vollstaendiger Grammatik und Reihenfolge gespeichert. b) Ein Text wird als Multi-Set (bag) von Worten mit ihren Haeufigkeiten repraesentiert, ohne Grammatik und Reihenfolge. c) Ein Text wird in einen Wissensgraphen mit Kanten und Knoten ueberfuehrt. d) Ein Text wird Satz fuer Satz uebersetzt und danach zusammengefasst.

Lösung anzeigen

Richtig ist b).

Das Bag-of-Words-Modell repraesentiert einen Text als Multi-Set (bag) von Worten mit ihren Haeufigkeiten, ohne die Grammatik oder die Reihenfolge der Worte zu beruecksichtigen. Genau das ist die Grundidee laut Folie.

  • a) ist falsch: Reihenfolge und Grammatik gehen im BoW gerade verloren.
  • c) beschreibt Information Extraction (Text -> Wissensgraph).
  • d) mischt Maschinelle Uebersetzung und Texterzeugung/Summarization.

Beispiel aus dem Kapitel: "John likes to watch movies. Mary likes movies too." wird zu BoW = {"John":1, "likes":2, "to":1, "watch":1, "movies":2, "Mary":1, "too":1}.

Kapitel: EKI07

Tipp: Merksatz "bag" = Tuete: man wirft alle Worte hinein und schuettelt - die Reihenfolge ist danach egal, nur die Anzahl zaehlt.

Aufgabe 2 (Beginner) - Die sechs Bereiche des NLP

Benennen Sie die sechs Bereiche der Verarbeitung natuerlicher Sprache aus dem Kapitel und geben Sie jeweils das Eingabe -> Ausgabe-Verhalten an.

Lösung anzeigen

Die sechs Bereiche mit ihrem Eingabe -> Ausgabe-Verhalten:

BereichEingabe -> Ausgabe
Information Retrieval (IR)Text -> relevante Dokumente (z. B. HTML, MP4)
TextklassifikationText -> Klassifikation (z. B. EN/DE, Thema, Stimmung)
Information Extraction (IE)Text -> Wissensgraph
Question Answering (QA)Fragetext -> Antworttext
Maschinelles UebersetzenText in Sprache A -> Text in Sprache B
TexterzeugungWissensgraph -> Text

Reasoning: Jeder Bereich laesst sich ueber sein Eingabe-/Ausgabe-Verhalten charakterisieren. Beachte, dass Texterzeugung die Umkehrung von Information Extraction ist (Graph -> Text statt Text -> Graph).

Kapitel: EKI07

Falle: Das Zusammenfassen von Texten (Summarization) ist kein eigener Bereich, sondern wird laut Folie unter Texterzeugung gefuehrt.

Aufgabe 3 (Beginner) - BoW-Vektor aufstellen

Stellen Sie fuer den folgenden Text den Bag-of-Words-Vektor (als Multi-Set mit Haeufigkeiten) auf:

"Anna liest Buecher. Anna liest gern."
Lösung anzeigen

Wir zaehlen jedes Wort (Reihenfolge und Satzzeichen werden ignoriert):

BoW = {"Anna":2, "liest":2, "Buecher":1, "gern":1}

Reasoning: "Anna" taucht zweimal auf, "liest" zweimal, "Buecher" und "gern" je einmal. Als Feature-Vektor ueber dem Vokabular [Anna, liest, Buecher, gern] ergibt sich:

v=(2, 2, 1, 1)\vec{v} = (2,\ 2,\ 1,\ 1)

Kapitel: EKI07

Tipp: In der einfachsten Form ist jeder Vektoreintrag genau die Worthaeufigkeit (term frequency) des Wortes im Text - so entstehen die Feature-Vektoren fuer ML.

Fortgeschritten

Aufgabe 4 (Fortgeschritten) - tf-idf berechnen

Gegeben ist ein Korpus aus N=4N = 4 kurzen Dokumenten:

d1: "der film ist gut der film"
d2: "der film ist schlecht"
d3: "der film war spannend"
d4: "der actionfilm war langweilig"

Berechnen Sie fuer das Dokument d1 die tf-idf-Gewichte der Worte "der", "film", "ist" und "gut". Verwenden Sie tf\text{tf} = Rohhaeufigkeit im Dokument und idf(t,D)=logNdf\text{idf}(t,D) = \log \frac{N}{df} (Logarithmus zur Basis 10, wie im Kapitel-Beispiel).

Lösung anzeigen

Schritt 1 - term frequency (tf) in d1 (d1 = {der:2, film:2, ist:1, gut:1}):

Termtf(t, d1)
der2
film2
ist1
gut1

Schritt 2 - document frequency (df) im Korpus (in wie vielen der 4 Dokumente kommt der Term vor):

TermDokumentedf
derd1, d2, d3, d44
filmd1, d2, d33
istd1, d22
gutd11

Schritt 3 - idf = log10(N/df) mit N=4N=4:

idf(der)=log44=log1=0\text{idf}(\text{der}) = \log \tfrac{4}{4} = \log 1 = 0 idf(film)=log43=log1,3330,125\text{idf}(\text{film}) = \log \tfrac{4}{3} = \log 1{,}333 \approx 0{,}125 idf(ist)=log42=log20,301\text{idf}(\text{ist}) = \log \tfrac{4}{2} = \log 2 \approx 0{,}301 idf(gut)=log41=log40,602\text{idf}(\text{gut}) = \log \tfrac{4}{1} = \log 4 \approx 0{,}602

Schritt 4 - tfidf = tf * idf:

Termtfidftfidf
der200
film20,1250,250
ist10,3010,301
gut10,6020,602

Interpretation: "der" bekommt trotz hoechster Haeufigkeit das Gewicht 0, weil es in allen Dokumenten steht (df = N, idf = 0). Das seltene, aussagekraeftige Wort "gut" (nur in d1) erhaelt das hoechste Gewicht. Genau das ist das Ziel von tf-idf: haeufige Fuellwoerter abwerten, unterscheidungsstarke Woerter aufwerten.

Kapitel: EKI07

Falle: Ein Wort mit df = N hat immer idf = log(N/N)=log1=0\log(N/N)=\log 1 = 0 - egal wie oft es im Einzeltext vorkommt, sein tf-idf ist 0.

Tipp: Das Kapitel weist darauf hin, dass es mehrere Formeln fuer tf-idf gibt; scikit-learns TfidfTransformer nutzt eine geglaettete Variante. Fuer die Pruefung genuegt "tf mal idf" mit idf=log(N/df)\text{idf}=\log(N/df).

Aufgabe 5 (Fortgeschritten) - n-Gramme bilden

Bilden Sie alle 2-Gramme (Bigramme) des Satzes:

"John likes to watch movies"

Erklaeren Sie ausserdem in einem Satz, welchen Vorteil n-Gramme gegenueber dem reinen Bag-of-Words-Modell haben.

Lösung anzeigen

Die Bigramme sind alle Paare aufeinanderfolgender Worte:

"John likes", "likes to", "to watch", "watch movies"

Das sind vier Bigramme (bei fuenf Worten gibt es 52+1=45-2+1 = 4 Bigramme).

Vorteil: n-Gramme erfassen ein Stueck Wortreihenfolge / Kontext, das beim reinen BoW (nur 1-Gramme) verloren geht. Sie koennen ebenfalls zur Erzeugung von Feature-Vektoren dienen und mit tf-idf kombiniert werden.

Kapitel: EKI07

Tipp: Ein n-Gramm-Modell ergaenzt die 1-Gramm-Spalten der Feature-Matrix um zusaetzliche Spalten fuer Wortpaare (z. B. "John likes", "likes to").

Aufgabe 6 (Fortgeschritten) - Die scikit-learn-Pipeline

In welcher Reihenfolge durchlaeuft ein Rohtext die drei Stufen der Textklassifikations-Pipeline aus dem Kapitel?

a) MultinomialNB -> CountVectorizer -> TfidfTransformer b) TfidfTransformer -> CountVectorizer -> MultinomialNB c) CountVectorizer -> TfidfTransformer -> MultinomialNB d) CountVectorizer -> MultinomialNB -> TfidfTransformer

Lösung anzeigen

Richtig ist c).

Die Pipeline verkettet Vectorizer -> Transformer -> Classifier:

text_clf = Pipeline([
    ('vect',  CountVectorizer()),    # Bag of Words (Wortzaehlungen)
    ('tfidf', TfidfTransformer()),   # tf-idf-Gewichtung
    ('clf',   MultinomialNB()),      # Naive-Bayes-Classifier
])

Ablauf: Der CountVectorizer erzeugt aus dem Rohtext BoW-Zaehlungen, der TfidfTransformer gewichtet sie zu tf-idf, und MultinomialNB sagt das Genre-Label vorher.

graph LR
    A["Rohtext (overview)"] --> B["CountVectorizer (Bag of Words)"]
    B --> C["TfidfTransformer (tf-idf)"]
    C --> D["MultinomialNB (Classifier)"]
    D --> E["Genre-Label (Drama / nicht Drama)"]

Kapitel: EKI07

Tipp: Die Stufennamen (vect, tfidf, clf) sind frei waehlbar und lassen sich spaeter fuer Grid-Search der Hyperparameter nutzen. Das gesamte Modell wird mit einem fit-Befehl trainiert.

Aufgabe 7 (Fortgeschritten) - spaCy-Funktionen zuordnen

Ordnen Sie jeder Beschreibung die passende spaCy-Funktion zu:

  1. Zuweisen der Grundform eines Wortes (z. B. "was" -> "be").
  2. Erkennen benannter Objekte der realen Welt (Personen, Firmen, Orte).
  3. Zuweisen von Wortarten (z. B. Verb, Nomen) zu Tokens.
  4. Vergleichen, wie aehnlich zwei Woerter oder Dokumente sind.
Lösung anzeigen
Nr.Funktion
1Lemmatization (Grundform / Lemma, z. B. "rats" -> "rat")
2Named Entity Recognition (NER)
3Part-of-speech (POS) Tagging
4Similarity (ueber Wortvektoren / word embeddings)

Reasoning: Diese vier gehoeren zur Funktionsliste von spaCy. Weitere Funktionen des Kapitels sind u. a. Tokenization, Dependency Parsing, Sentence Boundary Detection (SBD), Entity Linking (EL), Text Classification, Rule-based Matching, Training und Serialization.

Kapitel: EKI07

Tipp: Die Similarity basiert auf Wortvektoren (word embeddings, z. B. mit word2vec erzeugt). Dafuer braucht man ein grosses Modell wie en_core_web_lg - das kleine en_core_web_sm liefert keine aussagekraeftigen Vektoren.

Anspruchsvoll

Aufgabe 8 (Anspruchsvoll) - Vorhersage mit trainierter Pipeline

Ein Kollege trainiert die Pipeline korrekt und will danach zwei neue Dokumente klassifizieren. Er schreibt:

docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.fit_transform(docs_new)   # (!)
X_new_tfidf  = tfidf_transformer.fit_transform(X_new_counts)  # (!)
predicted    = clf.predict(X_new_tfidf)

Was ist an den beiden markierten Zeilen falsch, und wie muss es richtig heissen? Begruenden Sie.

Lösung anzeigen

Fehler: Fuer neue Dokumente darf man nur transform aufrufen, nicht fit_transform.

Korrekt:

docs_new = ['God is love', 'OpenGL on the GPU is fast']
X_new_counts = count_vect.transform(docs_new)
X_new_tfidf  = tfidf_transformer.transform(X_new_counts)
predicted    = clf.predict(X_new_tfidf)

Begruendung: fit (bzw. fit_transform) lernt das Vokabular und die idf-Gewichte aus den uebergebenen Daten. Ruft man es auf den neuen Dokumenten erneut auf, wird ein neues Vokabular aus nur zwei Saetzen gebaut und die idf-Werte neu geschaetzt. Damit passen die Feature-Spalten nicht mehr zu dem, worauf clf trainiert wurde - die Vorhersage waere unbrauchbar. Neue Daten muessen mit dem beim Training gelernten Vectorizer/Transformer nur noch transformiert werden.

Im Kapitel wird die Vorhersage genau so gezeigt: count_vect.transform(docs_new) und tfidf_transformer.transform(X_new_counts).

Kapitel: EKI07

Falle: fit_transform = lernen + anwenden (nur auf Trainingsdaten). transform = nur anwenden (auf neue Daten). Ein zweites fit auf Testdaten ist ein klassischer Fehler.

Aufgabe 9 (Anspruchsvoll) - Warum tf-idf statt reiner Zaehlungen?

Das Kapitel schreibt: "Reine Zaehlungen benachteiligen kurze Dokumente." Erklaeren Sie (a) warum das so ist und (b) welche zwei Schritte der TfidfTransformer dagegen unternimmt. Verweisen Sie auf das Beispiel des Wortes "the".

Lösung anzeigen

(a) Warum reine Zaehlungen kurze Dokumente benachteiligen: Ein langes Dokument enthaelt allein durch seine Laenge groessere Rohzaehlungen als ein kurzes. Vergleicht man reine Counts, erscheinen lange Texte kuenstlich "staerker" fuer jedes Wort, obwohl der Anteil eines Wortes im kurzen Text vielleicht hoeher ist.

(b) Die zwei Schritte des TfidfTransformer:

  1. Teilen durch die Gesamtzahl der Woerter des Dokuments -> ergibt die term frequency (tf). Dadurch werden lange und kurze Dokumente vergleichbar (Normalisierung der Laenge).
  2. Herunterskalieren von Woertern, die in vielen Dokumenten vorkommen -> ergibt tf-idf ueber die inverse Dokumenthaeufigkeit.

Beispiel "the": Fuellwoerter wie "the", "a", "to" kommen in fast allen Dokumenten vor (hohe df). Sie sind nicht die wichtigsten Woerter und werden ueber die inverse Dokumenthaeufigkeit abgewertet - im Extremfall df=Nidf=log(N/N)=0df = N \Rightarrow \text{idf} = \log(N/N) = 0.

Kapitel: EKI07

Tipp: Merke die zwei Motivationen getrennt: tf loest das Laengenproblem, idf loest das Fuellwort-Problem.

Aufgabe 10 (Anspruchsvoll) - Dependency Parse interpretieren

spaCy liefert fuer den Satz "This is a sentence." folgenden Dependency Parse:

graph LR
    IS["is (AUX)"] -->|nsubj| THIS["This (PRON)"]
    IS -->|attr| SENT["sentence (NOUN)"]
    SENT -->|det| A["a (DET)"]

(a) Welche Wortart (POS) hat "is", und welche syntaktische Rolle hat "This"? (b) Woran haengt der Artikel "a" und ueber welches Label? (c) Welche spaCy-Funktion erzeugt diese Wortart-Labels, und welche die Abhaengigkeits-Labels?

Lösung anzeigen

(a) "is" ist ein AUX (Auxiliar/Hilfsverb). "This" ist ueber das Label nsubj das Subjekt ("nominal subject") von "is" und ein PRON (Pronomen).

(b) Der Artikel "a" (DET, Determiner) haengt ueber das Label det am Nomen "sentence". Zusaetzlich ist "sentence" (NOUN) ueber attr mit "is" verbunden.

(c)

  • Die Wortart-Labels (PRON, AUX, NOUN, DET) stammen vom Part-of-speech (POS) Tagging.
  • Die Abhaengigkeits-Labels (nsubj, attr, det) stammen vom Dependency Parsing (Zuweisen syntaktischer Abhaengigkeits-Labels wie Subjekt/Objekt).

Kapitel: EKI07

Tipp: Visualisieren laesst sich das mit displacy.render(doc, style="dep").

Aufgabe 11 (Anspruchsvoll) - Einfaches Question Answering per Aehnlichkeit

Die FAQ-Wissensbasis enthaelt u. a. den Eintrag:

QuestionAnswer
Which prices did John Nash win?Nobel price in Economics and Abel Prize

Ein Nutzer stellt die neue Frage: "Which prices was John Nash awarded?"

(a) Beschreiben Sie das Grundprinzip, mit dem das QA-System eine Antwort findet. (b) Welche Antwort liefert es hier vermutlich und warum? (c) Was passiert laut Code-Geruest, wenn keine FAQ-Frage hinreichend aehnlich ist?

Lösung anzeigen

(a) Grundprinzip: Die neue Frage wird mit allen FAQ-Fragen verglichen. Ist eine bekannte Frage hinreichend aehnlich (genug Konfidenz), gibt das System deren gespeicherte Antwort zurueck. Der Aehnlichkeitsvergleich kann z. B. ueber spaCy-similarity (Wortvektoren) oder tf-idf-basierte Cosinus-Aehnlichkeit erfolgen.

(b) Erwartete Antwort: "Nobel price in Economics and Abel Prize". Die neue Frage "Which prices was John Nash awarded?" ist eine Umformulierung von "Which prices did John Nash win?" - gleicher Inhalt, andere Formulierung. Bei hoher Aehnlichkeit wird dieselbe Antwort zurueckgegeben.

(c) Kein aehnlicher Treffer: predict_answer gibt bei zu geringer Konfidenz None zurueck (keine Antwort).

graph LR
    Q["Neue Frage"] --> SIM{"Aehnlich zu einer FAQ-Frage?"}
    SIM -->|"ja (genug Konfidenz)"| A["Antwort der FAQ-Frage zurueckgeben"]
    SIM -->|nein| N["None (keine Antwort)"]

Kapitel: EKI07

Tipp: Die Testdaten enthalten viele Umformulierungen derselben Fragen - damit wird gezielt die Robustheit des Aehnlichkeitsvergleichs geprueft.

Klausur-Niveau

Aufgabe 12 (Klausur-Niveau) - Feature-Matrix, tf-idf und Interpretation

Gegeben ist ein Mini-Korpus aus N=3N = 3 Dokumenten:

d1: "kamas kamas boss"
d2: "boss server"
d3: "kamas server boss"

(a) Stellen Sie die Bag-of-Words-Feature-Matrix ueber dem Vokabular [kamas, boss, server] auf (Zeilen = Dokumente, Zellen = Worthaeufigkeiten). (b) Berechnen Sie fuer d1 die tf-idf-Gewichte aller drei Vokabularworte mit tf\text{tf} = Rohhaeufigkeit und idf=log10(N/df)\text{idf}=\log_{10}(N/df). (c) Welches Wort ist in d1 am aussagekraeftigsten und warum? Welches Wort ist voellig uninformativ und warum?

Lösung anzeigen

(a) Bag-of-Words-Feature-Matrix:

IDkamasbossserver
d1210
d2011
d3111

(b) tf-idf fuer d1:

Zuerst df (Zahl der Dokumente, die das Wort enthalten):

TermDokumentedf
kamasd1, d32
bossd1, d2, d33
serverd2, d32

idf mit N=3N=3:

idf(kamas)=log32=log1,50,176\text{idf}(\text{kamas}) = \log \tfrac{3}{2} = \log 1{,}5 \approx 0{,}176 idf(boss)=log33=log1=0\text{idf}(\text{boss}) = \log \tfrac{3}{3} = \log 1 = 0 idf(server)=log320,176\text{idf}(\text{server}) = \log \tfrac{3}{2} \approx 0{,}176

tf-idf in d1 (tf * idf):

Termtf (d1)idftfidf
kamas20,1760,352
boss100
server00,1760

(c) Interpretation:

  • Am aussagekraeftigsten ist "kamas" (tf-idf = 0,352): Es kommt in d1 zweimal vor (hohes tf) und nur in einem Teil des Korpus (df = 2 < N), also idf > 0.
  • Voellig uninformativ fuer d1 ist "boss" (tf-idf = 0): Es steht in allen Dokumenten (df = N = 3), daher idf=log1=0\text{idf}=\log 1 = 0 - trotz Vorkommen in d1 traegt es nichts zur Unterscheidung bei. ("server" ist in d1 mit tf = 0 schlicht nicht vorhanden.)

Kapitel: EKI07

Falle: tf-idf = 0 kann zwei Ursachen haben: entweder tf = 0 (Wort fehlt im Dokument, hier "server") oder idf = 0 (Wort steht in allen Dokumenten, hier "boss"). Beide unbedingt unterscheiden koennen.

Tipp: Die Feature-Vektoren sind typischerweise hochdimensional und duenn besetzt (sparse) - hier sieht man schon bei drei Worten Nullen entstehen.

Aufgabe 13 (Klausur-Niveau) - Bag-of-Words: Prinzip, Grenzen, Erweiterungen

Erlaeutern Sie in einem zusammenhaengenden Text: (a) das Grundprinzip des Bag-of-Words-Modells, (b) zwei Nachteile des Modells, (c) wie tf-idf und (d) wie das n-Gramm-Modell jeweils einen dieser Nachteile mildern.

Lösung anzeigen

(a) Grundprinzip: Das Bag-of-Words-Modell repraesentiert einen Text als Multi-Set von Worten mit ihren Haeufigkeiten, ohne Grammatik und Wortreihenfolge. Daraus entstehen Feature-Vektoren fuer Machine Learning, in denen jede Vokabularspalte die Haeufigkeit eines Wortes zaehlt. Trotz seiner Einfachheit liefert BoW in manchen Anwendungen (z. B. Textklassifikation) erstaunlich gute Ergebnisse.

(b) Nachteile:

  1. Grammatik und Wortreihenfolge gehen verloren - Kontext wird nicht erfasst.
  2. Haeufige Fuellwoerter dominieren (z. B. "the", "a", "to"), obwohl sie wenig aussagen; zudem werden die Vektoren hochdimensional und duenn besetzt (sparse).

(c) tf-idf mildert das Fuellwort-Problem: Worthaeufigkeiten werden mit der inversen Dokumenthaeufigkeit normalisiert. Woerter, die in fast allen Dokumenten vorkommen (hohe df), werden abgewertet (idf=log(N/df)\text{idf}=\log(N/df), bei df = N sogar auf 0), seltene, unterscheidungsstarke Woerter werden aufgewertet.

(d) Das n-Gramm-Modell mildert den Reihenfolge-/Kontextverlust: Statt nur einzelner Worte (1-Gramme) betrachtet man Sequenzen aus N aufeinanderfolgenden Worten (z. B. Bigramme "John likes", "likes to"). So wird ein Stueck Wortreihenfolge erfasst. n-Gramme lassen sich ebenfalls zu Feature-Vektoren machen und mit tf-idf kombinieren.

Kapitel: EKI07

Tipp: Struktur fuer die Klausur: erst Prinzip, dann pro Nachteil die passende Erweiterung nennen (Fuellwoerter -> tf-idf, Reihenfolge -> n-Gramme). Beide Erweiterungen sind kombinierbar.