在语料库的每个文档中查找最频繁的术语

时间:2013-11-04 02:25:27

标签: r apply text-mining tm

我一直在使用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 

思想?

2 个答案:

答案 0 :(得分:4)

Ben的回答给出了你所要求的但我不确定你所要求的是明智的。它没有说明关系。这是一种使用the qdap package的方法和第二种方法。他们会给你带有单词的列表(在qdap的情况下是一个包​​含单词和频率的数据框列表。你可以使用unlist通过第一个选项lapplyunlist来完成剩下的工作和qdap Corpus。qdap方法适用于原始apply(dtm, 1, function(x) unlist(dtm[["dimnames"]][2], use.names = FALSE)[x == max(x)])

选项#1:

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

选项#2与qdap:

tapply

lapply(WRAP_HERE, "[", 1)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" 一起包装,使得两个答案的内容相同,格式几乎相同。

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

{{1}}

答案 1 :(得分:2)

您几乎就在那里,将max替换为which.max以获取每个文档具有最高频率的术语的列索引(即每行)。然后使用列索引向量来对文档术语矩阵中的术语(或列名,种类)进行子集化。这将返回具有该文档最大频率的每个文档的实际术语(而不仅仅是频率值,就像使用max时那样)。所以,从你的例子开始

maxterms<-apply(dtm, 1, which.max)
dtm$dimnames$Terms[maxterms]
[1] "oil"     "opec"    "canada"  "crude"   "said"    "said"    "report"  "oil"    
 [9] "billion" "oil"     "mln"     "oil"     "oil"     "oil"     "power"   "oil"    
[17] "oil"     "dlrs"    "futures" "january"