Поиск ключевых терминов (корпуса) в другом в 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)

Однако, если ключевой термин состоит только из 1 слова:

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

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

corpus2.wrds Freq
research    2

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


person Lian Ahmad    schedule 04.05.2016    source источник


Ответы (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"),])
person Lenka Vraná    schedule 05.05.2016
comment
Привет, Ленка, спасибо. Да, код, который я реализовал, как-то устарел. когда я попробовал ваше решение с униграммами, я получил ошибку. - person Lian Ahmad; 05.05.2016
comment
Вы пробовали это с тем же предложением, которое вы привели в качестве примера (corpus2)? Вы можете выйти за пределы ошибки, если слово «исследование» не появится в ваших корпусах. Какой результат вы получите, когда запустите inspect(tdm)? - person Lenka Vraná; 05.05.2016