15  Preprocessing

Bevor wir Social-Media-Daten auswerten können, müssen wir diese aufbereiten. Insb. im Kontext von Textdaten wird dies auch als Preprocessing bezeichnet (zur Erinnerung: allgemeine Informationen zur Datenaufbereitung in R sind in Kapitel 8 und Kapitel 9 zu finden).

Kurz gesagt bezeichnet Preprocessing alle Schritte, die nötig sind, um die Daten für die Analyse vorzubereiten. Das Preprocessing für Textdaten (insb. solche aus Social Media) ist i.d.R. umfangreicher und Entscheidungen dazu sind einflussreicher als z.B. für Surveydaten, denn die Daten sind in aller Regel…

Bei der Aufbereitung von Textdaten gibt es entsprechend einige Herausforderungen. Zwei der wichtigsten sind hierbei:

  1. Die Auswahl und Abfolge der Preprocessing-Schritte, da diese die Analyseergebnisse beeinflussen.

  2. Der Umgang mit unterschiedlichen Textarten, -längen und Sprachen (sowie ggf. unterschiedlicher Zeichen)

Ein Thema, dem man bei der Arbeit mit Textdaten häufig begegnet, ist das sogennnnannte Character Encoding. Hierbei handelt es sich um die Art und Weise, wie Zeichen in Textdaten codiert werden. Es gibt verschiedene Arten von Character Encoding. ASCII ist der älteste Standard. Er enthält lediglich 128 Zeichen aus dem englischsprachigen Alphabet. Es gibt auch eigene Encodings für verschiedene Sprachräume (z.B. ISO-8859-1 bzw. Latin-1 für Westeuropa). Der umfangreichste Standard ist UTF-8. Dieser die enthält Zeichen aller Sprachen sowie Emoji. Wenn die Daten in einem anderen Encoding vorliegen als das, was R erwartet, kann es zu Problemen bei der Verarbeitung der Daten kommen. Wenn man die Auswahl hat, ist es in aller Regel am besten, mit UTF-8 zu arbeiten.

15.1 Textdaten-Vokabeln

Bevor wir uns mit den Preprocessing-Schritten beschäftigen, sollten wir zunächst einige wichtige Begriffe klären, die im Kontext von Textdaten häufig verwendet werden:

  • String: Ein String ist eine Folge von Zeichen, z.B. ein Wort, ein Satz oder ein ganzer Text.

  • Textkorpus: Ein Textkorpus ist eine Sammlung von Dokumenten. In unserem Fall also z.B. eine Sammlung von Bluesky-Posts oder YouTube-Kommentaren. Ein Textkorpus kann auch Metadaten zu den Dokumenten enthalten (im Social-Media-Kontext z.B. User Names oder Zeitstempel zur Veröffentlichung).

  • Dokument: Ein Dokument ist eine einzelne Einheit in einem Textkorpus. Für unseren Anwendungsfall also z.B. ein Bluesky-Post oder ein YouTube-Kommentar. Ein Dokument kann aus einem oder mehreren Strings bestehen.

  • Token: Ein Token ist eine einzelne Einheit in einem Text, z.B. ein Wort, ein Satzzeichen oder ein Hashtag. Das Aufteilen eines Textes in Tokens wird als Tokenisierung bezeichnet.

  • Type: Ein Type ist ein einzigartiges Token. Wenn z.B. das Wort “Hallo” in einem Text dreimal vorkommt (“Hallo Hallo Hallo”), dann gibt es drei Tokens, aber nur einen Type (“Hallo”).

  • Vokabular: Das Vokabular ist die Menge aller Types in einem Textkorpus. In vorherigen Beispiel wäre das Vokabular also {“Hallo”}.

  • Document-Feature-Matrix (DFM) (auch Document-Term-Matrix; DTM): Eine DFM ist eine Matrix, in der die Zeilen Dokumente (z.B. Posts oder Kommentare) und die Spalten Features (z.B. Wörter, Hashtags) darstellen. Die Werte in der Matrix geben an, wie oft ein bestimmtes Feature in einem bestimmten Dokument vorkommt.

