-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathnetzwerke.Rmd
135 lines (102 loc) · 9.83 KB
/
netzwerke.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
---
title: "Automatisierte Inhaltsanalyse mit R"
author: "Cornelius Puschmann"
subtitle: Texte und Wörter als Netzwerke
output: html_notebook
---
<!---
Todos
* Begriffs-Netzwerk MdBs mit Partei als Farbe
* mehr Beispiele (Enron-Korpus)
* ...
-->
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, weil sich eine Reihe von Beziehungen als Netzwerk abbilden lassen. Das betrifft einerseits Zusammenhänge zwischen Wörtern untereinander und zwischen Wörtern und Texten, aber auch zwischen syntaktischen Einheiten, die etwa bestimmte Argumentationsmuster kennzeichnen.
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.
```{r Installation und Laden der benötigten R-Bibliotheken, message = FALSE}
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")}
theme_set(theme_minimal())
```
#### Netzwerke mit quanteda
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.
```{r Laden der Daten und Berechnen einer DFM}
# Laden der Sherlock Holmes-Daten (bereits als RData-File gespeichert)
load("daten/sherlock/sherlock.absaetze.RData")
# Berechnen einer DFM
meine.dfm <- tokens(korpus, remove_numbers = TRUE, remove_punct = TRUE, remove_symbols = TRUE) %>%
tokens_ngrams(n = 2) %>%
dfm(tolower = FALSE)
```
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.
```{r Filtern der DFM nach Personennamen}
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()](https://quanteda.io/reference/textplot_network.html).
```{r Berechnen einer FCM und Plotten eines Textnetzwerkes}
meine.fcm <- fcm(meine.dfm.personen)
textplot_network(meine.fcm)
```
Auch wenn man sich noch nicht eingehend mit Netzwerken beschäftigt hat, lässt sich das Ergebnis leicht intuitiv interpretieren. Zwei Namen ("Knoten") sind dann mit einer Linie verbunden wenn sie innerhalb des gleichen Dokuments (in diesem Fall also im gleichen Absatz) vorkommen. Verbindungslinien ("Kanten") sind dort dicker, wo zwei Namen mehrmals gemeinsam erwähnt werden.
Die FCM ist die Grundlage des Netzwerkes. Während die Zeilen einer DFM die Dokumente und die Spalten die Wörter enthalten, enthält eine FCM Wörter als Zeilen und Spalten, und die Anzahl der Kookkurenzen als Zelleninhalt. Stimmen der Inhalt von Zeile und Spalte überein, wird einfach die Gesamtanzahl der Treffer im Korpus bezeichnet.
```{r Darstellung der FCM als Tabelle}
convert(meine.fcm, to = "data.frame")
```
#### Netzwerke mit qtextnets (eigener Code)
Was lässt sich aus der Kookkurenz von Begriffen in einem größeren Korpus ableiten? Wir laden folgend das Bundestags-Korpus und extrahieren zentrale Begriffe nach Redner mittels TD-IDF, um diese Frage zu beantworten. Zudem greifen wir an dieser Stell auf eine Gruppen von Funktionen zurück, die nicht aus quanteda stammen, sondern von dem R-Paket [textnets](https://github.com/cbail/textnets) inspiriert sind. Mit Hilfe von textnets lassen sich nicht nur die Beziehungen von Begriffen zu einander, sondern auch die Beziehung von Begriffen und Texten sowie von Texten auf Grundlage geteilter Begriffe darstellen. In unserer Implementation (abgelegt unter verschiedenes/qtextnets.R) gibt es dementsprechend drei Funktionen:
* textplot_mixednet(gemisches Dokument-Begriffsnetz)
* textplot_termnet(Begriffsnetz)
* textplot_docnet(Dokumentnetz)
Jede dieser Funktionen erwartet eine DFM als Input und berechnet aus dieser mit dem Paket igraph eine ungerichtetes Netzwerk. Folgend werden die drei Funktionen mit Beispielen illustriert.
Zunächst berechnen wir zwei DFMs: eine nach Parteien (Variable "party") und eine weitere nach MdB ("speaker_cleaned").
```{r Berechnung einer DFM nach Partei und einer weiteren nach MdB}
source("verschiedenes/qtextnets.R", echo = F)
load("daten/bundestag/bundestag.korpus.RData")
korpus.bundestag <- corpus_subset(korpus.bundestag, type == "speech")
meine.dfm.partei <-
dfm(korpus.bundestag,
groups = "party",
remove_numbers = TRUE,
remove_punct = TRUE,
remove_symbols = TRUE,
remove = stopwords("german")) %>%
dfm_trim(min_termfreq = 7, max_termfreq = 2283) %>%
dfm_tfidf(.)
meine.dfm.mdb <-
dfm(korpus.bundestag,
groups = "speaker_cleaned",
remove_numbers = TRUE,
remove_punct = TRUE,
remove_symbols = TRUE,
remove = stopwords("german")) %>%
dfm_trim(min_docfreq = 19, max_docfreq = 311) %>% # min = 3% aller MdBs, max = nicht mehr als die Hälfte aller MdBs
dfm_tfidf(.)
```
Nun verwenden zunächst die 50 distinktivsten Begriffe nach TF-IDF, um Unterschiede zwischen den Parteien bezüglich der Begriffsverwendung aufzuzeigen.
```{r Plotten eines Partei-Begriffsnetzwerkes}
netzwerk.begriffe.parteien <- scan("daten/bundestag/netzwerk_begriffe_parteien.txt", what = "char", sep = "\n", quiet = T)
meine.dfm.netzwerk <- dfm_keep(meine.dfm.partei, netzwerk.begriffe.parteien)
textplot_mixednet(meine.dfm.netzwerk, main = "Partei-Begriffsnetzwerk der distinktivsten Begriffe nach TF-IDF im Bundestagskorpus")
```
Wie man schnell erkennt, sind Begriffe wie "Wertentscheidung" (CSU) oder "Millionärssteuer" (LINKE) recht klar mit der Parteizugehörigkeit verknüpft. Ein änhlicher Ansatz lässt sich auch mit Bezug auf einzelne MdBs anstatt von Parteien wählen, auch hier wieder mit einem sehr kleinen Lexikon von nur 50 Begriffen.
```{r Plotten eines MdB-Begriffsnetzwerkes}
netzwerk.begriffe.mdbs <- scan("daten/bundestag/netzwerk_begriffe_abgeordnete.txt", what = "char", sep = "\n", quiet = T)
meine.dfm.netzwerk <- dfm_keep(meine.dfm.mdb, netzwerk.begriffe.mdbs) %>%
dfm_subset(docnames(.) %in% c("Sigmar Gabriel", "Thomas Oppermann", "Hubertus Heil", "Johannes Kahrs", "Dr. Anton Hofreiter", "Katrin Göring-Eckardt", "Volker Beck", "Dr. Joachim Pfeiffer", "Michael Grosse-Brömer", "Dr. Thomas de Maizière", "Alexander Dobrindt", "Max Straubinger", "Dr. Dietmar Bartsch", "Heike Hänsel", "Klaus Ernst", "Dr. Angela Merkel,"))
textplot_mixednet(meine.dfm.netzwerk, main = "MdB-Begriffsnetzwerk der distinktivsten Begriffe nach TF-IDF im Bundestagskorpus", maxdocs = 16)
```
Es lassen sich sowohl fachliche Schwerpunkte als auch z.T. Rückschlüsse über die Parteizugehörigkeit treffen, wobei das erste Netzwerk hier aufschlussreicher ist. Schließlich lassen sich auch die Beziehungen zwischen Begriffen analysieren, um Verwendungsmuster zu identifizieren. Dabei wird lediglich die Ähnlichkeit, welche Verfahren wie die in Kapitel 2 beschriebeben Funktionen [textstat_dist()](https://docs.quanteda.io/reference/textstat_frequency.html) und [textstat_simil()](https://docs.quanteda.io/reference/textstat_frequency.html) angewendet, um ein Netzwerk zu berechnen.
```{r Plotten eines Netzwerks distinktiver Begriffe}
meine.dfm <- dfm(korpus.bundestag) %>%
dfm_keep(., unique(c(netzwerk.begriffe.mdbs, netzwerk.begriffe.parteien)))
textplot_termnet(meine.dfm, "Begriffsnetzwerk distinktivster Begriffe im Bundestagskorpus")
```
Ein sehr ähnliches Ergebnis lässt sich auch mit der Funktion textplot_network() erzielen, welche auf der gleichen Grundlage beruht. Schließlich lässt sich auch noch ein reines Dokumentennetzwerk plotten, hier als Kreis angeordnet.
```{r Plotten eines MdB-Netzwerks nach geteilten Begriffen}
sprecher <- names(head(sort(table(korpus.bundestag.stats$speaker_cleaned[korpus.bundestag.stats$type=="speech"]), decreasing = T), 50))
meine.dfm.netzwerk <- dfm_subset(meine.dfm.mdb, docnames(meine.dfm.mdb) %in% sprecher)
textplot_docnet(meine.dfm.netzwerk, main = "MdB-Netzwerk nach geteilten Begriffen im Bundestagskorpus")
```
Abschließend lässt sich festhalten, das Netzwerke ein weiteres nützliches Werkzeug für die Analyse von Wort- und Textbeziehungen darstellen. Die Netzwerkanalyse kennt natürlich noch zahlreiche weitere relevante Techniken, allerdings besteht zum Teil einer Überlappung mit Metriken für die Erfassung von Wort- und Textähnlichkeit, für die die Netzwerkvisualisierung lediglich eine weitere Präsentationsform bietet. "Gemischte" Netzwerke, etwa aus Akteuren und Begriffen sind insofern ein interessantes Instrument, als dass wir gerade im Bereich der digitalen Kommunikation oftmals den Zusammenhang zwischen Nutzeraccounts oder Quellen zur Begriffswahl untersuchen, also in der Regel zahlreiche relevante Metadaten zu Texten vorliegen.