# Dieser Code wird im Foliensatz nicht angezeigt und ist nur erforderlich, # um gegebenenfalls fehlende Pakete nachzuladen: # kable und kableExtra werden benötigt, um tabellarische Ausgaben zu generieren. if (!"knitr" %in% rownames(installed.packages())) install.packages("knitr") if (!"kableExtra" %in% rownames(installed.packages())) install.packages("kableExtra")
library(polmineR)
Außerdem nutzen wir das magrittr
-Paket, um Befehle in einer sogenannten "Pipe" zu verketten. In einer Pipe wird das Ergebnis eines Befehls zum ersten Argument des jeweils nachfolgenden Befehls. Dadurch kann Code aussagekräftig und kompakt geschrieben werden. Das Paket wird bereits mit dem polmineR
Paket geladen.
Schließlich laden wir noch das data.table-Paket
library(data.table)
Das polmineR-Paket nutzt für die Speicherung und die Abfrage von Daten die Corpus Workbench (CWB). Die CWB hat die Funktionalität eines "indexing and query engine". Vergleichbare Software, die für industrielle Anwendungen Vorteile bietet, wären Lucene oder Elasticsearch. Ein großer Vorteil der CWB ist jedoch, dass sie vollständig quelloffen ist und in Software-Projekten genutzt und weiterentwickelt werden kann.
Die CWB beinhaltet als Bündel von Tools mit dem Corpus Query Processor (CQP) ein mächtiges Instrument, für große Korpora komplexe sprachliche Suchanfragen zur formulieren. Queries können reguläre Ausdrücke beinhalten und linguistische Annotationen abfragen.
Die CQP-Syntax kann bei allen Basis-Befehlen des polmineR-Pakets (kwic()
, count()
, dispersion()
, cooccurrences()
)genutzt werden.
In den folgenden Beispielen wird anhand der count()
-Methode gezeigt, wie die CQP-Syntax funktioniert. Denken Sie daran, dass die anderen Funktionen auch CQP können! Im folgenden Tutorial wird zunächst kurz in die Nutzung regulärer Ausdrücke eingeführt. Dann wird die Nutzung linguistischer Merkmale eines Korpus erläutert.
Die CQP-Suchsyntax wird mit dem Parameter query
an die Methoden übergegeben. Voreingestellt ist eine automatische Erkennung, ob die CQP-Syntax verwendet wird. Empfohlen ist jedoch, ausdrücklich über den logischen Parameter cqp
anzugeben, dass CQP verwendet wird.
Wichtig ist, dass einzelne Suchbegriffe in Anführungszeichen gesetzt werden müssen und einfache Anführungszeichen den gesammten Suchbegriff umschließen.
count("GERMAPARL", query = '"Diskriminierung"', cqp = TRUE)
count("GERMAPARL", query = c('"Liebe"', '"Liebe" %c'), cqp = TRUE)
Die CQP-Syntax schließt die Nutzung regulärer Ausdrücke ein: Reguläre Ausdrücke sind ein in vielen Programmiersprachen verfügbares, standardisiertes Instrument zur Suche nach Zeichenmustern.
Bei regulären Ausdrücken können Symbole als Zeichenklassen an die Stelle eines konkreten Zeichens treten.
| Ausdruck | Beschreibung | |:-------:| --------------| | . |Ein Punkt (".") steht für ein beliebiges Zeichen | | \d | "digit" (Ziffer), d.h. 0 bis 9 |
count("GERMAPARL", '".iebe"', cqp = TRUE) %>% head() count("GERMAPARL", '"\\d\\d\\d\\d"', cqp = TRUE) %>% head()
| Ausdruck | Beschreibung | |:-------:| --------------| |?|Der voranstehende Ausdruck kommt kein- oder einmal vor.| |+|Der voranstehende Ausdruck tritt einmal oder mehrfach auf. | |*|Der voranstehende Ausdruck tritt keinmal oder beliebig oft auf.| |{n}|Der voranstehende Ausdruck tritt exakt n-fach auf.| |{min,}| Der voranstehende Ausdruck tritt mindestens min-fach auf.| |{min,max}|Der voranstehende Ausdruck tritt mindestens min-fach und maximal max-fach auf.| |{0,max}| Der voranstehende Ausdruck darf maximal max-fach vorkommen.|
count("GERMAPARL", query = '"Multikult.*"', cqp = TRUE, breakdown = TRUE) %>% head(n = 3)
count("GERMAPARL", query = '"[Mm]ultikult.*"', cqp = TRUE, breakdown = TRUE) %>% head(n = 3)
count("GERMAPARL", query = '"(Zu|Ein|Aus)wanderung.*"', breakdown = TRUE) %>% head()
count("GERMAPARL", query = '"Asyl(suchende|berechtigte|ant|anti)"', cqp = TRUE, breakdown = TRUE) %>% head()
CQP erweitert die Syntax der regulären Ausdrücke um Möglichkeiten, über mehrere Worte ("Tokens") Abfragen zu formulieren. CQP kann die verschiedenen Annotationen eines linguistisch annotierten Korpus abfragen.
Das Datenformat ist grundsätzlich tabellarisch. Wenn neben der ursprünglichen Wortform (P-Attribut "word") auch ein Wortarterkennung (sog. "Part-of-Speech"-Annotation, P-Attribut "pos") und eine Lemmatisierung (P-Attribut "lemma") durchgeführt wurde, so ist ein dreispaltiger tokenstream verfügbar.
Die Tabelle auf der folgenden Seite gibt als Beispiel den Anfang einer Plenardebatte wieder. In der ersten ist die corpus position ("cpos") angeführt.
P <- partition("GERMAPARL", speaker = "Angela Merkel", lp = "15") cpos_left <- P@cpos[1,1] pAttributes <- c("word", "pos", "lemma") tokenstream_list <- lapply( pAttributes, function(x) get_token_stream("GERMAPARL", pAttribute = x, left = cpos_left, right = cpos_left + 1000) ) tokenstream_df <- as.data.frame(tokenstream_list) colnames(tokenstream_df) <- pAttributes tokenstream_df[["pos"]] <- gsub("^\\$", "\\\\$", tokenstream_df[["pos"]]) tokenstream_df[["cpos"]] <- 0L:1000L tokenstream_df <- tokenstream_df[, c("cpos", pAttributes)] DT::datatable(tokenstream_df)
Wenn über die CQP-Syntax im P-Attribut "word" gesucht wird, muss der hierauf bezogene Suchbegriff nur in Anführungszeichen gesetzt werden. Um die anderen P-Attribute anzusteuern, wird in eckigen Klammern angegeben, auf welches Attribut man sich beziehen möchte.
Mit dem folgenden Suchbegriff "Q" sucht man etwa Abfolgen von einem Nomen, dann "mit" und einem Wort, dass mit "Migrations" beginnt.
Q <- '[pos = "NN"] "mit" "Migrations.*"' C <- count("GERMAPARL", query = Q, breakdown = TRUE) head(C[,c("match", "count", "share")])
count("GERMAPARL", query = '"(Bundesm|M)inisterium" [] [pos = "NN"]', cqp = T, breakdown = T) %>% head(n = 3) %>% subset(select = c("match", "count", "share"))
count("GERMAPARL", query = '"([Kk]riminell.*|Straftat.*)" []{0,5} "Asyl.*"', cqp = TRUE, breakdown = TRUE) %>% head(n = 3) %>% subset(select = c("match", "count", "share"))
Q <- '("[tT]error.*" []{0,9} "[iI]slam.*" | "[iI]slam.*" []{0,9} "[tT]error.*")' Y <- count("GERMAPARL", query = Q, cqp = TRUE) Y[, "count"]
options("polmineR.pagelength" = 6L)
kwic("GERMAPARL", query = '"Integration" []{0,5} ".*[Ss]cheiter.*"', cqp = TRUE)
options("polmineR.pagelength" = 5L)
positivelist
-Argument der kwic()
-Methode nutzt.kwic("GERMAPARL", query = '"[iI]slam.*"', positivelist = "[tT]error.*", regex = T, cqp = T) %>% highlight (yellow = "[tT]error.*", regex = TRUE)
dispersion()
dispersion()
-Methode genutzt werden ...dispersion("GERMAPARL", query = '"[rR]assis.*"', s_attribute = "party")
cooccurrences()
{.smaller}cooccurrences("GERMAPARL", query = '"([mM]uslim.|[iI]slam*)"', cqp = TRUE) %>% data.table::as.data.table() %>% subset(rank_ll < 5) %>% DT::datatable() # Einbindung in Folie als htmlwidget
character
-Vektor) oder partition
-Objekte angewendet werden.partition("GERMAPARL", year = 2002:2009) %>% cooccurrences(query = '"([mM]uslim.|[iI]slam*)"', cqp = TRUE)
CQP ist ein mächtiges Analysewerkzeug! Richtige Suchabfragen zu formulieren, erfordert allerdings etwas Übung. Beachten Sie hierbei insbesondere:
Vergessen Sie nicht, CQP-Abfragen in einfache öffnende und schließende Anführungszeichen zu setzen!
Wenn Sie eine Fehlermeldung erhalten, prüfen Sie, ob öffnende Anführungszeichen, eckige oder geschweifte Klammern jeweils geschlossen werden!
Viel Erfolg!
|Notation|Beschreibung|Beispiel| |:------:|------------|--------| |ADJA|attributives Adjektiv| [das] große [Haus]| |ART| bestimmter oder unbestimmter Artikel | der, die, das, ein, eine, ... | |NN| normales Nomen|Tisch, Herr, [das] Reisen| |NE|Eigennamen| Hans, Hamburg, HSV| |VVFIN|finites Verb, voll | [du] gehst, [wir] kommen [an] | |VVIMP|Imperativ, voll|komm [!]| |VVINF|Infinitiv, voll|gehen, ankommen| |VVIZU|Infinitiv mit ``zu'', voll| anzukommen, loszulassen| |VVPP|Partizip Perfekt, voll| gegangen, angekommen| |VAFIN|finites Verb, aux| [du] bist, [wir] werden |
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.