排除R

时间:2015-05-22 10:04:31

标签: 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","algorithm"))
inspect(myDtm[keywords,tail(order(colSums(v)),100)])

结果如下(摘录):

Terms       2435 33164 27276 1874 20447 41149 35987 21765 798 2461 19249 6822 27640
  labor        0     0     0    0     1     0     0     0   0    0     0    0     2
  cost        11     0     0    0    13     0     0     0   2    9     0    0     9
  autom        0     0     0    0    26     0     0     0   0    0     0    0     0
  human        0     0     0  270   150    16     0   279   0    0    54    0     1
  person       0    29     0    0    46     3     0     0   0    0     0    0     1
  intens       0     0     0    1     0     0     0     0   0    0     0    0    41
  reduc        8     0     8    9    13   289     2    12  12  305   292    0    44
  machin     264    77     0    0     2     0     0     2   0    0     0  323    31
  algorithm    0     0     8    0     0     0     1     0   2    0     0    0    95

问题:如何排除异常值,如专利号。 6822?对于异常值,我指的是仅包含一个或两个关键字但频率非常高的专利。我想获得看起来像专利号的前100名专利清单。 20447或27640,其中包含大多数关键字。更具体地说,是否有一种说法:按照关键字提及的频率对列进行排序并确保至少提到50%的关键字? ?

提前谢谢。

1 个答案:

答案 0 :(得分:0)

以下内容排除了所有少于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 <- 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)