Mit den folgenden Funktionen werden der in Wikitext formatierte Artikel-Text bereinigt und einige Indikatoren extrahiert. Eine Dokumentation des Wikitext Formats findet sich hier: http://en.wikipedia.org/wiki/Help:Wiki_markup.
Texte der Form [[...:...]] enthalten Verweise auf Kategorien oder Dateien (Bilder, Videos, etc). Sie werden mit dieser Funktion aus dem Text entfernt.
f_bracket_dplpt_delete = function(x) {
beg <- stri_locate_all_fixed(x, "[[")
end <- stri_locate_all_fixed(x, "]]")
if(any(is.na(unlist(c(beg, end)))) | nrow(na.omit(beg[[1]])) != nrow(na.omit(end[[1]]))) x else {
begend <- cbind(c(beg[[1]][,1], end[[1]][,2]), rep(c(1, -1), each=nrow(beg[[1]])))
begend <- begend[order(begend[,1]),]
whb = which(cumsum(begend[,2]) == 1 & begend[,2] == 1)
whe <- which(cumsum(begend[,2]) == 0)
brdrs = cbind(begend[whb, 1], begend[whe, 1])
brdrs = brdrs[stri_detect_fixed(stri_sub(x, brdrs[,1], brdrs[,2]), ":"), , drop=F]
stri_flatten(stri_sub(x, c(1, brdrs[,2]+1), c(brdrs[,1]-1, stri_length(x))))
}
}
Texte in der Form [[...]] sind interne Links zu anderen Wikipedia-Seiten oder Dateien. Sie werden mit der folgenden Funktion aus dem Text extrahiert und in einer Liste abgespeichert.
f_bracket_xtrct = function(x) {
require(stringi)
beg <- stri_locate_all_fixed(x, "[[")
end <- stri_locate_all_fixed(x, "]]")
if(nrow(na.omit(beg[[1]])) != nrow(na.omit(end[[1]]))) "ERROR" else {
begend <- cbind(c(beg[[1]][,1], end[[1]][,2]), rep(c(1, -1), each=nrow(beg[[1]])))
begend <- begend[order(begend[,1]),]
whb = which(cumsum(begend[,2]) == 1 & begend[,2] == 1)
whe <- which(cumsum(begend[,2]) == 0)
brdrs = cbind(begend[whb, 1], begend[whe, 1])
stri_sub(x, brdrs[,1], brdrs[,2])
}
}
Am Ende der Artikel finden sich unter den unter chps aufgeführten Kapiteln häufig reine Auflistungen weiterer Quellen, die nicht zum Fließtext gehören. Diese Teile werden mit der folgenden Funktion gelöscht.
#### Ende Löschen (v.a. wg. alten Lit-Verzeichnissen) ####
f_end_delete = function(x) {
chps = c("Weblinks", "Literatur", "Einzelnachweise", "Siehe auch", "Quellen", "Fachliteratur", "Quellenangaben", "Weiterführende Literatur", "Referenzen", "Fußnoten", "Literatur und Quellen", "Links", "Weblink", "Bücher", "siehe auch", "Kinder- und Jugendliteratur", "Aufsätze")
ende = min(unlist(sapply(chps, function(i) stri_locate_all_regex(x, paste0("\\={2,}\\s*",i)))), na.rm=T)-1
if(ende == Inf) x else stri_sub(x, from=1, to=ende)
}
Die folgende Funktion erstellt zum einen den bereinigten Artikeltext cleantxt. Zum anderen extrahiert sie Indikatoren aus dem Wikitext und speichert diese als Listen oder Zahlen ab. Die Funktion ist so gestaltet, dass sie auf einen Datensatz angewendet werden muss, der den Wikitext in .data$txt enthält. Die mit der Funktion f_get_revs bezogenen Datensätze der Überarbeitungen haben dieses Format.
#### Extract Information from txt ####
f_xtrct = function(.data) {
require(stringi)
.data$txt = stri_replace_all_regex(.data$txt, "\n", " ") #Zeilenumbrüche löschen
cleantxt = sapply(.data$txt, f_bracket_dplpt_delete) # [[...:...]] löschen
cleantxt = sapply(cleantxt, f_end_delete) # Ende löschen
cleantxt = stri_replace_all_regex(cleantxt, "\\{\\|.*?\\|\\}", "") #Tabellen löschen
cleantxt = stri_replace_all_regex(cleantxt, "\\{\\{.*?\\}\\}", "") #Vorlagen löschen
cleantxt = stri_replace_all_regex(cleantxt, "\\[\\[[^\\[]*?\\|", "") #Ersten Teil von int. Links löschen
cleantxt = stri_replace_all_regex(cleantxt, "<.*?</.*?>", "") #Tags mit Inhalt löschen
cleantxt = stri_replace_all_regex(cleantxt, "http\\S+", "") #externe Links löschen
cleantxt = stri_replace_all_regex(cleantxt, "<.*?>", "") #Einfache Tags löschen
cleantxt = stri_replace_all_regex(cleantxt, "\\=|\\[|\\||\\]|'|\\*", "") #Restliche Sonderzeichen löschen
words = stri_extract_words(cleantxt) # Wörter im Artikel
.data$redirect = stri_count_fixed(cleantxt, "#redirect") # Ist der Artikel eine Weiterleitung?
.data$deleted = is.na(.data$txt) # Wurde der Artikeltext gelöscht?
.data$n_words = sapply(words, function(x) length(unlist(x))) # Zahl der Wörter
.data$nu_words = sapply(words, function(x) length(stri_unique(unlist(x)))) # Zahl der einzigartigen Wörter
.data$ttr = .data$nu_words / .data$n_words # Type token ration
.data$word_lngth = sapply(words, function(x) mean(sapply(x, stri_length))) #Durchschnittliche Wortlänge
.data$n_sentences = stri_count_regex(cleantxt, "(\\.|\\?|\\!)\\s+") # Zahl der Sätze
.data$n_sentences[.data$n_sentences == 0] = # Min. ein Satz
.data$sentence_lngth = .data$n_words / .data$n_sentences # Durchschnittliche Satzlänge
.data$links_int = lapply(.data$txt, f_bracket_xtrct) # Extraktion von [[...:...]]
.data$links_ext = stri_extract_all_regex(.data$txt, "http\\S+") # Extraktion der externen Links
.data$tables = stri_extract_all_regex(.data$txt, "\\{\\|.*?\\|\\}") # Extraktion der Tabellen
.data$vorlgn = stri_extract_all_regex(.data$txt, "\\{\\{.*?\\}\\}") # Extraktion der Vorlagen
.data$tags = stri_extract_all_regex(.data$txt, "<[^/]*>.*?</.*?>") # Extraktion der Fußnoten
.data$n_tags = sapply(.data$tags, function(x) length(na.omit(x))) # Zahl der Fußnoten
.data$n_bild = stri_count_regex(.data$txt, "Datei:|Bild:|File:|Image:") # Zahl der Bilder
.data$n_cats = stri_count_regex(.data$txt, "Kategorie:|Category:") # Zahl der Kategorien
.data$txt = cleantxt #Speichern des bereinigten Texts
.data
}
Diese Funktion bereitet die extrahierten und in einer Liste gespeicherten Vorlagen auf. Dann zählen wir, wie viele Vorlagen zum Verweis auf Fachquellen (in weiterem Sinne) im Artikel vorkommen und prüfen, ob der Hinweis auf Gesundheitsinformationen vorkommt.
f_clean_vrlg = function(.data) {
require(stringi)
.data$vorlgn = lapply(.data$vorlgn, function(x) stri_split_regex(x, "\\|"))
.data$vorlgn = lapply(.data$vorlgn, function(x) sapply(x, function(i) i[1]))
.data$vorlgn = lapply(.data$vorlgn, function(x) stri_replace_all_regex(x, "^[\\s]+|[\\s]+$|\\{|\\}", ""))
.data$gsdnw = sapply(.data$vorlgn, function(x) any(stri_detect_fixed(x, "Gesundheitshinweis")))
.data$n_citation = sapply(.data$vorlgn, function(x) sum(stri_detect_regex(x, "^(ISSN|cite journal|DOI|Literatur|AWMF|Google Buch|cite web|PMC|Internetquelle|OMIM|Zitation|RKI|internetquelle|Zitat|cite book|HGNC|doi|cite news|Cite journal|Gesundheitsinformation.de|PMID|Cite web|cite journal|GeneID|ICD10|ICD9|Orphanet)$"), na.rm=T)) #Das könnte man auch noch mal spezifischer machen...
.data
}
Extraktion aus einer Textversion des Artikels “Durchfall”
durchfall.history = f_get_revs("Durchfall") #Funktion aus "Abrufen aller Versionen eines Artikels (Revision History)" (LINK)
durchfall.bsp = durchfall.history[1,]
durchfall.bsp$timestamp #Version des Beispieltexts
## [1] "2014-10-06T07:16:07Z"
stri_sub(durchfall.bsp$txt, 1, 1300) #Auszug aus dem Text
## [1] "{{Dieser Artikel|behandelt das medizinische Symptom. Zum Begriff als „außergewöhnlicher Misserfolg“ siehe [[Durchfallen]].}}\n{{Infobox ICD\n| 01-CODE = A09\n| 01-BEZEICHNUNG = Diarrhoe und Gastroenteritis\n| 02-CODE = K52.9\n| 02-BEZEICHNUNG = Nichtinfektiöse Gastroenteritis und Kolitis\n| 03-CODE = K59.1\n| 03-BEZEICHNUNG = Funktionelle Diarrhoe\n}}\nAls '''Durchfall''' (medizinisch ''Diarrhö'' oder ''Diarrhoe,'' von {{ELSalt|''diárrhoia'' διάρροια}} ‚Durchfall‘, aus ''diá'' διά ‚durch‘ und ''rhéō'' {{Polytonisch|ῥέω}} ‚fließen‘) wird die je nach Schwere kürzer oder auch lang anhaltende Abgabe von ''zu flüssigem'' [[Stuhlgang|Stuhl]] bezeichnet. Durchfall kann ein [[Symptom]] vieler Erkrankungen (z. B. [[Infektion]]en, [[Nahrungsmittelvergiftung]]en, [[Tumor]]en) sein. Weltweit erkranken pro Jahr schätzungsweise rund vier Milliarden Menschen an Durchfall, 7,5 Millionen Menschen (vor allem Kinder) sterben an den Folgen.<ref name=\"BLB592\">{{Literatur|Autor=[[Herbert Renz-Polster]], Steffen Krautzig|Titel=Basislehrbuch Innere Medizin|Seiten=592 ff.|Auflage=4.|Verlag=Elsevier,Urban&FischerVerlag|Ort=München|Jahr=2008|ISBN=978-3437410536}}</ref>\n\nDie normale Frequenz (dreimal am Tag bis dreimal die Woche) und Konsistenz (kaum geformt bis hart) des Stuhlgangs unterscheiden sich zwischen "
durchfall.bsp.xtrct = f_xtrct(durchfall.bsp)
str(durchfall.bsp.xtrct) #Überblick über Informationen
## 'data.frame': 1 obs. of 22 variables:
## $ revid : num 1.35e+08
## $ parentid : num 1.31e+08
## $ user : chr "TinkoB"
## $ timestamp : chr "2014-10-06T07:16:07Z"
## $ txt : chr " Als Durchfall (medizinisch Diarrhö oder Diarrhoe, von ‚Durchfall‘, aus diá διά ‚durch‘ und rhéō ‚fließen‘) wird die je nach"| __truncated__
## $ title : chr "Durchfall"
## $ redirect : int 0
## $ deleted : logi FALSE
## $ n_words : int 1175
## $ nu_words : int 628
## $ ttr : num 0.534
## $ word_lngth : num 6.3
## $ n_sentences : num 72
## $ sentence_lngth: num 16.3
## $ links_int :List of 1
## ..$ : chr "[[Durchfallen]]" "[[Stuhlgang|Stuhl]]" "[[Symptom]]" "[[Infektion]]" ...
## $ links_ext :List of 1
## ..$ : chr "http://www.awmf.org/uploads/tx_szleitlinien/068-003_S1_Akute_infektioese_Gastroenteritis_04-2008_04-2013.pdf" "http://libdoc.who.int/hq/2006/WHO_FCH_CAH_06.1.pdf|" "http://rehydrate.org/ors/made-at-home.htm" "http://whqlibdoc.who.int/hq/1993/WHO_CDD_93.44.pdf|format" ...
## $ tables :List of 1
## ..$ : chr "{| class=\"wikitable\" width=\"800\" |- ! colspan=\"3\" | Formen der Diarrhö nach Krankheitsentstehung<ref name=\"KLB255\" /><r"| __truncated__
## $ vorlgn :List of 1
## ..$ : chr "{{Dieser Artikel|behandelt das medizinische Symptom. Zum Begriff als „außergewöhnlicher Misserfolg“ siehe [[Durchfallen]].}}" "{{Infobox ICD | 01-CODE = A09 | 01-BEZEICHNUNG = Diarrhoe und Gastroenteritis | 02-CODE = K52.9 | 02-BEZEICHNUNG = Nichtinfekti"| __truncated__ "{{ELSalt|''diárrhoia'' διάρροια}}" "{{Polytonisch|ῥέω}}" ...
## $ tags :List of 1
## ..$ : chr "<ref name=\"BLB592\">{{Literatur|Autor=[[Herbert Renz-Polster]], Steffen Krautzig|Titel=Basislehrbuch Innere Medizin|Seiten=592"| __truncated__ "<ref name=\"PIP391\">{{Literatur|Autor=Wolfgang Piper|Titel=Innere Medizin|Seiten=391|Auflage=1.|Verlag=Springer|Ort=Berlin|Jah"| __truncated__ "<ref name=\"KLB255\">{{Literatur|Autor=Hanns-Wolf Baenkler et al.|Titel=Kurzlehrbuch Innere Medizin|Seiten=255 ff.|Auflage=1.|V"| __truncated__ "<ref name=\"DRI457\">{{Literatur|Autor=Keikawus Arastéh et al.|Titel=Duale Reihe Innere Medizin|Seiten=457 ff.|Auflage=2.|Verla"| __truncated__ ...
## $ n_tags : int 18
## $ n_bild : int 0
## $ n_cats : int 2
stri_sub(durchfall.bsp.xtrct$txt, 1, 1300) #Auszug aus dem aufbereiteten Text
## [1] " Als Durchfall (medizinisch Diarrhö oder Diarrhoe, von ‚Durchfall‘, aus diá διά ‚durch‘ und rhéō ‚fließen‘) wird die je nach Schwere kürzer oder auch lang anhaltende Abgabe von zu flüssigem Stuhl bezeichnet. Durchfall kann ein Symptom vieler Erkrankungen (z. B. Infektionen, Nahrungsmittelvergiftungen, Tumoren) sein. Weltweit erkranken pro Jahr schätzungsweise rund vier Milliarden Menschen an Durchfall, 7,5 Millionen Menschen (vor allem Kinder) sterben an den Folgen. Die normale Frequenz (dreimal am Tag bis dreimal die Woche) und Konsistenz (kaum geformt bis hart) des Stuhlgangs unterscheiden sich zwischen verschiedenen Menschen. Ein akuter Durchfall verläuft meist leicht und heilt ohne weitere Maßnahmen (z. B. Medikamente) ab. Schwerer und länger andauernder Durchfall dagegen kann aufgrund des Wasser-/Elektrolytverlustes gefährlich sein und einer (medikamentösen) Therapie bedürfen. Von der Diarrhö abzugrenzen ist die Pseudodiarrhö, z. B. im Rahmen eines Reizdarmsyndroms. Dabei sind zwar Stuhlfrequenz und Wassergehalt gesteigert, das Stuhlgewicht aber nicht krankhaft erhöht. Ebenfalls kein Durchfall im eigentlichen Sinne ist die paradoxe Diarrhö mit eher vermindertem Stuhlgewicht, die Symptom eines Darmkrebs sein kann. Einteilung des Durchfalls Einteilung nach der D"
durchfall.bsp.xtrct = f_clean_vrlg(durchfall.bsp.xtrct)
durchfall.bsp.xtrct$vorlgn #Aufbereitete Vorlagen
## [[1]]
## [1] "Dieser Artikel" "Infobox ICD"
## [3] "ELSalt" "Polytonisch"
## [5] "Literatur" "Literatur"
## [7] "Literatur" "Literatur"
## [9] "Literatur" "Literatur"
## [11] "Literatur" "Cite web"
## [13] "cite web" "Internetquelle"
## [15] "DOI: 10.3238/arztebl.2009.0539" "DOI"
## [17] "cite web" "Literatur"
## [19] "DOI: 10.1007/s00120-008-1633-5" "Commonscat"
## [21] "Gesundheitshinweis"
durchfall.bsp.xtrct$gsdnw
## [1] TRUE
durchfall.bsp.xtrct$n_citation
## [1] 13