Funktion 1

Es werden alle Artikel und alle Unterkategorien aus einem Namensraum namespace identifiziert, die in der Kategorie cattitle eingeordnet sind. namespace=0 entspricht dem Artikelnamensraum, also den “normalen” Wikipedia-Artikeln. namespace=14 entspricht dem Kategoriennamensraum. Eine Dokumentation der Namensräume findet sich hier: http://www.mediawiki.org/wiki/Manual:Namespace. Eine Dokumentation der Parameter für den API Aufruf GET(..., query=list(...)) findet sich hier: https://www.mediawiki.org/wiki/API:Categorymembers.

f_get_cats = function(cattitle, language="de", limit=500, cmnamespace="0|14", verbose=F, output="names") {
  domain = paste0("http://", language, ".wikipedia.org/w/api.php") #URL der API einer Wikipedia-Sprachversion
  cmtitle = paste0("Category:", cattitle)
  dmp = GET(domain, query=list( #Konstruktion des API Aufrufs
    format = "json",
    action = "query",
    list="categorymembers",
    cmtitle = cmtitle,
    cmprop = "title|ids|timestamp|type",
    cmtype = "page|subcat",
    cmnamespace = cmnamespace,
    cmlimit = limit))
  ctr = 1
  if (verbose) print(ctr) # verbose: Sichtbarer Count der Loops
  dmp = content(dmp, as = "text") #Abruf des Ergebnisses der API Abfrage
  dmp = RCurl:::mapUnicodeEscapes(dmp) #Codierung der Unicode Escape Characters
  dmp = fromJSON(dmp) #Umwandlen des json Objekts in R kompatible Daten
  cat_content = list(pages=subset(dmp$query$categorymembers, type=="page"), subcats=subset(dmp$query$categorymembers, type=="subcat")) #Liste mit Seiten und mit Unterkategorien
    # Die API gibt in einem Aufruf "cmlimit" (maximal 500) Seiten/Unterkategorien zurück. Wenn es weitere Seiten/Unterkategorien gibt, wird ein Code geliefert, der angibt, wo ein weiterer Abruf beginnen muss. So lange ein solcher Code zurückgegeben wird, führen wir weitere Abrufe aus, bis alle Seiten gesammelt wurden.
  while (!is.null(dmp$"query-continue"$categorymembers$cmcontinue)) {
    dmp = GET(domain, query=list(
      format = "json",
      action = "query",
      list="categorymembers",
      cmtitle = cmtitle,
      cmprop = "title|ids|timestamp|type",
      cmtype = "page|subcat",
      cmnamespace = cmnamespace,
      cmcontinue = dmp$"query-continue"$categorymembers$cmcontinue,
      cmlimit = limit))
    ctr = ctr+1
    if (verbose) print(ctr)
    dmp = content(dmp, as = "text")
    dmp = RCurl:::mapUnicodeEscapes(dmp)
    dmp = fromJSON(dmp)
    cat_content = list(pages=rbind(cat_content[[1]], subset(dmp$query$categorymembers, type=="page")), subcats=rbind(cat_content[[2]], subset(dmp$query$categorymembers, type=="subcat"))) # Neu abgerufene Seiten/Unterkategorien zu bisher abgerufenen Seiten/Unterkategorien hinzufügen
  }
  cat_content[[2]]$title = stri_sub(cat_content[[2]]$title, stri_locate_first_fixed(cat_content[[2]]$title, ":")[,1]+1, stri_length(cat_content[[2]]$title)) #Aufbereiten der Namen der Seiten/Unterkategorien
  if (output=="names") cat_content = list(pages=cat_content$pages$title, subcats=cat_content$subcats$title) # Löschen aller anderen Informationen außer Titel der Seiten/Unterkategorien
  cat_content
}

Anwendung 1

Seiten und Unterkatorien in der Kategorie:Krankheit

