我一直在使用R的tm包在分类问题上取得很大的成功。我知道如何在整个语料库中找到最常用的术语(使用findFreqTerms()),但是在文档中找不到最常用的术语(在我删除并删除停用词之后,但是在删除之前)语料库中的每个单独文档中的术语)。我尝试使用apply()max命令,但这使我在每个文档中出现该术语的次数最多,而不是该术语本身的名称。

library(tm)

data("crude")
corpus<-tm_map(crude, removePunctuation)
corpus<-tm_map(corpus, stripWhitespace)
corpus<-tm_map(corpus, tolower)
corpus<-tm_map(corpus, removeWords, stopwords("English"))
corpus<-tm_map(corpus, stemDocument)
dtm <- DocumentTermMatrix(corpus)
maxterms<-apply(dtm, 1, max)
maxterms
127 144 191 194 211 236 237 242 246 248 273 349 352
 5  13   2   3   3  10   8   3   7   9   9   4   5
353 368 489 502 543 704 708
 4   4   4   5   5   9   4


有什么想法吗?

最佳答案

Ben的答案给出了您所要的内容,但我不确定您所要的内容是否明智。它不考虑联系。这是使用the qdap package的方法和第二种方法。它们将为您提供带有单词的列表(在qdap的情况下,带有单词和频率的数据帧列表。您可以使用unlist通过第一个选项和lapply,索引和unlist来完成其余步骤。使用qdap。qdap方法适用于原始Corpus

选项1:

apply(dtm, 1, function(x) unlist(dtm[["dimnames"]][2],
    use.names = FALSE)[x == max(x)])


选项#2与qdap:

library(qdap)
dat <- tm_corpus2df(crude)
tapply(stemmer(dat$text), dat$docs, freq_terms, top = 1,
    stopwords = tm::stopwords("English"))


tapply包装lapply(WRAP_HERE, "[", 1)可使两个答案的内容完全相同,格式几乎相同。

编辑:添加了一个示例,它是qdap的更精简使用:

FUN <- function(x) freq_terms(x, top = 1, stopwords = stopwords("English"))[, 1]
lapply(stemmer(crude), FUN)

## [[1]]
## [1] "oil"   "price"
##
## [[2]]
## [1] "opec"
##
## [[3]]
## [1] "canada"   "canadian" "crude"    "oil"      "post"     "price"    "texaco"
##
## [[4]]
## [1] "crude"
##
## [[5]]
## [1] "estim"  "reserv" "said"   "trust"
##
## [[6]]
## [1] "kuwait" "said"
##
## [[7]]
## [1] "report" "say"
##
## [[8]]
## [1] "yesterday"
##
## [[9]]
## [1] "billion"
##
## [[10]]
## [1] "market" "price"
##
## [[11]]
## [1] "mln"
##
## [[12]]
## [1] "oil"
##
## [[13]]
## [1] "oil"   "price"
##
## [[14]]
## [1] "oil"  "opec"
##
## [[15]]
## [1] "power"
##
## [[16]]
## [1] "oil"
##
## [[17]]
## [1] "oil"
##
## [[18]]
## [1] "dlrs"
##
## [[19]]
## [1] "futur"
##
## [[20]]
## [1] "januari"

09-03 18:23