15.2 Preprocessing-Schritte

Es gibt viele verschiedene mögliche Preprocessing-Schritte für Textdaten. Die Auswahl und Abfolge der Schritte hängt von verschiedenen Faktoren ab, z.B. von der Art der Daten, der geplanten Analyse und den Forschungsfragen. Es gibt jedoch einige Schritte, die in vielen Fällen sinnvoll sein können:

  • Erstellung eines Textkorpus

  • Tokenisierung (tokenization)

  • Entfernung oder Extraktion bestimmter Muster oder Symbole (z.B. Zeichensetzung, Zahlen, Emoji, URLs…)

  • Kleinschreibung (lowercasing)

  • Entfernung von Stoppwörtern (stopword removal)

  • Erstellung einer Document-Feature-Matrix (DFM)

15.3 Setup

Für das Preprocessing nutzen wir Funktionen aus dem Paket quanteda. Zudem nutzen wir auch wieder Pakete und Funktionen aus dem tidyverse.

library(quanteda)
library(tidyverse)

Für die Beispiele verwenden wir Daten von Bluesky und YouTube. Wir gehen hier/nachfolgend davon aus, dass Sie diese gesammelt und als bluesky_data.csv bzw. youtube_data.csv lokal gespeichert haben. Hinweise dazu, wie Sie diese Daten sammeln und speichern können, finden Sie im Abschnitt Daten am Ende von Kapitel 14.

bs_posts <- read.csv("./data/bluesky_data.csv") # Dateipfad ggf. anpassen

comments_yt <- read.csv("./data/youtube_data.csv") # Dateipfad ggf. anpassen

15.4 Erstellung eines Textkorpus

Ein häufiger erster Schritt bei der Aufbereitung von Textdaten ist die Erstellung eines Textkorpus. Hierbei werden die einzelnen Dokumente (in unseren Beispielen Bluesky-Posts, oder YouTube-Kommentare) in einer geeigneten Datenstruktur gespeichert, die auch Metadaten zu den Dokumenten enthalten kann (z.B. User Names oder Zeitstempel zur Veröffentlichung).

15.4.1 Bluesky

bluesky_corpus <- bs_posts %>% 
  distinct(uri, .keep_all = TRUE) %>% # jeder Post sollte nur einmal im Korpus vorkommen
  filter(is_reskeet == FALSE) %>% # keine Reposts
  select(uri, cid,
         author_handle, author_name,
         indexed_at, reply_count, repost_count,
         like_count, quote_count,
         is_reskeet,
         text) %>% 
  corpus(docid_field = "uri",
         text_field = "text")

bluesky_corpus
Corpus consisting of 2,555 documents and 9 docvars.
at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o :
"Sie hat mir eindrücklich vor Augen geführt, dass der Einsatz..."

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o :
"Ich hatte die tolle Gelegenheit, die diesjährige Trägerin de..."

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o :
"Entschuldigen Sie bitte, holen wir nach."

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26 :
"Während die Welt Partei ergreift, ergreift das IKRK Partei f..."

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26 :
"Es war mir eine Ehre, gestern in Hamburg diejenigen ins Lich..."

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d :
"und anderen humanitären Organisationen unterstützt, die die ..."

[ reached max_ndoc ... 2,549 more documents ]

Jeder Posts ist ein Dokument in diesem Korpus. docvars sind die Dokumentvariablen, also die Metadaten zu den Dokumenten. Hier sind das alle inkludierten Variablen außer der Dokument- bzw. Post-ID (uri) und dem Text des Posts (text).

15.4.2 YouTube

youtube_corpus <- comments_yt %>%
  select(CommentID, VideoID, ParentID,
         AuthorDisplayName,
         PublishedAt, ReplyCount, LikeCount,
         Comment) %>% 
  corpus(docid_field = "CommentID",
         text_field = "Comment")

