我有一个包含超过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)
答案 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]])))
}