f_get_cats(cattitle = "Krankheit", language = "de", verbose = F, output = "names")
## $pages
##  [1] "Krankheit"                             
##  [2] "Liste der Syndrome"                    
##  [3] "Morbus"                                
##  [4] "Adenitis"                              
##  [5] "Angina"                                
##  [6] "Cannabis-Hyperemesis-Syndrom"          
##  [7] "Erythromelalgie"                       
##  [8] "Exposom"                               
##  [9] "Golfkriegssyndrom"                     
## [10] "Hämopyrrollaktamurie"                  
## [11] "Höhenkrankheit"                        
## [12] "Insuffizienz"                          
## [13] "Interkurrente Erkrankung"              
## [14] "Katarrh"                               
## [15] "Krankenabendmahl"                      
## [16] "Krankheitskonzept"                     
## [17] "Lipödem"                               
## [18] "Manifest (Medizin)"                    
## [19] "Obstruktion (Medizin)"                 
## [20] "Obturation"                            
## [21] "Okklusion (Medizin)"                   
## [22] "Penetration (Medizin)"                 
## [23] "Phrenitis"                             
## [24] "Retention (Medizin)"                   
## [25] "Schizoaffektive Störung"               
## [26] "Schwarze Haarzunge"                    
## [27] "Sick-Building-Syndrom"                 
## [28] "Simulator Sickness"                    
## [29] "Skrofulose"                            
## [30] "Spontanheilung"                        
## [31] "Vielfache Chemikalienunverträglichkeit"
## 
## $subcats
##  [1] "Autoimmunerkrankung"                               
##  [2] "Ernährungsbedingte Erkrankung"                     
##  [3] "Genetische Störung"                                
##  [4] "Infektionskrankheit"                               
##  [5] "Stoffwechselkrankheit"                             
##  [6] "Strahlenbedingte Erkrankung"                       
##  [7] "Tumor"                                             
##  [8] "Berufskrankheit"                                   
##  [9] "Krankheitssymptom"                                 
## [10] "Krankheitsbild oder Komplikation in der Anästhesie"
## [11] "Krankheitsbild in der Augenheilkunde"              
## [12] "Krankheitsbild in der Chirurgie"                   
## [13] "Krankheitsbild in der Dermatologie"                
## [14] "Krankheitsbild in Gynäkologie und Geburtshilfe"    
## [15] "Krankheitsbild in der Hals-Nasen-Ohren-Heilkunde"  
## [16] "Krankheitsbild in der Inneren Medizin"             
## [17] "Krankheitsbild in der Intensivmedizin"             
## [18] "Krankheitsbild in der Kinderheilkunde"             
## [19] "Krankheitsbild in der Proktologie"                 
## [20] "Krankheitsbild in der Neurologie"                  
## [21] "Krankheitsbild in der Notfallmedizin"              
## [22] "Krankheitsbild in der Nuklearmedizin"              
## [23] "Krankheitsbild in Orthopädie und Unfallchirurgie"  
## [24] "Pflanzenkrankheit"                                 
## [25] "Krankheitsbild in Phoniatrie und Pädaudiologie"    
## [26] "Krankheitsbild in der Psychiatrie"                 
## [27] "Seltene Krankheit"                                 
## [28] "Sexuelle Dysfunktion"                              
## [29] "Krankheitsbild in der Sportmedizin"                
## [30] "Krankheitsbild in der Urologie"                    
## [31] "Krankheitsbild in der Veterinärmedizin"            
## [32] "Krankheitsbild in der Zahnmedizin"

Funktion 2

Ausgehend von einer Startkategorie start_cat startet ein Loop. Für eine Startkategorie werden von allen Unterkategorien die Seiten und Unterkategorien gesammelt. Das Vorgehen wird für alle neu gefundenen Unterkategorien wiederholt. Da die Kategorien in der Wikipedia sehr tief verschachtelt oder thematisch inkonsisten sein können, kann ein looplimit gesetzt werden, nach dem das Vorgehen abgebrochen wird. So können übermäßig lange Suchläufe unterbunden werden.

