R的tm包用于字数统计

时间:2014-10-22 14:46:11

标签: r word-count tm corpus text-analysis

我有一个包含超过5000个文本文件的语料库。我想在每个文件运行预处理之后获得每个文件的单个字数(转向更低,删除停用词等)。我对单个文本文件的单词计数没有任何好运。任何帮助将不胜感激。

library(tm)
revs<-Corpus(DirSource("data/")) 
revs<-tm_map(revs,tolower) 
revs<-tm_map(revs,removeWords, stopwords("english")) 
revs<-tm_map(revs,removePunctuation) 
revs<-tm_map(revs,removeNumbers) 
revs<-tm_map(revs,stripWhitespace) 
dtm<-DocumentTermMatrix(revs) 

4 个答案:

答案 0 :(得分:11)

正如泰勒所说,如果没有可重复的例子,你的问题就不完整了。以下是如何针对此类问题制作可重现的示例 - 使用随程序包内置的数据:

library("tm") # version 0.6, you seem to be using an older version
data(crude)
revs <- tm_map(crude, content_transformer(tolower)) 
revs <- tm_map(revs, removeWords, stopwords("english")) 
revs <- tm_map(revs, removePunctuation) 
revs <- tm_map(revs, removeNumbers) 
revs <- tm_map(revs, stripWhitespace) 
dtm <- DocumentTermMatrix(revs)

以下是如何获取每个文档的单词计数,dtm的每一行都是一个文档,因此您只需对行的列求和,并为文档指定单词:

# Word count per document
rowSums(as.matrix(dtm))

答案 1 :(得分:5)

您也可以在我与Paul Nulty合作开发的quanteda package中执行此操作。为此目的,使用quanteda工具创建自己的语料库很容易,但它也直接导入tm个VCorpus对象(如下所示)。

您可以使用语料库对象类型的summary()方法获取每个文档的令牌计数,或者使用dfm()创建文档功能矩阵,然后在生成的文档上使用rowSums() - 特征矩阵。默认情况下,dfm()会应用您需要使用tm包单独申请的清理步骤。

data(crude, package="tm")
mycorpus <- corpus(crude)
summary(mycorpus)
## Corpus consisting of 20 documents.
## 
## Text Types Tokens Sentences
## reut-00001.xml    56     90         8
## reut-00002.xml   224    439        21
## reut-00004.xml    39     51         4
## reut-00005.xml    49     66         6
## reut-00006.xml    59     88         3
## reut-00007.xml   229    443        25
## reut-00008.xml   232    420        23
## reut-00009.xml    96    134         9
## reut-00010.xml   165    297        22
## reut-00011.xml   179    336        20
## reut-00012.xml   179    360        23
## reut-00013.xml    67     92         3
## reut-00014.xml    68    103         7
## reut-00015.xml    71     97         4
## reut-00016.xml    72    109         4
## reut-00018.xml    90    144         9
## reut-00019.xml   117    194        13
## reut-00021.xml    47     77        12
## reut-00022.xml   142    281        12
## reut-00023.xml    30     43         8
## 
## Source:  Converted from tm VCorpus 'crude'.
## Created: Sun May 31 18:24:07 2015.
## Notes:   .
mydfm <- dfm(mycorpus)
## Creating a dfm from a corpus ...
## ... indexing 20 documents
## ... tokenizing texts, found 3,979 total tokens
## ... cleaning the tokens, 115 removed entirely
## ... summing tokens by document
## ... indexing 1,048 feature types
## ... building sparse matrix
## ... created a 20 x 1048 sparse dfm
## ... complete. Elapsed time: 0.039 seconds.
rowSums(mydfm)
## reut-00001.xml reut-00002.xml reut-00004.xml reut-00005.xml reut-00006.xml reut-00007.xml 
##             90            439             51             66             88            443 
## reut-00008.xml reut-00009.xml reut-00010.xml reut-00011.xml reut-00012.xml reut-00013.xml 
##            420            134            297            336            360             92 
## reut-00014.xml reut-00015.xml reut-00016.xml reut-00018.xml reut-00019.xml reut-00021.xml 
##            103             97            109            144            194             77 
## reut-00022.xml reut-00023.xml 
##            281             43 

我很乐意帮助解决与quanteda相关的任何问题。

答案 2 :(得分:0)

您的问题没有说明您只想要基于R的解决方案,因此这里有一个非常简单的解决方案,用于计算文本文件中的单词:在终端或命令行使用Gnu实用程序wc,{ {1}}指定单词,例如

-w

显示的数字是这组说明性文本文件的字数。

KB-iMac:~ kbenoit$ wc -w *.txt 3 mytempfile.txt 3 mytempfileAscii.txt 14 tweet12.txt 17 tweet12b.txt 37 total 已包含在OS X和Linux中,可以从Rtools set为Windows安装。

答案 3 :(得分:0)

您可以尝试这样做:

for (m in 1:length(revs) {
sum(nchar(as.character(revs[[m]])))
}