youtube_corpus
Corpus consisting of 2,584 documents and 6 docvars.
UgwiakmTsk6z-aXOB394AaABAg :
"Die deutsche Präzision kennt keine Grenzen; sie tickt wie ei..."

UgzciKZHDm2Rn7S77rN4AaABAg :
"Frau Weidel durfte kaum reden, nicht mal ein Schlusswort und..."

Ugwh_wXilyGI8TNOewh4AaABAg :
"Großen Respekt an Frau Wagenknecht! So sachlich und alle ihr..."

UgzKQuf873jd2WlV1Rx4AaABAg :
"CDU wird der Untergang Deutschlands"

UgxXQaxCZcY34A-oxWB4AaABAg :
"Das die baerbock da überhaupt sitzen darf mit gefälschtem Le..."

UgyePGHlkVEqidKaoXR4AaABAg :
"Suuuper BSW ist raus... die Quittung für Thüringen"

[ reached max_ndoc ... 2,578 more documents ]

Jeder Kommentar ist ein Dokument in diesem Korpus. docvars sind die Dokumentvariablen, also die Metadaten zu den Dokumenten. Hier sind das alle inkludierten Variablen außer der Dokument- bzw. Kommentar-ID (CommentID) und dem Text des Kommentars (Comment).

15.5 Tokenisierung & Entfernung bestimmter Muster und Symbole

Es gibt sehr viele verschiedene sogenannte „Tokenizer“. Wir nutzen hier den Standard-Tokenizer von quanteda, der Wörter, Satzzeichen, Emojis, URLs und Hashtags als Tokens behandelt. Zusätzlich nutzen wir Argumente für die Funktion tokens(), um Satzzeichen (punctuation), Symbole, Zahlen und URLs zu entfernen. Es gibt weitere Optionen, die wir hier aber nicht verwenden (siehe ?tokens).

15.5.1 Bluesky

tokens_bluesky <- tokens(bluesky_corpus,
                       remove_punct = TRUE,
                       remove_symbols = TRUE,
                       remove_numbers = TRUE,
                       remove_url = TRUE)

tokens_bluesky
Tokens consisting of 2,555 documents and 9 docvars.
at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o :
 [1] "Sie"          "hat"          "mir"          "eindrücklich" "vor"         
 [6] "Augen"        "geführt"      "dass"         "der"          "Einsatz"     
[11] "für"          "eine"        
[ ... and 33 more ]

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o :
 [1] "Ich"         "hatte"       "die"         "tolle"       "Gelegenheit"
 [6] "die"         "diesjährige" "Trägerin"    "des"         "German"     
[11] "Africa"      "Prize"      
[ ... and 21 more ]

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o :
[1] "Entschuldigen" "Sie"           "bitte"         "holen"        
[5] "wir"           "nach"         

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26 :
 [1] "Während"        "die"            "Welt"           "Partei"        
 [5] "ergreift"       "ergreift"       "das"            "IKRK"          
 [9] "Partei"         "für"            "die"            "Menschlichkeit"
[ ... and 26 more ]

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26 :
 [1] "Es"         "war"        "mir"        "eine"       "Ehre"      
 [6] "gestern"    "in"         "Hamburg"    "diejenigen" "ins"       
[11] "Licht"      "zu"        
[ ... and 32 more ]

at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d :
 [1] "und"            "anderen"        "humanitären"    "Organisationen"
 [5] "unterstützt"    "die"            "die"            "Menschen"      
 [9] "vor"            "der"            "maßlosen"       "Gewalt"        
[ ... and 23 more ]

[ reached max_ndoc ... 2,549 more documents ]

15.5.2 YouTube

tokens_youtube <- tokens(youtube_corpus,
                       remove_punct = TRUE,
                       remove_symbols = TRUE,
                       remove_numbers = TRUE,
                       remove_url = TRUE)

