2016-05-04 8 views
2

Я задал этот вопрос раньше и получил отрицательную обратную связь, потому что я не предоставлял код. Я целый день пытался и пытался, и теперь я застрял в проблеме.Поиск ключевых терминов (Корпус) в другой в R

Этот код был выбран пользователем в Stackoverflow «Tyler Rincker» < - большое спасибо ему!

вот код:

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") 

Моя проблема заключается в том, что я хочу, чтобы искать биграмм или триграммы (2 или 3 слов) в корпусе.

Когда я выполнить эту строку кода:

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

Я получаю это результаты, которые должны показать частоту «1».

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

Однако, если keyterm только 1 слово:

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

код работает отлично, и я получаю следующий результат:

corpus2.wrds Freq 
research 2 

Спасибо большое! и, надеюсь, кто-то может помочь.

ответ

1

вы не можете найти никаких биграмм, потому что вы их не создали. Вы используете функцию strsplit(strip(corpus2), " "), которая создает только униграммы.

Я также рекомендую использовать функции предварительной обработки, которые доступны из пакета tm вместо вашей собственной функции strip().

Вы можете попробовать что-то подобное для юниграмм:

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"),]) 

Или аналогичный код для обоих юниграмм и биграмм:

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

Привет Ленка, спасибо. Да, код, который я реализовал, как-то устарел. когда я попробовал ваше решение с помощью униграмм, я вышел из связанной ошибки. –

+0

Вы попробовали это с тем же предложением, которое вы предоставили в качестве примера ('corpus2')? Вы можете получить ошибку «вне границ», если слово «исследование» не появляется в ваших корпусах. Какой результат вы получаете при запуске 'inspect (tdm)'? –

 Смежные вопросы

  • Нет связанных вопросов^_^