f_loop_subcats = function(start_cat, language="de", limit=500, looplimit=Inf) {
  content_dmp = f_get_cats(start_cat, language, limit, verbose, output = "names") #Seiten/Unterkategorien der ersten Kategorie
  page_dmp = list(content_dmp$pages) #Sammeln der Seiten in erster Kategorie
  names(page_dmp) = start_cat # Benennen der Liste von Seiten nach Kategorie
  cat_dmp = content_dmp$subcats # Sammeln der Unterkategorien auf erster Seite
  cat_chk = as.character() # Leerer Container als "Checkliste" für bereits behandelte Kategorien
  loopcount = 1 # Setzen des Loopcount für Looplimit
  while (length(cat_dmp > 0)) { # Wiederhole, solange es noch Unterkategorien gibt
    cat_dmp = cat_dmp[!cat_dmp %in% cat_chk] #Aussortieren von Kategorien, die bereits abgefragt wurden (1)
    cat_chk = unique(c(cat_chk, cat_dmp)) #Aussortieren von Kategorien, die bereits abgefragt wurden (2)
    content_dmp = lapply(cat_dmp, function(i) { #Abrufen für neu gefundene Kategorien
      tryCatch(f_get_cats(cattitle = i, language, limit, verbose), error=function(e) NULL)
               })
    names(content_dmp) = cat_dmp #Bennenen der Listen
    page_dmp = c(page_dmp, lapply(content_dmp, function(i) i$pages))  # Neu abgerufene Seiten zu bisher abgerufenen Seiten hinzufügen
    cat_dmp = unique(unlist(lapply(content_dmp, function(i) i$subcats))) # Neu gefundene Kategorien für nächste Abfragen sammeln
    loopcount = loopcount+1
    if(loopcount>=looplimit) break # Abbrechen, falls Looplimit erreicht wurde
  }
page_dmp #Ausgabe einer Liste mit allen Seiten
}

Anwendung 2

Seiten und Unterkatorien in der Kategorie:Krankheit