tokens_youtube
Tokens consisting of 2,584 documents and 6 docvars.
UgwiakmTsk6z-aXOB394AaABAg :
 [1] "Die"       "deutsche"  "Präzision" "kennt"     "keine"     "Grenzen"  
 [7] "sie"       "tickt"     "wie"       "eine"      "Uhr"       "die"      
[ ... and 70 more ]

UgzciKZHDm2Rn7S77rN4AaABAg :
 [1] "Frau"        "Weidel"      "durfte"      "kaum"        "reden"      
 [6] "nicht"       "mal"         "ein"         "Schlusswort" "und"        
[11] "wurde"       "immer"      
[ ... and 4 more ]

Ugwh_wXilyGI8TNOewh4AaABAg :
 [1] "Großen"       "Respekt"      "an"           "Frau"         "Wagenknecht" 
 [6] "So"           "sachlich"     "und"          "alle"         "ihre"        
[11] "Begründungen" "sind"        
[ ... and 12 more ]

UgzKQuf873jd2WlV1Rx4AaABAg :
[1] "CDU"          "wird"         "der"          "Untergang"    "Deutschlands"

UgxXQaxCZcY34A-oxWB4AaABAg :
 [1] "Das"         "die"         "baerbock"    "da"          "überhaupt"  
 [6] "sitzen"      "darf"        "mit"         "gefälschtem" "Lebenslauf" 

UgyePGHlkVEqidKaoXR4AaABAg :
[1] "Suuuper"   "BSW"       "ist"       "raus"      "die"       "Quittung" 
[7] "für"       "Thüringen"

[ reached max_ndoc ... 2,578 more documents ]

Wenn Texte in Tokens zerlegt und diese gezählt werden, gehen syntaktische Informationen und die Reihenfolge von und Beziehungen zwischen Wörtern/Tokens verloren (z.B. auch Negation). Diese Art der Repräsentation von Textdaten wird als “Bag of Words” bezeichnet. Wenn das gemeinsame Auftreten von Wörtern/Tokens wichtig für die Analyse ist, zerlegt man Texte nicht in einzelne Wörter/Tokens (sog. Unigramme/unigrams), sondern Kombinationen von zwei (bigrams), drei (trigrams) oder mehr (n-grams) Wörter/Tokens. Trotz dieser Einschränkungen ist die Bag-of-Words-Repräsentation eine der am häufigsten genutzten Darstellungen von Textdaten für die Analyse, da sie einfach zu erstellen und zu interpretieren ist.

15.6 Kleinschreibung & Entfernung von Stoppwörtern

Weitere häufig genutzte Schritte sind die Umwandlung aller Tokens in Kleinbuchstaben (lowercasing) und die Entfernung von Stoppwörtern (stopword removal).

Ob man den Schritt der Kleinschreibung durchführt, hängt von verschiedenen Faktoren ab. Dazu gehören z.B.:

  • die Sprache(n), in der/denen die Texte vorliegen

  • die geplante Analyse (ob die Großschreibung für die Analyse relevant ist, z.B. bei der Erkennung von Eigennamen)

I.d.R. empfiehlt es sich, diesen Schritt zumindest für die Analyse von deutschen Texten durchzuführen, da die Großschreibung im Deutschen nicht nur am Satzanfang, sondern auch bei Nomen genutzt wird. Bei der Analyse von englischen Texten ist dies weniger relevant, da die Großschreibung hier nur am Satzanfang und bei Eigennamen genutzt wird.

Stoppwörter sind Wörter, die sehr häufig vorkommen aber in der Regel keine oder nur wenig Bedeutung für die Analyse haben, z.B. “und”, “der”, “die”, “das” im Deutschen. Es gibt verschiedene Listen von Stoppwörtern, z.B. die von quanteda bereitgestellten Listen für verschiedene Sprachen (siehe ?stopwords).

