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 

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


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

Beliebte Posts aus diesem Blog

·

Es brennt.

Bye, bye Nord Stream 2!