【问题标题】:How does the removeSparseTerms in R work?R 中的 removeSparseTerms 是如何工作的?
【发布时间】:2015-04-30 01:34:52
【问题描述】:

我在 R 中使用 removeSparseTerms 方法,它需要输入一个阈值。我还读到值越高,返回的矩阵中保留的项数就越多。

这个方法是如何工作的,它背后的逻辑是什么?我理解稀疏的概念,但这个阈值是否表示一个术语应该存在多少个文档,或者其他比例等?

【问题讨论】:

  • 我认为基本概念是 tdm 中的大多数条目都是空的,这意味着大多数术语不会出现在大多数文档中。矩阵中有很多很多零。在大型语料库中,通常 90% 或更多是零。如果您将阈值设置为 95%,则 tm 包会丢弃足够多的非常少见的术语(这会提高稀疏度百分比),因此生成的稀疏度较低的术语集只有 95% 的度量.然而,要记住的是,就内容的含义而言,不寻常的词可能非常重要。
  • 感谢您提出这个问题。 removeSparseTerms 的文档本身就非常稀疏......
  • 我将稀疏参数视为“保留率/保留率”

标签: r tm lda


【解决方案1】:

简单元素的相似频率,如果设置为0,则返回所有文本中出现的所有项目,如果设置为1,则返回文本中的所有项目。如果我选择 0.5,它将让我仅查看在整个元素中出现 50% 次的文本。这是通过在所有这样的每次处理之后计算来完成的

1- (sum(no_off_times_of_the_individual_text_element)/sum(no_off_total_text_elements))

【讨论】:

  • 0 不是稀疏的有效值。您必须略高于它并低于 1.0。
【解决方案2】:

sparseremoveSparseTerms() 的参数而言,稀疏度是指一个词条相对文档频率的阈值,高于该词条删除。这里的相对文档频率是指一个比例。正如命令的帮助页面所述(虽然不是很清楚),稀疏度在接近 1.0 时更小。 (注意稀疏度不能取 0 或 1.0 的值,只能取两者之间的值。)

例如,如果您将sparse = 0.99 设置为removeSparseTerms() 的参数,那么这将仅删除比0.99 更稀疏的术语。 sparse = 0.99 的确切解释是对于术语 $j$,您将保留所有符合以下条件的术语 $df_j > N * (1 - 0.99)$,其中 $N$ 是文档的数量——在这种情况下,可能所有术语都将被保留(参见下面的示例)。

接近另一个极端,如果sparse = .01,那么只会保留(几乎)出现在每个文档中的术语。 (当然这取决于术语的数量和文档的数量,在自然语言中,像“the”这样的常用词很可能出现在每个文档中,因此永远不会“稀疏”。)

稀疏度阈值为 0.99 的示例,其中一个词最多出现在(第一个示例)少于 0.01 个文档和(第二个示例)仅超过 0.01 个文档中:

> # second term occurs in just 1 of 101 documents
> myTdm1 <- as.DocumentTermMatrix(slam::as.simple_triplet_matrix(matrix(c(rep(1, 101), rep(1,1), rep(0, 100)), ncol=2)), 
+                                weighting = weightTf)
> removeSparseTerms(myTdm1, .99)
<<DocumentTermMatrix (documents: 101, terms: 1)>>
Non-/sparse entries: 101/0
Sparsity           : 0%
Maximal term length: 2
Weighting          : term frequency (tf)
> 
> # second term occurs in 2 of 101 documents
> myTdm2 <- as.DocumentTermMatrix(slam::as.simple_triplet_matrix(matrix(c(rep(1, 101), rep(1,2), rep(0, 99)), ncol=2)), 
+                                weighting = weightTf)
> removeSparseTerms(myTdm2, .99)
<<DocumentTermMatrix (documents: 101, terms: 2)>>
Non-/sparse entries: 103/99
Sparsity           : 49%
Maximal term length: 2
Weighting          : term frequency (tf)

以下是一些带有实际文本和术语的附加示例:

> myText <- c("the quick brown furry fox jumped over a second furry brown fox",
              "the sparse brown furry matrix",
              "the quick matrix")

> require(tm)
> myVCorpus <- VCorpus(VectorSource(myText))
> myTdm <- DocumentTermMatrix(myVCorpus)
> as.matrix(myTdm)
    Terms
Docs brown fox furry jumped matrix over quick second sparse the
   1     2   2     2      1      0    1     1      1      0   1
   2     1   0     1      0      1    0     0      0      1   1
   3     0   0     0      0      1    0     1      0      0   1
> as.matrix(removeSparseTerms(myTdm, .01))
    Terms
Docs the
   1   1
   2   1
   3   1
> as.matrix(removeSparseTerms(myTdm, .99))
    Terms
Docs brown fox furry jumped matrix over quick second sparse the
   1     2   2     2      1      0    1     1      1      0   1
   2     1   0     1      0      1    0     0      0      1   1
   3     0   0     0      0      1    0     1      0      0   1
> as.matrix(removeSparseTerms(myTdm, .5))
    Terms
Docs brown furry matrix quick the
   1     2     2      0     1   1
   2     1     1      1     0   1
   3     0     0      1     1   1

sparse = 0.34 的最后一个示例中,仅保留了出现在三分之二文档中的术语。

根据文档频率从文档术语矩阵中修剪术语的另一种方法是文本分析包quanteda。此处的相同功能不是指稀疏度,而是直接指术语的文档频率(如tf-idf)。

> require(quanteda)
> myDfm <- dfm(myText, verbose = FALSE)
> docfreq(myDfm)
     a  brown    fox  furry jumped matrix   over  quick second sparse    the 
     1      2      1      2      1      2      1      2      1      1      3 
> dfm_trim(myDfm, minDoc = 2)
Features occurring in fewer than 2 documents: 6 
Document-feature matrix of: 3 documents, 5 features.
3 x 5 sparse Matrix of class "dfmSparse"
       features
docs    brown furry the matrix quick
  text1     2     2   1      0     1
  text2     1     1   1      1     0
  text3     0     0   1      1     1

这种用法对我来说似乎更简单。

【讨论】:

  • 惊人的解释,谢谢。这应该进入 R 文档!
  • 确实很好的解释,也许你真的应该联系作者并至少添加一些 R 文档或网站。
  • 另外,我认为函数名称在我编辑后是正确的,但我想您需要查看 ?df_trim 的文档以正确使用参数。
【解决方案3】:

在函数removeSparseTerms()中,参数sparse = x的意思是:
“删除所有稀疏度大于阈值 (x) 的项”。
例如:removeSparseTerms(my_dtm, sparse = 0.90) 表示删除语料库中稀疏度大于 90% 的所有词条。

例如,一个词在大小为 1000 的语料库中仅出现 4 次,其出现频率为 0.004 =4/1000。

这个词的稀疏度将是(1000-4)/1000 = 1- 0.004 = 0.996 = 99.6%
因此,如果将稀疏度阈值设置为 sparse = 0.90,则该术语将被删除,因为它的稀疏度 (0.996) 大于上限稀疏度 (0.90)。
但是,如果将稀疏度阈值设置为 sparse = 0.999,则不会删除该术语,因为它的稀疏度 (0.996) 低于稀疏度上限 (0.999)。

【讨论】:

    猜你喜欢
    • 2015-09-15
    • 2013-09-27
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-15
    相关资源
    最近更新 更多