length(stopwords("de"))# Anzahl der Stoppwörter in der deutschen Liste von `quanteda`
[1] 231
length(stopwords("en")) # Anzahl der Stoppwörter in der englischen Liste von `quanteda`
[1] 175

Man kann mit der Funktion tokens_remove() von quanteda auch noch andere Wörter und Muster entfernen. Z..B. ist das Wort “dass” nicht in der deutschen Liste von Stoppwörtern von quanteda enthalten, aber es ist inhaltlich für sozialwissenschaftliche Analysen in aller Regel nicht interessant.

Das Paket tidytext bietet eine deutlich längere Liste an Stoppwörtern, jedoch nur für die englische Sprache (siehe ?stop_words).

nrow(tidytext::stop_words) # Anzahl der Stoppwörter in der englischen Liste von `tidytext`
[1] 1149

15.6.1 Bluesky

tokens_bluesky <- tokens_bluesky %>%
  tokens_tolower() %>% # Kleinschreibung
  tokens_remove(stopwords("de")) %>%  # Entfernung von deutschen Stoppwörtern
  tokens_remove("dass") # Entfernung von "dass"

15.6.2 YouTube

tokens_youtube <- tokens_youtube %>%
  tokens_tolower() %>% # Kleinschreibung
  tokens_remove(stopwords("de")) %>%  # Entfernung von deutschen Stoppwörtern
  tokens_remove("dass") # Entfernung von "dass"

15.7 Erstellung einer Document-Feature-Matrix (DFM)

Die Erstellung einer Document-Feature-Matrix (DFM) ist ein wichtiger Schritt im Preprocessing von Textdaten, da sie die Grundlage für viele Analysemethoden bildet. Eine DFM ist eine Matrix, in der die Zeilen Dokumente (in unseren Beispielen also Bluesky-Posts oder YouTube-Kommentare) und die Spalten Features (z.B. Wörter oder Hashtags) darstellen. Die Werte in den Zellen der Matrix geben an, wie oft ein bestimmtes Feature (z.B. ein Wort) in einem bestimmten Dokument (z.B. einem Post oder Kommentar) vorkommt.

15.7.1 Bluesky

dfm_bluesky <- dfm(tokens_bluesky)

dfm_bluesky
Document-feature matrix of: 2,555 documents, 12,512 features (99.86% sparse) and 9 docvars.
                                                                        features
docs                                                                     eindrücklich
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o            1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o            0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o            0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26            0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26            0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d            0
                                                                        features
docs                                                                     augen
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o     1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d     1
                                                                        features
docs                                                                     geführt
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o       1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d       0
                                                                        features
docs                                                                     einsatz
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o       1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26       0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d       0
                                                                        features
docs                                                                     freiheitliche
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o             1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d             0
                                                                        features
docs                                                                     demokratie
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o          1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o          1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o          0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26          0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26          0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d          0
                                                                        features
docs                                                                     theoretisches
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o             1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26             0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d             0
                                                                        features
docs                                                                     ideal
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o     1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d     0
                                                                        features
docs                                                                     realer
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o      1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o      0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o      0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26      0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26      0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d      0
                                                                        features
docs                                                                     kampf
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c5legs2o     1
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z2c2lc7s2o     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6z23utsq22o     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvcftv5c26     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m6wvc76kxs26     0
  at://did:plc:hngkefcientj2tq2gnspgfol/app.bsky.feed.post/3m65ir4fxhc2d     0
[ reached max_ndoc ... 2,549 more documents, reached max_nfeat ... 12,502 more features ]

Zur Erklärung: Die “documents” sind die Anzahl der Posts, die “Features” sind die Anzahl der einzigartigen Tokens (Types) im Korpus. Die Angabe “xx.yy% sparse” bedeutet, dass xx.yy% der Zellen in der DFM den Wert 0 haben, also dass das entsprechende Feature in dem entsprechenden Dokument nicht vorkommt.

