排除R中术语文档矩阵的colSums中的异常值

排除R中术语文档矩阵的colSums中的异常值,r,subset,text-mining,outliers,term-document-matrix,R,Subset,Text Mining,Outliers,Term Document Matrix,我创建了一个术语文档矩阵“myDtm”,其中包含一组包含在大量专利集合中的关键字。我想获得一个有序的、排名前100的、关键词频率最高的专利列表 代码行是 myDtm <- TermDocumentMatrix(myCorpus, control = list(minWordLength = 1)) keywords <- unique(c("labor","cost","autom", "human" ,"person", "intens","reduc","machin","alg

我创建了一个术语文档矩阵“myDtm”,其中包含一组包含在大量专利集合中的关键字。我想获得一个有序的、排名前100的、关键词频率最高的专利列表

代码行是

myDtm <- TermDocumentMatrix(myCorpus, control = list(minWordLength = 1))
keywords <- unique(c("labor","cost","autom", "human" ,"person", "intens","reduc","machin","algorithm"))
inspect(myDtm[keywords,tail(order(colSums(v)),100)])
问题是:如何排除异常值,比如专利号6822?对于异常值,我指的是只包含一两个关键词但频率非常高的专利。我想获得一个前100名专利的列表,看起来像专利号20447或27640,其中包含了大多数关键字。更具体地说,是否有一种说法:按照关键词提及的频率排列列,并确保至少有50%的关键词被提及? ?


提前感谢。

以下内容排除了存在少于2个关键字的所有专利,并为您提供了一个数据框架,其中仅剩余存在多于2个关键字的专利:

myDtm[ ,c(TRUE, sapply(myDtm[-1], function(x) sum(ifelse(x > 0, 1,0)) > 2))]
如果你只想为前100名做这件事,只需将上面的代码与行的过滤器(你已经在你的OP代码中)结合起来

如果您想要至少50%的关键词,则必须执行以下操作:

myDtm[ ,c(TRUE, sapply(myDtm[-1], function(x) sum(ifelse(x > 0, 1,0))/length(x) > 0.5))]
或相当于:

myDtm[ ,c(TRUE, sapply(myDtm[-1], function(x) mean(ifelse(x > 0, 1,0)) >= 0.5))]
或在函数表示法中:

cbind(myDtm[1], Filter(function(x) mean(ifelse(x > 0, 1, 0)) >= 0.5, myDtm[-1]))
如果您想检查频率计数,请创建一个新的df,并生成一些箱线图、汇总统计数据等(例如,1.5*IQR四分位间距通常用作异常值的截止值):

table_Frequency_counts 0,1,0)))
箱线图(表\u频率\u计数)
汇总表(频率统计表)
1.5*IQR(表\u频率\u计数)

您所说的异常值是什么意思?如何定义异常值?“包含大多数关键词的地方”太模糊,无法将其形式化,您需要更具体一些,比如:应该包含60%的词还是多少?您可以做的是计算每个文档中的术语数量,用方框图绘制它,并以这种方式确定截止点应该是什么,比如
newDtm 0,1,0));boxplot(colSums(newDtm)
一项专利,其中仅表示一个或两个关键字,但经常使用,因此进入前100名(例如专利41149或2461)。我只对多个关键字提及的专利感兴趣(例如专利20447)嘿,非常感谢你的帮助。这已经让我走得更远了。我刚刚发现了一个名为“textir”的包,其中包含一个名为“tf idf”的函数,它根据频率计数而不是绝对计数对文档进行排序(请参见此处第9页:)-你认为这会有帮助吗?如我所说,我会使用汇总统计和绘图(例如箱线图)查看频率计数的分布然后决定停止,我不知道你想展示什么,做什么,等等。决定什么是合适的取决于这么多事情,所以我身边的任何答案都只是猜测,我编辑了我的帖子,让你有代码来做…欢迎你,请点击勾选接受答案,如果它回答了你的问题,然后点击向上箭头
cbind(myDtm[1], Filter(function(x) mean(ifelse(x > 0, 1, 0)) >= 0.5, myDtm[-1]))
table_Frequency_counts <- sapply(myDtm[-1], function(x) mean(ifelse(x > 0, 1, 0)))
boxplot(table_Frequency_counts)
summary(table_Frequency_counts)
1.5 * IQR(table_Frequency_counts)