R文本挖掘 - 语料库中的单词频率作为包含单词的文档数量

时间:2015-12-24 14:55:03

标签: r text-mining

findFreqTerms()命令会告诉我高频词以及它们在语料库中出现的次数。然而,我感兴趣的是不知道它们出现在语料库中的次数,而是知道有多少文档包含这些词。例如,如果我有10个文档的语料库,并且只有一个文档包含单词"错误",如果单词"错误"在该文档中出现100次,然后 findFreqTerms(dtm,lowfreq = 100)将返回"错误" (其中dtm是我的数据项矩阵)。同样地,使用 freqcy< - colSums(as.matrix(dtm)),我会找到"错误"的相关频率。然而,我想要归还的是1的答案 - 我想知道“"错误"只发生在一个文件中。

我有一个一次性的方法来做它我认为可以构建代码来获得我想要的东西,但我必须认为已经有了解决方案。

这是我目前的方法,使用"原油"数据集。

tdm<-DocumentTermMatrix(crude)
freq <- colSums(as.matrix(tdm))
freq[order(freq)]

这将返回&#34; oil&#34;频率为80。

which(names(freq)=="oil")

这将返回782和

inspect(tdm[,782])

给出

&LT;&GT; 非稀疏条目:20/0 稀疏度:0% 最大术语长度:3 加权:术语频率(tf)

 Terms
文件油

127 5

144 11

191 2

194 1

211 1

236 7

237 3

242 3

246 4

248 9

273 5

349 3

352 5

353 4

368 3

489 4

502 4

543 2

704 3

708 1

v<-as.vector(tdm[,782])
length(v[v>0])

返回20 - 包含单词&#34; oil&#34;的文档数。

我可以创建一个代码来遍历tdm中的所有元素并存储长度,然后选择高频。我想知道是否有更好的解决方案。

2 个答案:

答案 0 :(得分:2)

假设你有

library(tm)
docs <- c(doc1="Foo bar bar bar", doc2="Lorem Foo Ipsum")
那么你可以,例如做

tdm <- TermDocumentMatrix(Corpus(VectorSource(docs)))
rowSums(as.matrix(tdm)>0)
# bar   foo ipsum lorem 
# 1     2     1     1 

tdm <- TermDocumentMatrix(Corpus(VectorSource(docs)), list(weighting=weightBin))
rowSums(as.matrix(tdm))
# bar   foo ipsum lorem 
# 1     2     1     1 

获取包含每个标记的文档数。

答案 1 :(得分:0)

这是一项称为术语特征的文档频率的度量,其最简单的形式是指术语出现的文档数。它是常见特征加权方案的组成部分,例如tf-idf(倒置和对数变换时)。

用于文本分析的 quanteda 包具有此内置功能,如果您正在寻找一种与稀疏文档 - 术语矩阵结构一起使用的高效实现。例如:

require(quanteda)
inaugCorpus
## Corpus consisting of 57 documents.
myDfm <- dfm(inaugCorpus, verbose = FALSE)
head(docfreq(myDfm))
## fellow-citizens              of             the          senate             and           house 
##              19              57              57               9              57               8 
docfreq(myDfm)["terror"]
## terror 
##      7