sample.kat_krnkht = f_loop_subcats(start_cat = "Krankheit", language = "de")
length(sample.kat_krnkht) #Zahl der abgerufenen Kategorien
## [1] 175
length(unique(unlist(sample.kat_krnkht))) #Zahl der Seiten
## [1] 6225
sample.kat_krnkht[1:3]
## $Krankheit
##  [1] "Krankheit"                             
##  [2] "Liste der Syndrome"                    
##  [3] "Morbus"                                
##  [4] "Adenitis"                              
##  [5] "Angina"                                
##  [6] "Cannabis-Hyperemesis-Syndrom"          
##  [7] "Erythromelalgie"                       
##  [8] "Exposom"                               
##  [9] "Golfkriegssyndrom"                     
## [10] "Hämopyrrollaktamurie"                  
## [11] "Höhenkrankheit"                        
## [12] "Insuffizienz"                          
## [13] "Interkurrente Erkrankung"              
## [14] "Katarrh"                               
## [15] "Krankenabendmahl"                      
## [16] "Krankheitskonzept"                     
## [17] "Lipödem"                               
## [18] "Manifest (Medizin)"                    
## [19] "Obstruktion (Medizin)"                 
## [20] "Obturation"                            
## [21] "Okklusion (Medizin)"                   
## [22] "Penetration (Medizin)"                 
## [23] "Phrenitis"                             
## [24] "Retention (Medizin)"                   
## [25] "Schizoaffektive Störung"               
## [26] "Schwarze Haarzunge"                    
## [27] "Sick-Building-Syndrom"                 
## [28] "Simulator Sickness"                    
## [29] "Skrofulose"                            
## [30] "Spontanheilung"                        
## [31] "Vielfache Chemikalienunverträglichkeit"
## 
## $Autoimmunerkrankung
##  [1] "Autoimmunerkrankung"                                         
##  [2] "Antiphospholipid-Syndrom"                                    
##  [3] "Autoimmunhämolytische Anämie"                                
##  [4] "Autoimmunthyreopathie"                                       
##  [5] "Blasenbildende Autoimmundermatosen"                          
##  [6] "Bullöses Pemphigoid"                                         
##  [7] "Chronisch inflammatorische demyelinisierende Polyneuropathie"
##  [8] "Chronische Immun-Thrombozytopenie"                           
##  [9] "Churg-Strauss-Syndrom"                                       
## [10] "Colitis ulcerosa"                                            
## [11] "CREST-Syndrom"                                               
## [12] "Degos-Syndrom"                                               
## [13] "Dermatitis herpetiformis Duhring"                            
## [14] "Diabetes mellitus"                                           
## [15] "Endokrine Orbitopathie"                                      
## [16] "Erworbene isolierte aplastische Anämie"                      
## [17] "Evans-Syndrom"                                               
## [18] "Experimentelle autoimmune Enzephalomyelitis"                 
## [19] "Gastritis"                                                   
## [20] "Glomerulonephritis"                                          
## [21] "Goodpasture-Syndrom"                                         
## [22] "Granulomatose mit Polyangiitis"                              
## [23] "Hashimoto-Thyreoiditis"                                      
## [24] "Hughes-Stovin-Syndrom"                                       
## [25] "Idiopathische thrombozytopenische Purpura"                   
## [26] "Immunkomplexvaskulitis"                                      
## [27] "Insulitis"                                                   
## [28] "Kollagenose"                                                 
## [29] "Konzentrische Sklerose Baló"                                 
## [30] "Kutane leukozytoklastische Angiitis"                         
## [31] "LADA"                                                        
## [32] "Lambert-Eaton-Rooke-Syndrom"                                 
## [33] "Lichen sclerosus"                                            
## [34] "Limbische Enzephalitis"                                      
## [35] "Lupus erythematodes"                                         
## [36] "Mikroskopische Polyangiitis"                                 
## [37] "Morbus Basedow"                                              
## [38] "Morbus Crohn"                                                
## [39] "Multiple Sklerose"                                           
## [40] "Myasthenia gravis"                                           
## [41] "Nebennierenrindeninsuffizienz"                               
## [42] "Neuromyelitis optica"                                        
## [43] "PANDAS"                                                      
## [44] "Pemphigoides gestationis"                                    
## [45] "Pemphigus foliaceus"                                         
## [46] "Pemphigus vulgaris"                                          
## [47] "Perniziöse Anämie"                                           
## [48] "Pityriasis"                                                  
## [49] "Pityriasis lichenoides et varioliformis acuta"               
## [50] "Poliosis"                                                    
## [51] "Polyarteriitis nodosa"                                       
## [52] "Polychondritis"                                              
## [53] "Polyendokrine Autoimmunerkrankungen"                         
## [54] "Polymyalgia rheumatica"                                      
## [55] "Primär biliäre Zirrhose"                                     
## [56] "Psoriasisarthritis"                                          
## [57] "Purpura Schönlein-Henoch"                                    
## [58] "Pyoderma gangraenosum"                                       
## [59] "Rasmussen-Enzephalitis"                                      
## [60] "Reaktive Arthritis"                                          
## [61] "Sakroiliitis"                                                
## [62] "Schuppenflechte"                                             
## [63] "Sharp-Syndrom"                                               
## [64] "Sjögren-Syndrom"                                             
## [65] "Sklerodermie"                                                
## [66] "Spondylitis ankylosans"                                      
## [67] "Stiff-man-Syndrom"                                           
## [68] "Sympathische Ophthalmie"                                     
## [69] "Takayasu-Arteriitis"                                         
## [70] "Transverse Myelitis"                                         
## [71] "Vaskulitis"                                                  
## [72] "Vitiligo"                                                    
## [73] "Vogt-Koyanagi-Harada-Syndrom"                                
## 
## $`Ernährungsbedingte Erkrankung`
##  [1] "Liste der endokrinen, Ernährungs- und Stoffwechselkrankheiten nach ICD-10"
##  [2] "Adipositas"                                                               
##  [3] "Balkan-Nephropathie"                                                      
##  [4] "Eisenmangel"                                                              
##  [5] "Erdnussallergie"                                                          
##  [6] "Fehlernährung"                                                            
##  [7] "Glutamat-Unverträglichkeit"                                               
##  [8] "Hypervitaminose"                                                          
##  [9] "Hypervitaminose D"                                                        
## [10] "Inanition"                                                                
## [11] "Intestinale Fruktoseintoleranz"                                           
## [12] "Jodmangel"                                                                
## [13] "Kachexie"                                                                 
## [14] "Kaninchenhunger"                                                          
## [15] "Kaschin-Beck-Krankheit"                                                   
## [16] "Keshan-Krankheit"                                                         
## [17] "Kretinismus"                                                              
## [18] "Kuhmilchallergie"                                                         
## [19] "Kupfermangel"                                                             
## [20] "Kwashiorkor"                                                              
## [21] "Laktoseintoleranz"                                                        
## [22] "Lipomastie"                                                               
## [23] "Magnesiummangel"                                                          
## [24] "Mangelerkrankung"                                                         
## [25] "Mangelernährung"                                                          
## [26] "Marasmus"                                                                 
## [27] "Nahrungsdeprivation"                                                      
## [28] "Nahrungsmittelallergie"                                                   
## [29] "Plummer-Vinson-Syndrom"                                                   
## [30] "Pyridoxinmangel"                                                          
## [31] "Sekundäre Nahrungsmittelallergie"                                         
## [32] "Selenmangel"                                                              
## [33] "Selenose"                                                                 
## [34] "Stammfettsucht"                                                           
## [35] "Überernährung"                                                            
## [36] "Unterernährung"                                                           
## [37] "Untergewicht"                                                             
## [38] "Zöliakie"