Подсчет слов в тексте (в R): результаты нечитаемы

Я считаю слова в заданном тексте, используя R библиотеки tm и qdap. Когда в моем векторе (words) всего несколько слов, все выглядит нормально:

library(tm)
library(qdap)
text <- "activat affect affected affecting affects aggravat allow attribut based basis
bc because bosses caus change changed changes changing compel compliance"
text <- Corpus(VectorSource(text))
words <- c("activat", "affect", "affected")

# Using termco to search for the words in the text
apply_as_df(text, termco, match.list=words)

# Results:
#      docs    word.count    activat    affect    affected
# 1   doc 1            20   1(5.00%) 4(20.00%)    1(5.00%)

Но когда в моем векторе (words) слишком много слов, результаты становятся искаженными и нечитаемыми:

words <- c("activat", "affect", "affected", "affecting", "affects", "aggravat", "allow",
           "attribut", "based", "basis", "bc", "because", "bosses", "caus", "change",
           "changed", "changes", "changing", "compel", "compliance")

# Using termco to search for the words in the text
apply_as_df(text, termco, match.list=words)

# Results:
#     docs word.count  activat    affect affected affecting  affects aggravat    allow
# attribut    based    basis       bc  because   bosses      caus    change  changed
#  changes changing   compel compliance
# 1  doc 1         20 1(5.00%) 4(20.00%) 1(5.00%)  1(5.00%) 1(5.00%) 1(5.00%) 1(5.00%)
# 1(5.00%) 1(5.00%) 1(5.00%) 1(5.00%) 1(5.00%) 1(5.00%) 2(10.00%) 3(15.00%) 1(5.00%)
# 1(5.00%) 1(5.00%) 1(5.00%)   1(5.00%)

Как я могу отобразить результаты в фрейме данных/матрице, чтобы мне было легче их читать?


Я попытался использовать termco2mat (библиотека qdap), которая якобы «возвращает матрицу количества терминов» (https://trinker.github.io/qdap/termco.html) примерно так (см. ниже), но я получаю сообщение об ошибке:

apply_as_df(text, termco2mat, match.list=words)

# Results:
# Error in qdapfun(text.var = text, ...) : 
#   unused arguments (text.var = text, match.list = c("activat", "affect", "affected",
# "affecting", "affects", "aggravat", "allow", "attribut", "based", "basis", "bc",
# "because", "bosses", "caus", "change", "changed", "changes", "changing", "compel",
# "compliance"))

Or:

termco2mat(apply_as_df(text, termco, match.list=words))

# Results:
# Error in `rownames<-`(`*tmp*`, value = "doc 1") : 
#   attempt to set 'rownames' on an object with no dimensions

person David Spivak    schedule 29.01.2016    source источник


Ответы (2)


Вот решение без qdap:

library(tm)
text1 <- "activat affect affected affecting affects aggravat allow attribut"
text2 <- "based basis bc because bosses caus change changed changes changing compel compliance"
text <- Corpus(VectorSource(c(text1, text2)))
words <- c("activat", "affect", "affected")

dtm <- DocumentTermMatrix(text)
data.frame(cnt = colSums(as.matrix(dtm[ , words])))

Выход

         cnt
activat    1
affect     1
affected   1
person knb    schedule 30.01.2016

Я не уверен, что вы пытаетесь сделать, но scores counts как извлечь объекты из списка. Может быть, вы хотите t транспонировать вывод?

apply_as_df(text, termco, match.list=words) %>%
    counts() %>%
    t()

## docs       "doc 1"
## word.count "20"   
## activat    "1"    
## affect     "4"    
## affected   "1"    
## affecting  "1"    
## affects    "1"    
## aggravat   "1"    
## allow      "1"    
## attribut   "1"    
## based      "1"    
## basis      "1"    
## bc         "1"    
## because    "1"    
## bosses     "1"    
## caus       "2"    
## change     "3"    
## changed    "1"    
## changes    "1"    
## changing   "1"    
## compel     "1"    
## compliance "1"    
person Tyler Rinker    schedule 04.02.2016