{"id":228,"date":"2012-06-05T09:28:38","date_gmt":"2012-06-05T09:28:38","guid":{"rendered":"http:\/\/www.bubenhofer.com\/sprechtakel\/?p=228"},"modified":"2012-06-25T15:33:50","modified_gmt":"2012-06-25T15:33:50","slug":"statistische-analysen-von-korpora-mit-r-direkt-auf-die-cwb-zugreifen","status":"publish","type":"post","link":"https:\/\/www.bubenhofer.com\/sprechtakel\/2012\/06\/05\/statistische-analysen-von-korpora-mit-r-direkt-auf-die-cwb-zugreifen\/","title":{"rendered":"Statistische Analysen von Korpora: Mit R direkt auf die CWB zugreifen"},"content":{"rendered":"<p>Ich bin etwas stolz auf die folgende Grafik:<\/p>\n<div id=\"attachment_229\" style=\"width: 586px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.bubenhofer.com\/sprechtakel\/wp-content\/uploads\/2012\/06\/PronomenDiff.png\"><img loading=\"lazy\" decoding=\"async\" aria-describedby=\"caption-attachment-229\" class=\"size-full wp-image-229\" title=\"PronomenDiff\" src=\"http:\/\/www.bubenhofer.com\/sprechtakel\/wp-content\/uploads\/2012\/06\/PronomenDiff.png\" alt=\"\" width=\"576\" height=\"360\" srcset=\"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-content\/uploads\/2012\/06\/PronomenDiff.png 576w, https:\/\/www.bubenhofer.com\/sprechtakel\/wp-content\/uploads\/2012\/06\/PronomenDiff-300x187.png 300w\" sizes=\"auto, (max-width: 576px) 100vw, 576px\" \/><\/a><p id=\"caption-attachment-229\" class=\"wp-caption-text\">Die typischen Personalpronomen in Pressetexten (sueddeutsche.de und bild.de) \u00fcber Wulff und Merkel<\/p><\/div>\n<p>Allerdings nicht, weil sie besonders sch\u00f6n aussehen w\u00fcrde oder weil der Inhalt sehr \u00fcberraschend w\u00e4re, sondern weil sie <strong>methodisch elegant<\/strong> erstellt wurde. N\u00e4mlich in <a href=\"http:\/\/www.r-project.org\">R<\/a> unter direktem Zugriff auf die <a href=\"http:\/\/cwb.sourceforge.net\">Corpus Workbench<\/a>. Allerdings ist der Weg dahin doch etwas umst\u00e4ndlich.<\/p>\n<p><!--more--><\/p>\n<p>R mausert sich in der Korpuslinguistik zur Standardsoftware, um statistische Berechnungen anzustellen. Die Corpus Workbench ist ein verbreitetes Korpusmanagment- und Abfragesystem mit der m\u00e4chtigen Query-Sprache CQP. Bisher fehlte ein Bindeglied: Die M\u00f6glichkeit, direkt in R auf die CWB zuzugreifen. Seit Februar diesen Jahres gibt es von Bernard Desgraupes und Sylvain Loiseau jedoch eine L\u00f6sung: <a href=\"http:\/\/cran.r-project.org\/web\/packages\/rcqp\/index.html\">Das rcqp-Paket<\/a>.<\/p>\n<h3>Installation<\/h3>\n<p><span style=\"color: #800000;\"><strong>Update 25. Juni 2012:<\/strong> Zumindest f\u00fcr Unix-Systeme sollte die Installation nun ganz einfach sein, da rcqp als Plug-in zu R <a href=\"http:\/\/cran.r-project.org\/web\/packages\/rcqp\/index.html\"><span style=\"color: #800000;\">vorkompiliert in CRAN-Repository liegt<\/span><\/a>.<\/span><\/p>\n<p>Momentan scheint es <del>nur<\/del> f\u00fcr Mac OS X und Windows nur die M\u00f6glichkeit zu geben, rcqp selber auf dem System zu kompilieren. Daf\u00fcr sind einige Entwickler-Tools notwendig wie GCC, GNU make, GNU bison und flex etc., was auf Linux- und Mac OS X-Systemen normalerweise bereits installiert ist.<\/p>\n<p>Zudem sind zwei weitere Bibliotheken notwendig: Die <a href=\"http:\/\/www.pcre.org\">PCRE<\/a>&#8211; und die <a href=\"http:\/\/www.gtk.org\">Glib<\/a>-Libraries, die wieder abh\u00e4ngig von weiteren Paketen sind. Wer da nachinstallieren muss, ist ggf. eine Weile damit besch\u00e4ftigt.<\/p>\n<p>Dann jedoch holt man sich die aktuellste Version von rcqp \u00fcber SVN:<\/p>\n<pre>$ svn checkout <a href=\"svn:\/\/scm.r-forge.r-project.org\/svnroot\/rcwb\/pkg\/rcqp\">svn:\/\/scm.r-forge.r-project.org\/svnroot\/rcwb\/pkg\/rcqp<\/a><\/pre>\n<p>Wechselt dann ins Verzeichnis pkg\/rcqp\/ und l\u00e4sst R dann alles kompilieren und installieren:<\/p>\n<pre>$ cd rcwb\/pkg\/rcqp\r\n$ sudo R CMD INSTALL rcqp<\/pre>\n<p>Achtung: In der aktuellen INSTALL-Info steht ein falscher Befehl (&#8222;install&#8220; klein geschrieben statt gro\u00df). Doch dann ist, wenn alles gut l\u00e4uft, das Paket installieren und man kann in R damit arbeiten.<\/p>\n<h3>Verwendung<\/h3>\n<p>Die <a href=\"http:\/\/cran.r-project.org\/web\/packages\/rcqp\/rcqp.pdf\">Dokumentation<\/a> f\u00fchrt Schritt f\u00fcr Schritt durch eine typische Korpusrecherche mit rcqp und erl\u00e4utert alle verf\u00fcgbaren Funktionen.<\/p>\n<p>Der Code, um die Grafik oben zu erzeugen, sieht folgenderma\u00dfen aus: Erstmal muss die Bibliothek geladen werden und in der zweiten Zeile werden die verf\u00fcgbaren Korpora ausgegeben:<\/p>\n<pre>library(rcqp);\r\ncqi_list_corpora();\r\n[1] \"MERKELKORPUS\" \"WULFFKORPUS\"<\/pre>\n<p>Ich w\u00e4hle nun das Korpus &#8222;MERKELKORPUS&#8220; und mache darin mit subcorpus eine Abfrage, bei der ich die CQP-Syntax verwenden kann. Hier wird die Annotation des RFTaggers nach Personalpronomen durchsucht. Mit print kann man sich KWIC-Zeilen ausgeben lassen.<\/p>\n<pre>merkel &lt;- corpus(\"MERKELKORPUS\");\r\npMerkel &lt;- subcorpus(merkel, '[rfpos=\"PRO.Pers.+\"]');\r\nprint(pMerkel, from=1, to=10);\r\n\r\n17 elche Politiker haben &lt;&lt; Sie &gt;&gt; in Ihrem Leben am me\r\n27 ndruckt ? Darauf habe &lt;&lt; ich &gt;&gt; keine eindeutige Ant\r\n34 wort . Adenauer halte &lt;&lt; ich &gt;&gt; f\u00fcr einen gro\u00dfen Sta\r\n41 n Staatsmann , obwohl &lt;&lt; er &gt;&gt; mich nicht mochte .\u00a0\r\n42 taatsmann , obwohl er &lt;&lt; mich &gt;&gt; nicht mochte . Mit B\r\n50 kanzler Brandt konnte &lt;&lt; ich &gt;&gt; gut . Er hat mich se\r\n53 andt konnte ich gut . &lt;&lt; Er &gt;&gt; hat mich sehr unters\r\n66 en in den Osten . Wen &lt;&lt; ich &gt;&gt; sehr sch\u00e4tze , ist A\r\n74 ndeskanzler Schmidt . &lt;&lt; Er &gt;&gt; ist geradlinig und s\r\n81 dlinig und sagt , was &lt;&lt; er &gt;&gt; denkt . Woher kommt<\/pre>\n<p>Die cqp_ftable-Funktion erzeugt eine sch\u00f6ne Distributionstabelle um zu sehen, wie sich die Treffer verteilen, in unserem Fall, auf welche Subklassen der Personalpronomen und welche Wortformen:<\/p>\n<pre>dMerkel &lt;- cqp_ftable(pMerkel, \"match\", \"rfpos\", \"match\", \"word\");\r\ndMerkel;<\/pre>\n<p>Ausgabe von cqp_ftable:<\/p>\n<pre>match.rfpos match.word freq\r\n1 PRO.Pers.Subst.3.Nom.Sg.Neut es 10733\r\n2 PRO.Pers.Subst.3.Nom.Sg.Masc er 8859\r\n3 PRO.Pers.Subst.3.Nom.Sg.Fem sie 5126\r\n4 PRO.Pers.Subst.3.Nom.Sg.Neut Es 4407\r\n5 PRO.Pers.Subst.1.Nom.Pl.* wir 3566\r\n6 PRO.Pers.Subst.3.Nom.Pl.* sie 3480\r\n7 PRO.Pers.Subst.3.Nom.Pl.* Sie 3165\r\n[...]<\/pre>\n<p>Genau das Gleiche machen wir mit dem Wulff-Korpus und vereinigen die beiden Tabellen:<\/p>\n<pre>wulff &lt;- corpus(\"WULFFKORPUS\");\r\npWulff &lt;- subcorpus(wulff, '[rfpos=\"PRO.Pers.+\"]');\r\ndWulff &lt;- cqp_ftable(pWulff, \"match\", \"rfpos\", \"match\", \"word\");\r\ndata &lt;- merge(dMerkel, dWulff, by=c(\"match.rfpos\", \"match.word\"));\r\ncolnames(data) &lt;- c(\"rfpos\", \"word\", \"freqMerkel\", \"freqWulff\");<\/pre>\n<p><span style=\"color: #222222; font-family: 'Courier 10 Pitch', Courier, monospace;\">data enth\u00e4lt nun folgende Tabelle:<\/span><\/p>\n<pre>data;\r\nrfpos word freqMerkel freqWulff\r\n1 PRO.Pers.Subst.1.Acc.Pl.* uns 433 457\r\n2 PRO.Pers.Subst.1.Acc.Pl.* Uns 1 2\r\n3 PRO.Pers.Subst.1.Acc.Pl.* UNS 7 1\r\n4 PRO.Pers.Subst.1.Acc.Sg.* mich 420 676\r\n5 PRO.Pers.Subst.1.Acc.Sg.* Mich 18 40\r\n6 PRO.Pers.Subst.1.Dat.Pl.* uns 600 654\r\n7 PRO.Pers.Subst.1.Dat.Pl.* Uns 16 35\r\n[...]<\/pre>\n<p>Mit der Funktion summary kann man wichtige Informationen zum Korpus ausgeben, unter anderem steht in der ersten Zeile die Korpusgr\u00f6\u00dfe in Anzahl Tokens:<\/p>\n<pre>summary(merkel);\r\nMERKELKORPUS\r\nNumber or tokens in the corpus: 2584948<\/pre>\n<p>Diese Information verwenden wir, um relative Frequenzen zu berechnen. Gesondert f\u00fcr die Merkel- und die Wulff-Frequenzen f\u00fcgen wir je eine Spalte mit den relativen Werten ein und eine weitere, die die Differenz enth\u00e4lt:<\/p>\n<pre>data$relMerkel &lt;- data$freqMerkel\/2584948*1000000;\r\ndata$relWulff &lt;- data$freqWulff\/2474827*1000000;\r\ndata$diff &lt;- data$relMerkel - data$relWulff;<\/pre>\n<p>Diese Tabelle sortieren wir nun absteigend nach dem Differenzwert und erstellen dann eine Matrix-Tabelle, die alle Zeilen enth\u00e4lt, deren Differenzwerte &gt; 50 oder &lt; -50 sind:<\/p>\n<pre>newdata &lt;- data[order(-data$diff),];\r\nbig50 &lt;- newdata[newdata$diff &gt; 50,];\r\nlittle50 &lt;- newdata[newdata$diff &lt; - 50,];\r\nbiglittle50 &lt;- rbind(big50, little50);\r\nbiglittle50data &lt;- as.matrix(data.frame(biglittle50$diff,\r\nrow.names=paste(biglittle50$rfpos, biglittle50$word, sep=\": \")));<\/pre>\n<p>Daraus ergibt sich folgende Tabelle:<\/p>\n<pre>biglittle50data;\r\n                                 biglittle50.diff\r\nPRO.Pers.Subst.3.Nom.Sg.Fem: sie 313.00289\r\nPRO.Pers.Subst.3.Nom.Pl.*: sie 177.28472\r\nPRO.Pers.Subst.3.Nom.Sg.Neut: es 167.18947\r\nPRO.Pers.Subst.3.Nom.Sg.Fem: Sie 79.63236\r\nPRO.Pers.Subst.3.Acc.Sg.Neut: es -67.57275\r\nPRO.Pers.Subst.1.Dat.Sg.*: mir -80.11974\r\nPRO.Pers.Subst.1.Acc.Sg.*: mich -110.67132\r\nPRO.Pers.Subst.3.Nom.Pl.*: Sie -176.10593\r\nPRO.Pers.Subst.3.Dat.Sg.Masc: ihm -195.44418\r\nPRO.Pers.Subst.3.Acc.Sg.Masc: ihn -223.50883\r\nPRO.Pers.Subst.3.Nom.Sg.Masc: Er -290.77445\r\nPRO.Pers.Subst.1.Nom.Sg.*: Ich -357.91871\r\nPRO.Pers.Subst.1.Nom.Sg.*: ich -423.05258\r\nPRO.Pers.Subst.3.Nom.Sg.Masc: er -1138.82748<\/pre>\n<p>Daraus k\u00f6nnen wir nun die Grafik, einen barplot, erstellen und in eine PDF-Datei schreiben:<\/p>\n<pre>pdf(\"PronomenDiff.pdf\", width=8, height=5);\r\npar(mar=c(7, 18, 4.1, 8));\r\npar(las=2);\r\npar(cex.axis=0.8);\r\nbarplot(t(biglittle50data), main=\"F\u00fcr Wulff- und Merkel-Texte\u00a0\r\nbesonders typische Pronomen\", horiz=T, xlab=\"Differenz der\r\nrel. Frequenzen\", sub=\"Minus-Werte (links): typisch Wulff;\r\nplus-Werte (rechts): typisch Merkel\", col=\"red\");\r\ndev.off();<\/pre>\n<h3>Fazit<\/h3>\n<p>Leute, die sich gut mit R auskennen und mit Corpus Workbench-Korpora arbeiten, werden Freude an diesem Modul haben. Denn ansonsten muss man immer zwischen den beiden Tools hin und her wechseln und Zwischenergebnisse exportieren und importieren. \u00a0Allerdings ist die Installation relativ aufw\u00e4ndig und nur f\u00fcr Erfahrene geeignet. Im Prinzip sollte das Modul auch unter Windows funktionieren, was ich jedoch nicht ausprobierte.<\/p>\n<p>Eine Alternative bietet z.B. Roland Sch\u00e4fer mit seinem <a href=\"http:\/\/hpsg.fu-berlin.de\/~rsling\/microsites\/koka\/\">online Koka-Konvertierungstool<\/a>, das CWB-KWICs (und auch IDS DeReKo\/COSMAS II und DWDS-KWICs) in Excel-Tabellen konvertieren kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Ich bin etwas stolz auf die folgende Grafik: Allerdings nicht, weil sie besonders sch\u00f6n aussehen w\u00fcrde oder weil der Inhalt sehr \u00fcberraschend w\u00e4re, sondern weil sie methodisch elegant erstellt wurde. N\u00e4mlich in R unter direktem Zugriff auf die Corpus Workbench. &hellip; <a href=\"https:\/\/www.bubenhofer.com\/sprechtakel\/2012\/06\/05\/statistische-analysen-von-korpora-mit-r-direkt-auf-die-cwb-zugreifen\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4,7],"tags":[51,55,52,56,43],"class_list":["post-228","post","type-post","status-publish","format-standard","hentry","category-4-korpuslinguistik","category-6-korpustools","tag-corpus-workbench","tag-cwb","tag-r","tag-rcqp","tag-wulff"],"_links":{"self":[{"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/posts\/228","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/comments?post=228"}],"version-history":[{"count":12,"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/posts\/228\/revisions"}],"predecessor-version":[{"id":244,"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/posts\/228\/revisions\/244"}],"wp:attachment":[{"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/media?parent=228"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/categories?post=228"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.bubenhofer.com\/sprechtakel\/wp-json\/wp\/v2\/tags?post=228"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}