我在R中使用removeSparseTerms方法,它需要输入一个阈值。我还读到,值越高,返回矩阵中保留的术语数就越多。
这种方法如何运作,背后的逻辑是什么?我理解稀疏性的概念,但这个阈值是否表明一个术语应该出现多少文件,或其他比例等?
答案 0 :(得分:44)
对于sparse
的{{1}}参数,稀疏性指的是术语相对文档频率的阈值,高于该术语将被删除。相对文档频率在这里表示比例。作为命令的帮助页面(尽管不是很清楚),稀疏度较小,因为它接近1.0。 (请注意,稀疏性不能取值0或1.0,只能取值介于两者之间。)
例如,如果您将removeSparseTerms()
设置为sparse = 0.99
的参数,那么这将仅删除更多稀疏于0.99的术语。
removeSparseTerms()
的确切解释是,对于期限$ j $,您将保留所有条款
$ df_j> N *(1 - 0.99)$,其中$ N $是文件数量 - 在这种情况下,可能保留所有条款(见下面的例子)。
在另一个极端附近,如果sparse = 0.99
,则只会保留(几乎)每个文档中出现的字词。 (当然这取决于术语的数量和文档的数量,并且在自然语言中,像“the”这样的常用词可能出现在每个文档中,因此永远不会“稀疏”。)
稀疏度阈值为0.99的示例,其中一个术语最多出现在(第一个示例)少于0.01个文档中,而(第二个示例)出现的文档少于0.01个文档:
sparse = .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
的最后一个示例中,仅保留了三分之二文档中的术语。
基于文档频率从文档术语矩阵中修剪术语的另一种方法是文本分析包quanteda 。这里的相同功能不是指稀疏,而是指文档频率的术语(如 tf-idf )。
sparse = 0.34
这种用法对我来说似乎更直接。
答案 1 :(得分:5)
在函数removeSparseTerms()
中,参数sparse = x表示:
&#34;删除稀疏度大于阈值(x)&#34;的所有术语
例如:removeSparseTerms(my_dtm, sparse = 0.90)
表示删除语料库中稀疏度大于90%的所有术语。
例如,出现的术语在大小为1000的语料库中仅表示4次,其出现频率为0.004 = 4/1000。
此术语的稀疏性为(1000-4)/1000 = 1- 0.004 = 0.996 = 99.6%
因此,如果稀疏度阈值设置为稀疏= 0.90,则该术语将被删除,因为其稀疏性(0.996
)大于上限稀疏度(0.90
)。
但是,如果稀疏度阈值设置为sparse = 0.999
,则此字词不会被删除,因为其稀疏度(0.996
)低于上限稀疏度(0.999
)。
答案 2 :(得分:1)
简单就像元素的频率一样,如果将值设置为0,它将返回所有文本中出现的所有项目,无论您将其设置为1,它都将返回文本中的所有项目。如果我选择0.5,它将允许我仅查看在整个元素中出现50%的文本。这是通过在所有这样的每个处理之后计算
来完成的1-(sum(no_off_times_of_the_individual_text_element)/ sum(no_off_total_text_elements))&lt; = Set_Value