首先,我想说的是,我对机器学习、kmeans和r还是一个新手,这个项目是了解更多这方面知识的一种手段,也是向我们的首席信息官展示这些数据的一种手段,这样我就可以在开发新的帮助台系统时使用这些数据。
我有一个60K行的文本文件。该文件包含教师在3年内输入的帮助台票证的标题。
我想创建一个r程序,它接受这些标题并创建一组类别。例如,与打印问题有关的术语,或者一组与投影仪灯泡有关的术语。我已经使用r打开文本文档,清理数据,删除停用词和其他我认为不必要的词。我得到了一个频率〉=的所有术语的列表400并将其保存到文本文件。
但是现在我想对同一个数据集应用(如果可以或者合适的话)kmeans聚类,看看是否可以得出分类。
下面的代码包含了将写出所使用的〉= 400的术语列表的代码。它位于末尾,并被注解掉了。
library(tm) #load text mining library
library(SnowballC)
options(max.print=5.5E5)
setwd('c:/temp/') #sets R's working directory to near where my files are
ae.corpus<-Corpus(DirSource("c:/temp/"),readerControl=list(reader=readPlain))
summary(ae.corpus) #check what went in
ae.corpus <- tm_map(ae.corpus, tolower)
ae.corpus <- tm_map(ae.corpus, removePunctuation)
ae.corpus <- tm_map(ae.corpus, removeNumbers)
ae.corpus <- tm_map(ae.corpus, stemDocument, language = "english")
myStopwords <- c(stopwords('english'), <a very long list of other words>)
ae.corpus <- tm_map(ae.corpus, removeWords, myStopwords)
ae.corpus <- tm_map(ae.corpus, PlainTextDocument)
ae.tdm <- DocumentTermMatrix(ae.corpus, control = list(minWordLength = 5))
dtm.weight <- weightTfIdf(ae.tdm)
m <- as.matrix(dtm.weight)
rownames(m) <- 1:nrow(m)
#euclidian
norm_eucl <- function(m) {
m/apply(m,1,function(x) sum(x^2)^.5)
}
m_norm <- norm_eucl(m)
results <- kmeans(m_norm,25)
#list clusters
clusters <- 1:25
for (i in clusters){
cat("Cluster ",i,":",findFreqTerms(dtm.weight[results$cluster==i],400,"\n\n"))
}
#inspect(ae.tdm)
#fft <- findFreqTerms(ae.tdm, lowfreq=400)
#write(fft, file = "dataTitles.txt",
# ncolumns = 1,
# append = FALSE, sep = " ")
#str(fft)
#inspect(fft)
当我使用RStudio运行这个程序时,我得到:
> results <- kmeans(m_norm,25)
sample.int(m,k)中的错误:当“replace = FALSE”时,无法获取大于总体的样本
我不是很确定这是什么意思,我也没有在网上找到很多关于这个的信息。有什么想法吗?
短暂性脑缺血发作
2条答案
按热度按时间fnx2tebb1#
您正在读取具有多行的单个文件,而不是目录中的多个文件。
你需要使用
然后你会得到一个语料库与60K文件,而不是1个文件与60K行。
bz4sfanl2#
我也遇到了同样的问题,最后发现目标聚类数大于某些类型的数据行,因为你的方法中每种类型的数据都可能小于目标聚类数。