Die Beziehung von Texten und Wörtern zueinander lässt sich neben den bisher vorgestellen Techniken auch noch mit einem weiteren Ansatz untersuchen. Die Netzwerkanalyse stellt eine sehr wichtige Methode der Sozialwissenschaften dar, die grundsätzlich für die Untersuchung von Akteursbeziehungen von großer Relevanz ist. Sie ist aber darüber hinaus auch durchaus für die automatisierte Inhaltsanalyse von Bedeutung, zum einen, weil sich mit ihr etwa abbilden lässt, welche Akteure zusammen in einem Text genannte werden, aber auch dann, wenn beispielsweise ermittelt werden soll, wer ähnliche Begriffe verwendet.
Bereits im zweiten Kapitel wurde eine der wichtigsten Komponenten von quanteda eingeführt: die DFM. In diesem Kapitel wenden wir uns nun dem Pendant der DFM für die Untersuchung der Übereinstimmung von Wörtern zu, der Feature Co-occurance Matrix (FCM). Eine FCM enthält in ihren Zeilen und Spalten jeweils alle Wörter, die im Korpus vorkommen.
if(!require("quanteda")) {install.packages("quanteda"); library("quanteda")}
if(!require("tidyverse")) {install.packages("tidyverse"); library("tidyverse")}
if(!require("devtools")) {install.packages("devtools"); devtools::install_github("cbail/textnets")}
if(!require("textnets")) {devtools::install_github("cbail/textnets"); library("textnets")}
## Warning in library(package, lib.loc = lib.loc, character.only = TRUE,
## logical.return = TRUE, : there is no package called 'textnets'
## ggrepel (0.8.0 -> 0.8.1) [CRAN]
## hunspell (NA -> 3.0 ) [CRAN]
## janeaustenr (NA -> 0.1.5) [CRAN]
## networkD3 (NA -> 0.4 ) [CRAN]
## tidytext (NA -> 0.2.0) [CRAN]
## tokenizers (NA -> 0.2.1) [CRAN]
##
## There is a binary version available but the source version is
## later:
## binary source needs_compilation
## ggrepel 0.8.0 0.8.1 TRUE
##
##
## The downloaded binary packages are in
## /var/folders/t1/_sb1n3xn1xz5x02pt1lnlm480000gp/T//RtmpQc9qqr/downloaded_packages
##
checking for file ‘/private/var/folders/t1/_sb1n3xn1xz5x02pt1lnlm480000gp/T/RtmpQc9qqr/remotes99f1edd3b06/cbail-textnets-bc688a8/DESCRIPTION’ ...
✔ checking for file ‘/private/var/folders/t1/_sb1n3xn1xz5x02pt1lnlm480000gp/T/RtmpQc9qqr/remotes99f1edd3b06/cbail-textnets-bc688a8/DESCRIPTION’ (335ms)
##
─ preparing ‘textnets’:
##
checking DESCRIPTION meta-information ...
✔ checking DESCRIPTION meta-information
##
─ checking for LF line-endings in source and make files and shell scripts
##
─ checking for empty or unneeded directories
##
─ looking to see if a ‘data/datalist’ file should be added
##
─ building ‘textnets_0.1.1.tar.gz’
##
##
## Warning: replacing previous import 'dplyr::union' by 'igraph::union' when
## loading 'textnets'
## Warning: replacing previous import 'dplyr::as_data_frame' by
## 'igraph::as_data_frame' when loading 'textnets'
## Warning: replacing previous import 'dplyr::groups' by 'igraph::groups' when
## loading 'textnets'
theme_set(theme_bw())
Nachdem wir die notwendigen Bibliotheken gelanden haben, greifen wir eneut auf die Variante des Sherlock Holmes-Korpus zurück, welche die zwölf Romane in 174 Abschnitte gleicher Länge unterteilt. Wir erstellen eine DFM auf Basis von Bigrammen (Zweiwort-Folgen) in der wir die Unterscheidung zwischen Groß- und Kleinschreibung aufrechterhalten.
# Laden der Sherlock Holmes-Daten (bereits als RData-File gespeichert)
load("daten/sherlock/sherlock.absaetze.RData")
# Berechnen einer DFM
meine.dfm <- dfm(korpus, remove_numbers = TRUE, remove_punct = TRUE, remove_symbols = TRUE, tolower = F, ngrams = 2)
Dann Laden wir eine einfache Liste von Personen, welche in den Romanen vorkommen. Durch unterschiedliche Varianten des gleichen Namens (Sherlock Holmes vs. Mr. Holmes vs. Sherlock) ist dies Methode nicht ganz akkurat, es genügt aber für eine einfache Demonstration.
personen <- scan("daten/sherlock/sherlock.personen.txt", what = "char", sep = "\n", quiet = T)
meine.dfm.personen <- dfm_select(meine.dfm, personen, selection = "keep", case_insensitive = F)
Nun bereichnen wir eine Feature Cooccurance Matrix (FCM) welche auf der bereits vorhandenen DFM basiert. Dann plotten wir das Ergebnis als Netzwerk mit der quanteda-eigenen Funktion textplot_network().
meine.fcm <- fcm(meine.dfm.personen)
textplot_network(meine.fcm)
## Registered S3 method overwritten by 'network':
## method from
## summary.character quanteda