15.7.2 YouTube

dfm_youtube <- dfm(tokens_youtube)

dfm_youtube
Document-feature matrix of: 2,584 documents, 9,819 features (99.89% sparse) and 6 docvars.
                            features
docs                         deutsche präzision kennt grenzen tickt uhr israels
  UgwiakmTsk6z-aXOB394AaABAg        1         1     1       1     1   1       1
  UgzciKZHDm2Rn7S77rN4AaABAg        0         0     0       0     0   0       0
  Ugwh_wXilyGI8TNOewh4AaABAg        0         0     0       0     0   0       0
  UgzKQuf873jd2WlV1Rx4AaABAg        0         0     0       0     0   0       0
  UgxXQaxCZcY34A-oxWB4AaABAg        0         0     0       0     0   0       0
  UgyePGHlkVEqidKaoXR4AaABAg        0         0     0       0     0   0       0
                            features
docs                         recht selbstverteidigung missachtet
  UgwiakmTsk6z-aXOB394AaABAg     3                  1          1
  UgzciKZHDm2Rn7S77rN4AaABAg     0                  0          0
  Ugwh_wXilyGI8TNOewh4AaABAg     0                  0          0
  UgzKQuf873jd2WlV1Rx4AaABAg     0                  0          0
  UgxXQaxCZcY34A-oxWB4AaABAg     0                  0          0
  UgyePGHlkVEqidKaoXR4AaABAg     0                  0          0
[ reached max_ndoc ... 2,578 more documents, reached max_nfeat ... 9,809 more features ]

15.8 Alternative Pakete für das Preprocessing

Eine weitere interessante Option für das Preprocessing von Textdaten in R ist das Paket textclean. Dieses kommt u.a. auch im KODAQS Toolbox Tutorial zur Aufbereitung von Textdaten zum Einsatz.

Ein Paket speziell für die Aufbereitung von YouTube-Daten ist tubecleanR für YouTube-Daten. Auch zu diesem gibt es ein umfangreiches Tutorial in der KODAQS Toolbox.

15.9 Weitere Aufbereitungsschritte

Neben den in den zuvor präsentierten Schritten sind auch weitere Preprocessing-Schritte möglich. Zu diesen gehören z.B. die Erkennung von Sprachen oder Pipelines, die Reduktion von Wörtern auf ihren Wortstamm durch Stemming aus dem Natural Language Processing (NLP), z.B. für die Lemmatisierung oder Part-of-Speech (POS) Tagging.

Mit NLP Pipelines für das Preprocessing befassen wir uns hier nicht weiter, aber es gibt zwei R-Pakete, die hierfür umfangreiche Funktionen bieten: udpipe und spacyr. Letzteres ist ein Wrapper für die sehr mächtige Python NLP Library spacy, weshalb man für die Nutzung auch Python und das Paket reticulate benötigt. Mögliche Anwendungsfälle können z.B. die Begrenzung von Analysen auf bestimmte Wortarten (z.B. Adjektive und/oder Nomen) oder die Identifikationen sogenannter “Named Entities” (Named Entity Recognition; NER) wie Personen, Orte oder Organisationen sein. Im Buch Computational Analysis of Communication gibt es einen eigenen Abschnitt zum “Linguistic Preprocessing”.

Auch für die Erkennung von Sprachen in Textdaten gibt es verschiedene Pakete in R, z.B. cld3, textcat oder fastText (siehe dazu auch das Tutorial von Lampros Mouselimis).

15.10 Weitere Repräsentationen von Textdaten

Neben Tokens und Document-Feature-Matrizen (DFMs) können auch andere Repräsentationen von Textdaten für die Analyse genutzt werden. Hierzu gehören insb. sog. n-grams, Collocations und Word Embeddings. Auf diese werden wir hier nicht näher eingehen, aber sie werden auch in entsprechenden Unterkapiteln des Online-Buchs Computational Analysis of Communication erklärt.