2016-05-04 12 views
2

Ich habe diese Frage vor und bekam eine negative Bewertung, weil ich keinen Code zur Verfügung gestellt habe. Ich habe den ganzen Tag damit verbracht, es zu versuchen und zu versuchen, und jetzt stecke ich in einem Problem fest.Suche nach Schlüsselbegriffen (Corpus) in eine andere in R

Dieser Code wurde von einem Benutzer in Stackoverflow "Tyler Rincker" < - großer Dank an ihn geholt!

hier ist der Code:

strip <- function(x, digit.remove = TRUE, apostrophe.remove = FALSE){ 
      strp <- function(x, digit.remove, apostrophe.remove){ 
      x2 <- Trim(tolower(gsub(".*?($|'|[^[:punct:]]).*?", "\\1", as.character(x)))) 
      x2 <- if(apostrophe.remove) gsub("'", "", x2) else x2 
      ifelse(digit.remove==TRUE, gsub("[[:digit:]]", "", x2), x2) 
      } 
      unlist(lapply(x, function(x) Trim(strp(x =x, digit.remove = digit.remove, 
           apostrophe.remove = apostrophe.remove)))) 

corpus2 <- "In Westerman's disruptive article, Quantitative research as 
     an interpretive enterprise: The mostly 
     unacknowledged role of interpretation in research efforts." 

    corpus2 <- gsub("\\s+", " ", gsub("\n|\t", " ", corpus2)) 
    corpus2.wrds <- as.vector(unlist(strsplit(strip(corpus2), " "))) 

    corpus2.Freq <- data.frame(table(corpus2.wrds)) 
    corpus2.Freq$corpus2.wrds <- as.character(corpus2.Freq$corpus2.wrds) 
    corpus2.Freq <- corpus2.Freq[order(-corpus2.Freq$Freq), ] 
    rownames(corpus2.Freq) <- 1:nrow(corpus2.Freq) 

    key.terms <- c("research as") 

Mein Problem ist, dass ich für Bigramme oder trigram (2 oder 3 Wörter) im Korpus suchen möchten.

Wenn ich diese Codezeile ausführen:

corpus2.Freq[corpus2.Freq$corpus2.wrds %in%key.terms, ] 

Ich erhalte diese Ergebnisse, die mit einer Frequenz von „1“ zeigen.

[1] corpus2.wrds Freq   
<0 rows> (or 0-length row.names) 

Wenn jedoch die keyterm nur 1 Wort:

key.terms <- c("research") 
    corpus2.Freq[corpus2.Freq$corpus2.wrds %in%key.terms, ] 

der Code funktioniert gut und ich bekomme folgendes Ergebnis:

corpus2.wrds Freq 
research 2 

Vielen Dank! und hoffentlich kann jemand helfen.

Antwort

1

Sie können keine Bigramme finden, weil Sie sie nicht erstellt haben. Sie verwenden die Funktion strsplit(strip(corpus2), " "), die nur Unigramme erzeugt.

Ich empfehle Ihnen auch, Vorverarbeitungsfunktionen zu verwenden, die von tm Paket statt Ihrer eigenen strip() Funktion verfügbar sind.

Sie können so etwas für Unigramme versuchen:

library(tm) 

# create corpora 
corp = VCorpus(VectorSource(corpus2)) 

# this should replace your strip() function 
ctrl = list(tokenize = function(x) unlist(strsplit(as.character(x), "[[:space:]]+")), 
     removePunctuation = TRUE, 
     removeNubers = TRUE, 
     tolower = TRUE) 

tdm = TermDocumentMatrix(corp, control = ctrl) 
inspect(tdm) 
inspect(tdm[c("research"),]) 

oder ähnlichen Code für beide Unigramme und Bigramme:

ctrl2 = list(tokenize = function(x) unlist(lapply(ngrams(words(x), 1:2), paste, collapse = " "), use.names = FALSE), 
     removePunctuation = TRUE, 
     removeNubers = TRUE, 
     tolower = TRUE) 

tdm_bigrams = TermDocumentMatrix(corp, control = ctrl2) 
inspect(tdm_bigrams) 
inspect(tdm_bigrams[c("research"),]) 
inspect(tdm_bigrams[c("research as"),]) 
+0

Hallo Lenka, danke. Ja, der Code, den ich implementiert habe, ist irgendwie alt. als ich deine lösung mit den unigrammen ausprobiert habe, bin ich aus dem fehler geraten. –

+0

Haben Sie es mit dem gleichen Satz versucht, den Sie als Beispiel angegeben haben ('corpus2')? Sie könnten den Fehler "out of bounds" erhalten, wenn das Wort "research" nicht in Ihren Korpora erscheint. Welche Ausgabe erhalten Sie, wenn Sie 'inspect (tdm)' ausführen? –