r - Sample.int(m, k) 中的错误 : cannot take a sample larger than the population

标签 r machine-learning data-mining k-means text-mining

首先,我要说的是,我对机器学习、kmeans 和 r 相当陌生,这个项目是一种了解更多相关知识的方法,也是向我们的 CIO 展示这些数据的方法,以便我可以在开发新的帮助台系统。

我有一个 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)

Error in sample.int(m, k) : cannot take a sample larger than the population when 'replace = FALSE'

我不太确定这意味着什么,而且我在网上也没有找到很多关于这方面的信息。有什么想法吗?

TIA

最佳答案

您正在读取具有多行的单个文件,而不是目录中的多个文件。而不是

ae.corpus<-Corpus(DirSource("c:/temp/"),readerControl=list(reader=readPlain))` 

你需要使用

text <- readLines("c:\\temp\\your_file_name", n = -1)
ae.corpus<-Corpus(VectorSource(text),readerControl=list(reader=readPlain)) 

然后您将获得一个包含 60K 文件的语料库,而不是 1 个包含 60k 行的文件。

关于r - Sample.int(m, k) 中的错误 : cannot take a sample larger than the population,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25745215/

相关文章:

r - 基于 data.frame 的权重或概率的样本行

r - 当列标题中有空格时如何在 Shiny 中正确呈现数据表

machine-learning - 为什么预习完成后,转移学习会导致错误/丢失从随机重新开始?

sql-server - 数据挖掘 - 预测分析

xpath - rapidminer 可以从 URL 列表中提取 xpath,而不是先保存 HTML 页面吗?

r - 结构()中的 "class"参数是什么?

RMarkdown 和 ggplot : Axis labels cut off

python - TensorFlow 计算结果略有不同

algorithm - 预测室内温度的机器学习算法

data-mining - 自组织映射(SOM)中的降维问题