4 Regelbasierte Textanalyse
Am Beispiel der Tagesschau-Daten
Text in Nachrichtenartikeln ist unstrukturiert, aber nicht formlos. Überschriften folgen Mustern. Autoren wiederholen sich. Themen tauchen auf, verschwinden und kehren wieder. Regelbasierte Textanalyse macht genau diese Muster sichtbar, indem sie auf rohen Text Struktur projiziert: durch Suchen, Extrahieren, Transformieren und Zählen. In dieser Übung baut ihr mit dem Tagesschau-Datensatz eine vollständige Analysepipeline auf, vom einfachen Keyword-Suchen bis zur dictionary-basierten Themenklassifikation über zwei Jahrzehnte Nachrichtengeschichte.
Schritt 1: Pakete laden und Daten einlesen
1. Installiert und ladet mit pacman::p_load() die folgenden Pakete: tidyverse, skimr, tidytext, jsonlite, stopwords. Beschreibt in einem Satz, wozu tidytext, jsonlite und stopwords jeweils eingesetzt werden.
tidytext liefert unnest_tokens() und weitere Werkzeuge für die Tokenisierung von Texten. jsonlite parst JSON-Strings (wie die keywords- oder related_links-Spalte) in R-Objekte. stopwords stellt vorgefertigte Stoppwortlisten für viele Sprachen bereit.
2. Lest den Tagesschau-Datensatz mit read_csv() ein. Ergänzt direkt im selben Pipeline-Schritt zwei neue Variablen: year (Erscheinungsjahr aus date_time mit lubridate::year()) und date (nur das Datum als as.Date(date_time)).
Welche Spalten des Datensatzes enthalten freien Text, welche strukturierte Werte?
Freie Textspalten: title, shorttext, text, author, supertitle. Strukturierte Werte: ressort, tag, date_time, word_count, language.
Schritt 2: Texte durchsuchen und klassifizieren
3. Nutzt str_detect(), um vier neue logische Spalten zu erzeugen:
thema_klima(Muster"Klima"),thema_corona(Muster"Corona|COVID"),thema_ukraine(Muster"Ukraine") undthema_ki(Muster"\bKI\b|[Kk]ünstliche Intelligenz").
Sucht jeweils in der title-Spalte. Wie viele Artikel enthalten pro Thema das Muster?
news <- news |>
mutate(
thema_klima = str_detect(title, "Klima"),
thema_corona = str_detect(title, "Corona|COVID"),
thema_ukraine = str_detect(title, "Ukraine"),
thema_ki = str_detect(title, "\\bKI\\b|[Kk]ünstliche Intelligenz")
)
news |>
summarise(
Klima = sum(thema_klima, na.rm = TRUE),
Corona = sum(thema_corona, na.rm = TRUE),
Ukraine = sum(thema_ukraine, na.rm = TRUE),
KI = sum(thema_ki, na.rm = TRUE)
)4. Stellt die zeitliche Entwicklung aller vier Themen in einem Liniendiagramm dar. Berechnet zunächst die Anzahl der Treffer pro Jahr und Thema, überführt das Ergebnis mit pivot_longer() in Langform und plottet es mit ggplot2. Wann war Corona am stärksten präsent? Wann beginnt das Thema KI merklich zu wachsen?
news |>
group_by(year) |>
summarise(
Klima = sum(thema_klima, na.rm = TRUE),
Corona = sum(thema_corona, na.rm = TRUE),
Ukraine = sum(thema_ukraine, na.rm = TRUE),
KI = sum(thema_ki, na.rm = TRUE)
) |>
pivot_longer(-year, names_to = "Thema", values_to = "n") |>
ggplot(aes(x = year, y = n, color = Thema)) +
geom_line(linewidth = 0.9) +
geom_point(size = 1.5) +
labs(
x = "Jahr", y = "Artikel mit Treffer im Titel",
color = "Thema", title = "Themenkonjunkturen in Tagesschau-Überschriften"
)5. Die absoluten Zählungen aus Aufgabe 4 können irreführend sein: In späteren Jahren erscheinen generell mehr Artikel, sodass ein absoluter Anstieg auch einfach das gestiegene Gesamtvolumen widerspiegeln kann, statt eines echten inhaltlichen Bedeutungsgewinns. Berechnet daher die relative Häufigkeit jedes Themas pro Jahr als Anteil aller Artikel des jeweiligen Jahres in Prozent. Stellt die relativen Frequenzen als Liniendiagramm dar.
Vergleicht das Ergebnis mit dem Diagramm aus Aufgabe 4. Bei welchen Themen verändert sich das Bild? Was lässt sich nur aus der relativen Darstellung schließen?
Der Trick liegt darin, mean() statt sum() auf eine logische Spalte anzuwenden: mean(TRUE, FALSE, TRUE) ergibt 0,667, also direkt den Anteil. Kein separater Join mit den Jahresgesamtzahlen nötig.
news |>
group_by(year) |>
summarise(
Klima = mean(thema_klima, na.rm = TRUE) * 100,
Corona = mean(thema_corona, na.rm = TRUE) * 100,
Ukraine = mean(thema_ukraine, na.rm = TRUE) * 100,
KI = mean(thema_ki, na.rm = TRUE) * 100
) |>
pivot_longer(-year, names_to = "Thema", values_to = "anteil") |>
ggplot(aes(x = year, y = anteil, color = Thema)) +
geom_line(linewidth = 0.9) +
geom_point(size = 1.5) +
scale_y_continuous(labels = scales::label_percent(scale = 1)) +
labs(
x = "Jahr", y = "Anteil der Artikel (%)",
color = "Thema",
title = "Relative Themenfrequenz in Tagesschau-Überschriften"
)Der Unterschied ist besonders bei Corona sichtbar: Absolut bleibt die Kurve nach 2022 noch hoch, relativ fällt sie steil ab, weil das Gesamtvolumen stark gestiegen ist. Bei KI zeigt die relative Kurve, dass das Thema ab 2023 einen deutlich größeren Anteil an der Berichterstattung einnimmt, als es die absoluten Zahlen allein vermuten lassen.
6. stringr bietet neben str_detect() auch str_starts() und str_ends(). Nutzt str_starts(), um Artikel zu finden, deren Titel mit "Interview:" oder mit "Liveblog:" beginnen. Nutzt str_ends(), um Titel zu finden, die mit einem Fragezeichen enden. Wie viele Treffer liefern die drei Muster jeweils? Was ist der Unterschied zu str_detect() für dasselbe Suchmuster?
str_starts() und str_ends() sind semantisch präziser als str_detect() für Muster, die gezielt am Anfang oder Ende stehen sollen. Mit str_detect(title, "^Interview:") erreicht ihr dasselbe, aber explizite Funktionen sind lesbarer.
7. Viele Tagesschau-Titel folgen dem Muster "Format: Überschrift". Erstellt eine neue Variable format, die den Artikeltyp klassifiziert. Nutzt case_when() in Kombination mit str_starts() und Vergleichen auf die tag-Spalte. Unterscheidet mindestens: Interview, FAQ, Analyse, Hintergrund, Kommentar, Liveblog und Meldung als Auffangkategorie. Wie häufig ist jedes Format?
news <- news |>
mutate(
format = case_when(
str_starts(title, fixed("Interview:")) | tag == "INTERVIEW" ~ "Interview",
str_starts(title, fixed("FAQ:")) | tag == "FAQ" ~ "FAQ",
str_starts(title, fixed("Analyse:")) | tag == "ANALYSE" ~ "Analyse",
str_starts(title, fixed("Hintergrund:"))| tag == "HINTERGRUND" ~ "Hintergrund",
str_starts(title, fixed("Kommentar:")) | tag == "KOMMENTAR" ~ "Kommentar",
str_starts(title, fixed("Liveblog:")) | tag == "LIVEBLOG" ~ "Liveblog",
TRUE ~ "Meldung"
)
)
news |> count(format, sort = TRUE)8. Stellt die Formatverteilung für die vier größten Ressorts (ausland, wirtschaft, inland, wissen) als gestapeltes Balkendiagramm mit relativen Anteilen dar. Nutzt dafür geom_col(position = "fill") oder berechnet die Anteile explizit mit mutate(anteil = n / sum(n)). Welches Ressort hat den höchsten Anteil an FAQ-Artikeln? Welches an Analysen?
news |>
filter(ressort %in% c("ausland", "wirtschaft", "inland", "wissen")) |>
count(ressort, format) |>
group_by(ressort) |>
mutate(anteil = n / sum(n)) |>
ungroup() |>
ggplot(aes(x = ressort, y = anteil, fill = format)) +
geom_col() +
scale_y_continuous(labels = scales::percent_format()) +
labs(
x = "Ressort", y = "Anteil", fill = "Format",
title = "Artikelformate nach Ressort"
)Schritt 3: Texte bereinigen und strukturieren
Reale Datensätze sind selten sauber. Die Tagesschau-Daten enthalten HTML-Fragmente in Autorennamen, fehlerhafte Ressort-Einträge und uneinheitliche Schreibweisen. Bevor ihr analysiert, müsst ihr bereinigen.
9. Schaut euch die ressort-Spalte genau an: Gebt alle Ressorts mit weniger als 100 Artikeln aus. Welche Einträge sind offensichtlich fehlerhaft oder technischen Ursprungs? Erstellt anschließend eine bereinigte Version news_clean, die nur Artikel mit sinnvollen Ressort-Werten enthält. Wie viele Zeilen werden dabei entfernt?
Im Datensatz gibt es offensichtlich falsche Einträge, z.B. "Einstellungen einblenden Pfeil rechts" mit 260 Artikeln – ein Web-Scraping-Artefakt, kein echtes Ressort.
news |> count(ressort, sort = TRUE) |> print(n = 30)
saubere_ressorts <- c(
"ausland", "wirtschaft", "inland", "wissen",
"investigativ", "faktenfinder", "newsticker",
"multimedia", "kommentar", "kultur", "europawahl",
"eilmeldung", "nachrichten", "sport",
"jahresrueckblick", "wetter", "schlusslicht"
)
news_clean <- news |> filter(ressort %in% saubere_ressorts)
nrow(news) - nrow(news_clean)10. Die Spalte author enthält viele Unregelmäßigkeiten: HTML-Tags wie <em>...</em>, Präfixe wie "Von " und Quellenangaben wie ", ARD-Studio Brüssel". Bereinigt die Spalte schrittweise und speichert das Ergebnis als author_clean. Wendet folgende Schritte der Reihe nach an: (1) HTML-Tags entfernen, (2) führendes "Von " entfernen, (3) alles ab dem ersten Komma entfernen, (4) Leerzeichen normalisieren mit str_squish(). Überprüft das Ergebnis mit einigen Beispielzeilen.
11. Ermittelt mit der bereinigten author_clean-Spalte die 15 produktivsten Autorinnen und Autoren im Datensatz. Filtert leere Strings und NA-Werte heraus. Stellt das Ergebnis als horizontales Balkendiagramm dar, sortiert nach Häufigkeit. Welche Redaktionen oder Studios tauchen auf?
12. Viele Tagesschau-Titel folgen dem Muster "Stichwort: Eigentliche Überschrift". Trennt dieses Muster auf: Erstellt eine Variable stichwort (Text vor dem ersten Doppelpunkt, bereinigt mit str_trim()) und eine Variable ueberschrift (Text nach dem Doppelpunkt). Für Artikel ohne Doppelpunkt soll stichwort NA sein und ueberschrift dem vollen Titel entsprechen. Welche zehn Stichworte kommen am häufigsten vor?
news <- news |>
mutate(
hat_doppelpunkt = str_detect(title, ":"),
stichwort = if_else(hat_doppelpunkt,
str_trim(str_extract(title, "^[^:]+")),
NA_character_),
ueberschrift = if_else(hat_doppelpunkt,
str_trim(str_remove(title, "^[^:]+:\\s*")),
title)
)
news |>
filter(!is.na(stichwort)) |>
count(stichwort, sort = TRUE) |>
slice_max(n, n = 10)13. Reguläre Ausdrücke (Regex) ermöglichen komplexere Suchmuster. Sucht in der title-Spalte nach:
- Prozentzahlen wie
"47 Prozent"oder"3,5 Prozent"
- Prozentzahlen wie
- Zitate in Anführungszeichen
Wie viele Treffer gibt es jeweils? Gebt fünf Beispieltitel pro Kategorie aus.
# (a) Prozentzahlen
news |>
filter(str_detect(title, "\\d+[,.]?\\d*\\s*Prozent")) |>
mutate(treffer = str_extract(title, "\\d+[,.]?\\d*\\s*Prozent")) |>
select(title, treffer) |>
head(5)
# (b) Zitate
news |>
filter(str_detect(title, '"[^"]+"')) |>
mutate(zitat = str_extract(title, '"[^"]+"')) |>
select(title, zitat) |>
head(5)Schritt 4: Strukturierte Textfelder parsen
Manche Spalten sind keine einfachen Zeichenketten, sondern serialisierte Datenstrukturen: JSON-Arrays, die als Text gespeichert wurden. jsonlite::fromJSON() macht daraus echte R-Objekte, die ihr dann mit den gewohnten tidyverse-Werkzeugen weiterverarbeiten könnt.
14. Die Spalte keywords enthält JSON-Arrays wie ["EU", "Trump", "Ukraine"]. Parst diese Spalte mit map() und jsonlite::fromJSON() und bringt den Datensatz mit unnest() in eine Langform, sodass jede Zeile ein Keyword enthält. Nutzt possibly() aus purrr, um fehlerhafte JSON-Strings sicher abzufangen. Wie viele Keyword-Einträge gibt es insgesamt? Erstellt eine Rangliste der 20 häufigsten Keywords als Balkendiagramm.
news_kw <- news |>
filter(!is.na(keywords), keywords != "[]", keywords != "") |>
select(url, year, ressort, keywords) |>
mutate(
kw_list = map(keywords, possibly(\(x) fromJSON(x), otherwise = character(0)))
) |>
unnest(kw_list) |>
rename(keyword = kw_list)
nrow(news_kw)
news_kw |>
count(keyword, sort = TRUE) |>
slice_max(n, n = 20) |>
ggplot(aes(x = fct_reorder(keyword, n), y = n)) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(x = "Keyword", y = "Häufigkeit", title = "Top-20-Keywords im Datensatz")15. Wählt vier Keywords aus (z.B. "Trump", "Coronavirus", "Ukraine", "Klimawandel") und stellt deren Häufigkeit pro Jahr als Liniendiagramm dar. Filtert auf Artikel ab 2010. Lässt sich der Beginn des Ukraine-Kriegs 2022 ablesen? Wann verschwand Coronavirus von der Agenda?
auswahl <- c("Trump", "Coronavirus", "Ukraine", "Klimawandel")
news_kw |>
filter(keyword %in% auswahl, year >= 2010) |>
count(year, keyword) |>
ggplot(aes(x = year, y = n, color = keyword)) +
geom_line(linewidth = 0.9) +
geom_point(size = 1.5) +
labs(
x = "Jahr", y = "Artikel mit Keyword",
color = "Keyword", title = "Keyword-Trends im Zeitverlauf"
)16. Die Spalte related_links enthält JSON-Arrays von Objekten. Parst diese Spalte analog zu keywords, sodass ihr eine Zeile pro Link habt. Extrahiert aus den Link-URLs mit einem regulären Ausdruck die Domain und erstellt eine Rangliste der 15 häufigsten externen Domains (ohne tagesschau.de und ard.de).
news_links <- news |>
filter(!is.na(related_links), related_links != "[]", related_links != "") |>
select(artikel_url = url, year, ressort, related_links) |>
mutate(
link_daten = map(
related_links,
possibly(\(x) fromJSON(x) |> as_tibble(), otherwise = tibble())
)
) |>
unnest(link_daten) |>
mutate(
domain = str_remove(
str_extract(url, "https?://[^/]+"),
"https?://"
)
)
news_links |>
filter(
!is.na(domain),
!str_detect(domain, "tagesschau|\\bard\\.de")
) |>
count(domain, sort = TRUE) |>
slice_max(n, n = 15) |>
ggplot(aes(x = fct_reorder(domain, n), y = n)) +
geom_col(fill = "coral") +
coord_flip() +
labs(x = "Domain", y = "Anzahl Links", title = "Häufig verlinkte externe Domains")Schritt 5: Tokenisierung und Worthäufigkeiten
Für eine systematische Textanalyse zerlegt man Texte in einzelne Tokens, die kleinsten bedeutungstragenden Einheiten. Das tidytext-Paket fügt sich dabei nahtlos in den Tidyverse-Workflow ein und macht Texte tabellenartig behandelbar.
17. Tokenisiert die title-Spalte mit unnest_tokens() aus tidytext. Behaltet dabei url, year und ressort. Was macht unnest_tokens() automatisch mit Groß- und Kleinschreibung und mit Satzzeichen? Wie viele Tokens enthält der gesamte Datensatz?
unnest_tokens() setzt standardmäßig alles auf Kleinschreibung, trennt an Leerzeichen und Satzzeichen und entfernt Satzzeichen als eigene Einheit.
18. Ladet mit eine deutsche Stoppwortliste und entfernt diese aus den Daten mit anti_join(). Filtert zusätzlich alle Tokens heraus, die kürzer als drei Zeichen sind oder ausschließlich aus Ziffern bestehen (str_detect(word, "^\\d+$")). Wie viele Tokens bleiben nach der Bereinigung übrig?
19. Ermittelt die 20 häufigsten Wörter in den Tagesschau-Überschriften nach der Bereinigung und stellt sie als horizontales Balkendiagramm dar. Welche Wörter erscheinen, und entspricht das euren Erwartungen? Gibt es Wörter in der Liste, die ihr für inhaltlich wenig aussagekräftig haltet und die noch herausgefiltert werden könnten?
20. Vergleicht die häufigsten Wörter in den vier größten Ressorts (ausland, wirtschaft, inland, wissen) in einem facettierten Diagramm mit je zehn Wörtern pro Ressort. Nutzt reorder_within() und scale_x_reordered() aus tidytext, damit die Wörter innerhalb jedes Facetts korrekt sortiert sind. Was verraten die Unterschiede über die inhaltlichen Schwerpunkte der Ressorts?
titel_tokens_clean |>
filter(ressort %in% c("ausland", "wirtschaft", "inland", "wissen")) |>
count(ressort, word) |>
group_by(ressort) |>
slice_max(n, n = 10) |>
ungroup() |>
ggplot(aes(x = reorder_within(word, n, ressort), y = n, fill = ressort)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ressort, scales = "free") +
scale_x_reordered() +
coord_flip() +
labs(x = "Wort", y = "Häufigkeit", title = "Top-Wörter nach Ressort")21. Die reine Häufigkeit bevorzugt Wörter, die in allen Ressorts vorkommen. TF-IDF (Term Frequency – Inverse Document Frequency) gewichtet Wörter so, dass charakteristische, ressortspezifische Begriffe hervorgehoben werden. Berechnet TF-IDF mit bind_tf_idf(word, ressort, n) aus tidytext und stellt die jeweils fünf charakteristischsten Wörter pro Ressort als facettiertes Balkendiagramm dar.
tfidf <- titel_tokens_clean |>
filter(ressort %in% c("ausland", "wirtschaft", "inland", "wissen", "faktenfinder")) |>
count(ressort, word) |>
bind_tf_idf(word, ressort, n)
tfidf |>
group_by(ressort) |>
slice_max(tf_idf, n = 5) |>
ungroup() |>
ggplot(aes(x = reorder_within(word, tf_idf, ressort), y = tf_idf, fill = ressort)) +
geom_col(show.legend = FALSE) +
facet_wrap(~ressort, scales = "free") +
scale_x_reordered() +
coord_flip() +
labs(x = "Wort", y = "TF-IDF", title = "Charakteristische Wörter je Ressort (TF-IDF)")22. Vergleicht die TF-IDF-Ergebnisse mit den reinen Häufigkeiten aus Aufgabe 19 für ein oder zwei Ressorts. Welche Wörter sind in beiden Listen? Welche tauchen nur bei TF-IDF auf? Was sagt euch das über die Stärken und Schwächen beider Maße als Beschreibung von Textinhalten?
Reine Häufigkeit bevorzugt allgemeine Begriffe, die in allen Ressorts dominant sind (z.B. “deutschland”, “regierung”). TF-IDF hebt ressortspezifische Fachbegriffe hervor: im Ressort wissen zum Beispiel “studie”, “forscher”, “gen”; in wirtschaft “dax”, “inflation”, “ezb”. Wörter wie “ukraine” oder “usa” erscheinen bei ausland in beiden Listen, weil sie sowohl häufig als auch charakteristisch sind.
Schritt 6: Wörterbuch-basierte Klassifikation und Reflexion
Bisher habt ihr einzelne Muster untersucht. Jetzt geht es um systematische Klassifikation: Ihr erstellt ein Themen-Dictionary und wendet es auf den gesamten Datensatz an. Das ist deduktive Inhaltsanalyse – ihr bringt eure theoretischen Kategorien mit und sucht sie im Text.
23. Erstellt ein Themen-Dictionary in Excel und ladet es als Tibble mit den Spalten word (Kleinbuchstaben) und thema. Deckt mindestens vier Themen ab: Klimapolitik, Sicherheit & Krieg, Wirtschaft & Finanzen und Gesundheit.
Verwendet pro Thema mindestens fünf charakteristische Wörter. Welche Wörter könnten zu Fehlzuordnungen führen?
dictionary <- tribble(
~word, ~thema,
"klima", "Klimapolitik",
"klimaschutz", "Klimapolitik",
"klimawandel", "Klimapolitik",
"emission", "Klimapolitik",
"erneuerbar", "Klimapolitik",
"windenergie", "Klimapolitik",
"krieg", "Sicherheit",
"angriff", "Sicherheit",
"nato", "Sicherheit",
"militär", "Sicherheit",
"waffe", "Sicherheit",
"bundeswehr", "Sicherheit",
"inflation", "Wirtschaft",
"zinsen", "Wirtschaft",
"rezession", "Wirtschaft",
"haushalt", "Wirtschaft",
"konjunktur", "Wirtschaft",
"arbeitslosigkeit", "Wirtschaft",
"corona", "Gesundheit",
"impfung", "Gesundheit",
"krankenhaus", "Gesundheit",
"virus", "Gesundheit",
"pandemie", "Gesundheit",
"gesundheit", "Gesundheit"
)24. Wendet das Dictionary auf die tokenisierten Titel an. Nutzt left_join() zwischen dem bereinigten Token-Datensatz und dem Dictionary. Wie viele Artikel lassen sich den vier Themen zuordnen?
25. Stellt die Entwicklung aller vier Themen ab 2006 als Liniendiagramm dar. Beschreibt Auffälligkeiten in der zeitlichen Entwicklung der Themen.
26. Ruft zehn zufällige Artikel auf, die dem Thema Klimapolitik zugeordnet wurden (slice_sample(n = 10)), und inspiziert ihre Titel. Sind die Zuordnungen korrekt? Gebt je ein konkretes Beispiel für einen möglichen falsch-positiven Treffer (Artikel wird fälschlich zugeordnet) und einen möglichen falsch-negativen Treffer (Artikel müsste zugeordnet werden, wird es aber nicht).
Was könnt ihr tun, um das Ergebnis zu verbessern?
Falsch-positiv: Ein Artikel über “Klimagespräche zwischen Außenministern” könnte als Klimapolitik eingestuft werden, obwohl er diplomatischer Natur ist. Falsch-negativ: Ein Artikel über “CO₂-Bepreisung im Verkehr” würde nicht erkannt, weil keines unserer Dictionary-Wörter vorkommt.
27. Die regelbasierte Textanalyse, die ihr in dieser Übung angewendet habt, ist eine Form der deduktiven Inhaltsanalyse. Diskutiert die folgenden Fragen:
- Was sind die zentralen Stärken dieses Ansatzes gegenüber manuellem Durchlesen?
- Was wäre ein induktiver Ansatz (z.B. Topic Modeling), und in welcher Situation würdet ihr ihn bevorzugen?
- Nennt zwei Situationen, in denen regelbasierte Textanalyse klar an ihre Grenzen stößt.
Stärken der deduktiven Analyse: skalierbar auf Hunderttausende Artikel, reproduzierbar, transparent und leicht zu erklären. Grenzen: Das Dictionary muss vollständig und präzise sein; Verneinungen (“kein Krieg”), Ironie und implizites Framing werden nicht erkannt; mehrdeutige Wörter erzeugen systematische Fehler (“Flügel” in Musik vs. Politik).
Ein induktiver Ansatz wie Topic Modeling (z.B. LDA) entdeckt Themen direkt aus den Häufigkeitsmustern im Text, ohne Vorannahmen. Er ist besser geeignet, wenn man nicht weiß, welche Themen vorhanden sind, und möchte den Text “sprechen lassen”. Der Nachteil: Die Themen sind schwer zu benennen und die Ergebnisse schlechter zu validieren.
Klare Grenzen regelbasierter Analyse: (1) Verneinungen (“Trump verliert an Bedeutung” vs. “Trump gewinnt”); (2) Neologismen und neue Ereignisse, die noch nicht im Dictionary stehen.
Zusatzmaterial
Zu diesem Experiment gibt es folgendes Zusatzmaterial: