Heutiger Testrakeketenteststart - Stufe 2e
Eine Teilstufe ist noch mal dazugekommen. Und bei der Gelegenheit bin ich auf die Idee gekommen, vor den nächsten Stufen und Teilstufen die folgende Anleitung separat ganz durchzukauen:
Automatisierte Inhaltsanalyse mit R
Daraus entnommen ist der Teil, um den es in diesem Post geht:
Automatisierte Inhaltsanalyse mit R
The United Nations United Nations
833 296
The General Assembly Organization
264 168
The Security Council Assembly
165 151
State Government
131 83
Security Council Powers
73 71
Council Governments
43 30
Liberia General Assembly
30 29
The European Union The European Community
27 26
Oau Plo
24 24
Islam States
23 22
The Millennium Development Goals Tuvalu
22 20
Maldives Khmer
19 18
The Organization Of African Unity
17
Obiger Code wie gehabt Hempel-omx-owoxomo-durchgeschüttelt-und-gerührt: Funzt (außer, wo angegeben - siehe oben!)!
Automatisierte Inhaltsanalyse mit R
Daraus entnommen ist der Teil, um den es in diesem Post geht:
Automatisierte Inhaltsanalyse mit R
Tagging, Parsing und Entitätenerkennung
# Benötigte Pakete instalieren
# Warnungen und Fehler beachten!
# Ggf. manuell installieren
# Auf Ubuntu 19.04 musste ich libcurl über apt installieren:
# https://stackoverflow.com/questions/42115972/configuration-failed-because-libcurl-was-not-found
# Und lxml2-dev:
# sudo apt install libxml2
# Und auf Verdacht: sudo apt-get install r-cran-rcppeigen
# https://github.com/quanteda/quanteda/issues/1241
if(!require("quanteda")) install.packages("quanteda")
if(!require("tidyverse")) install.packages("tidyverse")
if(!require("scales")) install.packages("scales")
if(!require("udpipe")) {install.packages("udpipe"); library("udpipe")}
if(!require("googlenlp")) {install.packages("googlenlp"); library("googlenlp")}
# Installierte Pakete auswählen
library(quanteda)
library(tidyverse)
library(scales)
library(udpipe)
library(googlenlp)
# Programmablauf
theme_set(theme_bw())
## Sprachmodel downloaden, falls noch nicht vorhanden
if (!file.exists("verschiedenes/german-gsd-ud-2.4-190531.udpipe"))
udpipe_download_model(language = "german", model_dir = "verschiedenes") # download model if it doesn't exist
## Sprachmodel laden
sprachmodell.udpipe <- udpipe_load_model(file = "verschiedenes/german-gsd-ud-2.4-190531.udpipe")
## Beispielsatz einlesen und annotieren
beispiel <- udpipe_annotate(sprachmodell.udpipe, "Dies ist ein einfacher Beispielsatz.")
beispiel <- as.data.frame(beispiel, detailed = T)
beispiel
## Hümpel-pi-Bümpel
load("daten/zeit/zeit.sample.korpus.RData")
zeit.sample <- texts(zeit.korpus)
zeit.pos <- udpipe_annotate(sprachmodell.udpipe, zeit.sample, doc_id = docnames(zeit.korpus), tagger = "default", parser = "none")
zeit.pos.df <- as.data.frame(zeit.pos)
nomen.fem <- filter(zeit.pos.df, upos == "NOUN" & str_detect(feats, "Gender=Fem") & str_detect(lemma, "in$"))
nomen.masc <- filter(zeit.pos.df, upos == "NOUN" & str_detect(feats, "Gender=Masc") & str_detect(lemma, "er$"))
as.data.frame(head(sort(table(nomen.fem$lemma, dnn = list("Term")), decreasing = T), 10), responseName = "Frequenz")
## Hampel-pü-Bampel
as.data.frame(head(sort(table(nomen.masc$lemma, dnn = list("Term")), decreasing = T), 10), responseName = "Frequenz")
# Weitergehende Analyse mittels spacyr
if (!require("spacyr")) {
install.packages("spacyr")
library("spacyr")
spacy_install()
spacy_download_langmodel("de")
}
## !!! Wischtisch !!!
## Ich musste erst ein Virtualenv 'spacy_virtualenv' in meinem Home-Ordner anlegen
## und dort spacy mit Python3 installieren, sowie das Sprachpaket downloaden:
## virtualenv --python=python3 spacy_virtualenv
## pip3 install --user spacy
## python3 -m spacy download --user de
load("daten/cosmas/finanzkrise/finanzkrise.korpus.RData")
korpus.finanzkrise.sample <- corpus_sample(korpus.finanzkrise, size = 1000)
spacy_initialize(mode = "de")
finanzkrise.pos <- spacy_parse(korpus.finanzkrise.sample, lemma = F, entity = T, dependency = T)
spacy_finalize()
head(finanzkrise.pos, 100)
subjekte <- finanzkrise.pos %>%
filter(pos == "NOUN", dep_rel == "sb") %>%
mutate(Wort = str_to_lower(token)) %>%
group_by(Wort) %>%
summarise(Frequenz = n()) %>%
arrange(desc(Frequenz)) %>%
mutate(Rang = row_number()) %>%
filter(Rang <= 25)
ggplot(subjekte, aes(reorder(Wort, Rang), Frequenz)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + xlab("") + ggtitle("Frequenteste Satzsubjekte im Finanzkrise-Korpus")
## Für das folgende Beispiel mit englischem Text musste ich noch:
## python3 -m spacy download --user en
## ausführen (englisches Sprachmodel für SpaCy downloaden)
load("daten/twitter/trumpclinton.korpus.RData")
spacy_initialize(mode = "en")
twitter.pos <- spacy_parse(korpus, lemma = F, entity = F)
spacy_finalize()
head(twitter.pos, 100)
adjektive.trumpclinton <- scan("daten/twitter/adjektive.trumpclinton.txt", what = "char", sep = "\n", quiet = T)
adjektive <- twitter.pos %>%
mutate(Wort = str_to_lower(token)) %>%
filter(pos == "ADJ", Wort %in% adjektive.trumpclinton) %>%
left_join(korpus.stats, by = c("doc_id" = "Text")) %>%
group_by(Wort, Kandidat) %>%
summarise(Frequenz = n()) %>%
complete(Wort, Kandidat) %>%
replace(., is.na(.), 0) %>%
arrange(Wort, Kandidat)
adjektive.diff <- data.frame(Wort = unique(adjektive$Wort), Differenz = adjektive$Frequenz[adjektive$Kandidat == "Clinton"] - adjektive$Frequenz[adjektive$Kandidat == "Trump"]) %>%
mutate(Differenz.S = as.vector(scale(Differenz, center = 0))) %>%
arrange(Differenz.S)
ggplot(adjektive.diff, aes(reorder(Wort, Differenz.S), Differenz.S)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) + xlab("") + ggtitle("Adjektive Trump vs. Clinton (mit 'great', 'big' enfernt)") + ylab("Trump Clinton") + coord_flip()
## Lexikon generieren
### Vorsicht! Ein sehr speicherintensiver Vorgang.
### Ich bin allerdings mit ca. 4GB auch ein bissi dünn ausgestattet.
load("daten/un/un.korpus.RData")
korpus.un.sample <- corpus_sample(korpus.un, size = 100)
spacy_initialize(mode = "en")
un.parsed <- spacy_parse(korpus.un.sample, pos = F, lemma = F)
un.entities <- entity_extract(un.parsed)
spacy_finalize()
organizations <- un.entities$entity[un.entities$entity_type=="ORG"] %>%
str_remove("\n|\t") %>%
str_replace_all("_+", " ") %>%
str_trim(.) %>%
str_to_title(.) %>%
table(.) %>%
sort(., decreasing = T)
head(organizations[names(organizations)!=""], 25)
# Annotation mit Hilfe des Paketes googlenlp und der Cloud Natural Language API
## Geht nur mit Hinterlegung einer Kreditkarte als Zahlungsmittel.
## Darauf verzichte ich zunächst mal, deswegen überspringe ich diesen Schritt.
#gl.apikey <- scan("verschiedenes/googlenlp_api.key", what = "char", quiet = T)
#set_api_key(gl.apikey)
#gl.annotation <- annotate_text("Dies ist ein einfacher Satz, analysiert mit den Diensten von Google.")
#gl.annotation$tokens
## Trotzdem eine interessante Möglichkeit:
## Google Cloud Natural Language API
# Warnungen und Fehler beachten!
# Ggf. manuell installieren
# Auf Ubuntu 19.04 musste ich libcurl über apt installieren:
# https://stackoverflow.com/questions/42115972/configuration-failed-because-libcurl-was-not-found
# Und lxml2-dev:
# sudo apt install libxml2
# Und auf Verdacht: sudo apt-get install r-cran-rcppeigen
# https://github.com/quanteda/quanteda/issues/1241
if(!require("quanteda")) install.packages("quanteda")
if(!require("tidyverse")) install.packages("tidyverse")
if(!require("scales")) install.packages("scales")
if(!require("udpipe")) {install.packages("udpipe"); library("udpipe")}
if(!require("googlenlp")) {install.packages("googlenlp"); library("googlenlp")}
# Installierte Pakete auswählen
library(quanteda)
library(tidyverse)
library(scales)
library(udpipe)
library(googlenlp)
# Programmablauf
theme_set(theme_bw())
## Sprachmodel downloaden, falls noch nicht vorhanden
if (!file.exists("verschiedenes/german-gsd-ud-2.4-190531.udpipe"))
udpipe_download_model(language = "german", model_dir = "verschiedenes") # download model if it doesn't exist
## Sprachmodel laden
sprachmodell.udpipe <- udpipe_load_model(file = "verschiedenes/german-gsd-ud-2.4-190531.udpipe")
## Beispielsatz einlesen und annotieren
beispiel <- udpipe_annotate(sprachmodell.udpipe, "Dies ist ein einfacher Beispielsatz.")
beispiel <- as.data.frame(beispiel, detailed = T)
beispiel
## Hümpel-pi-Bümpel
load("daten/zeit/zeit.sample.korpus.RData")
zeit.sample <- texts(zeit.korpus)
zeit.pos <- udpipe_annotate(sprachmodell.udpipe, zeit.sample, doc_id = docnames(zeit.korpus), tagger = "default", parser = "none")
zeit.pos.df <- as.data.frame(zeit.pos)
nomen.fem <- filter(zeit.pos.df, upos == "NOUN" & str_detect(feats, "Gender=Fem") & str_detect(lemma, "in$"))
nomen.masc <- filter(zeit.pos.df, upos == "NOUN" & str_detect(feats, "Gender=Masc") & str_detect(lemma, "er$"))
as.data.frame(head(sort(table(nomen.fem$lemma, dnn = list("Term")), decreasing = T), 10), responseName = "Frequenz")
## Hampel-pü-Bampel
as.data.frame(head(sort(table(nomen.masc$lemma, dnn = list("Term")), decreasing = T), 10), responseName = "Frequenz")
# Weitergehende Analyse mittels spacyr
if (!require("spacyr")) {
install.packages("spacyr")
library("spacyr")
spacy_install()
spacy_download_langmodel("de")
}
## !!! Wischtisch !!!
## Ich musste erst ein Virtualenv 'spacy_virtualenv' in meinem Home-Ordner anlegen
## und dort spacy mit Python3 installieren, sowie das Sprachpaket downloaden:
## virtualenv --python=python3 spacy_virtualenv
## pip3 install --user spacy
## python3 -m spacy download --user de
load("daten/cosmas/finanzkrise/finanzkrise.korpus.RData")
korpus.finanzkrise.sample <- corpus_sample(korpus.finanzkrise, size = 1000)
spacy_initialize(mode = "de")
finanzkrise.pos <- spacy_parse(korpus.finanzkrise.sample, lemma = F, entity = T, dependency = T)
spacy_finalize()
head(finanzkrise.pos, 100)
subjekte <- finanzkrise.pos %>%
filter(pos == "NOUN", dep_rel == "sb") %>%
mutate(Wort = str_to_lower(token)) %>%
group_by(Wort) %>%
summarise(Frequenz = n()) %>%
arrange(desc(Frequenz)) %>%
mutate(Rang = row_number()) %>%
filter(Rang <= 25)
ggplot(subjekte, aes(reorder(Wort, Rang), Frequenz)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle = 45, hjust = 1)) + xlab("") + ggtitle("Frequenteste Satzsubjekte im Finanzkrise-Korpus")
## Für das folgende Beispiel mit englischem Text musste ich noch:
## python3 -m spacy download --user en
## ausführen (englisches Sprachmodel für SpaCy downloaden)
load("daten/twitter/trumpclinton.korpus.RData")
spacy_initialize(mode = "en")
twitter.pos <- spacy_parse(korpus, lemma = F, entity = F)
spacy_finalize()
head(twitter.pos, 100)
adjektive.trumpclinton <- scan("daten/twitter/adjektive.trumpclinton.txt", what = "char", sep = "\n", quiet = T)
adjektive <- twitter.pos %>%
mutate(Wort = str_to_lower(token)) %>%
filter(pos == "ADJ", Wort %in% adjektive.trumpclinton) %>%
left_join(korpus.stats, by = c("doc_id" = "Text")) %>%
group_by(Wort, Kandidat) %>%
summarise(Frequenz = n()) %>%
complete(Wort, Kandidat) %>%
replace(., is.na(.), 0) %>%
arrange(Wort, Kandidat)
adjektive.diff <- data.frame(Wort = unique(adjektive$Wort), Differenz = adjektive$Frequenz[adjektive$Kandidat == "Clinton"] - adjektive$Frequenz[adjektive$Kandidat == "Trump"]) %>%
mutate(Differenz.S = as.vector(scale(Differenz, center = 0))) %>%
arrange(Differenz.S)
ggplot(adjektive.diff, aes(reorder(Wort, Differenz.S), Differenz.S)) + geom_bar(stat = "identity") + theme(axis.text.x = element_text(angle = 90, hjust = 1, vjust = 0.5)) + xlab("") + ggtitle("Adjektive Trump vs. Clinton (mit 'great', 'big' enfernt)") + ylab("Trump Clinton") + coord_flip()
## Lexikon generieren
### Vorsicht! Ein sehr speicherintensiver Vorgang.
### Ich bin allerdings mit ca. 4GB auch ein bissi dünn ausgestattet.
load("daten/un/un.korpus.RData")
korpus.un.sample <- corpus_sample(korpus.un, size = 100)
spacy_initialize(mode = "en")
un.parsed <- spacy_parse(korpus.un.sample, pos = F, lemma = F)
un.entities <- entity_extract(un.parsed)
spacy_finalize()
organizations <- un.entities$entity[un.entities$entity_type=="ORG"] %>%
str_remove("\n|\t") %>%
str_replace_all("_+", " ") %>%
str_trim(.) %>%
str_to_title(.) %>%
table(.) %>%
sort(., decreasing = T)
head(organizations[names(organizations)!=""], 25)
# Annotation mit Hilfe des Paketes googlenlp und der Cloud Natural Language API
## Geht nur mit Hinterlegung einer Kreditkarte als Zahlungsmittel.
## Darauf verzichte ich zunächst mal, deswegen überspringe ich diesen Schritt.
#gl.apikey <- scan("verschiedenes/googlenlp_api.key", what = "char", quiet = T)
#set_api_key(gl.apikey)
#gl.annotation <- annotate_text("Dies ist ein einfacher Satz, analysiert mit den Diensten von Google.")
#gl.annotation$tokens
## Trotzdem eine interessante Möglichkeit:
## Google Cloud Natural Language API
Output-Teile
The United Nations United Nations
833 296
The General Assembly Organization
264 168
The Security Council Assembly
165 151
State Government
131 83
Security Council Powers
73 71
Council Governments
43 30
Liberia General Assembly
30 29
The European Union The European Community
27 26
Oau Plo
24 24
Islam States
23 22
The Millennium Development Goals Tuvalu
22 20
Maldives Khmer
19 18
The Organization Of African Unity
17
Schlussbemerkung
Ein interessantes Tutorial, eine ganze Website sogar, auf das/die ich hier gestossen bin. Erholsamerweise (für mich) mal ganz in deutscher Sprache, zudem noch offenbar gut geschrieben (was bei deutschen Tutorials vergleichsweise seltener vorkommt als bei englischen, internationalen - da gibt sich der Durchschnittsschreiber meist deutlich mehr Mühe über Durchschnittsniveau zu schreiben, iwi). Lohnt sich bestimmt, hier mal einen Seitenabstecher für die folgenden Tage einzuplanen, passt ja eh gut ins momentane, meinige Konzept.
Auch die Möglichkeiten, die Google Cloud in Sachen NLP bietet, machen Lust auf Näherkennenlernen: https://cloud.google.com/natural-language/.
Obiger Code wie gehabt Hempel-omx-owoxomo-durchgeschüttelt-und-gerührt: Funzt (außer, wo angegeben - siehe oben!)!
Kommentare
Kommentar veröffentlichen