R 中的 removeSparseTerms 如何工作?
How does the removeSparseTerms in R work?
我在 R 中使用 removeSparseTerms 方法,它需要输入一个阈值。我还读到值越高,返回矩阵中保留的项数越多。
这种方法是如何工作的,其背后的逻辑是什么?我理解稀疏性的概念,但是这个阈值是否表示一个术语应该出现在多少文档中,或者其他比率等?
简单的说一个元素的点赞频率,如果你设置值为0,它会return所有文本中出现的所有项目,如果你设置为1,它会在任何地方return 文本中的所有项目。如果我选择 0.5,它会让我只查看整个元素中出现次数为 50% 的文本。这是通过计算
这样的每个处理完成的
1- (总和(no_off_times_of_the_individual_text_element)/总和(no_off_total_text_elements)) <= Set_Value
在removeSparseTerms()
的sparse
论证意义上,稀疏度是指相对文档频率的阈值,上面这个词将被删除。这里的相对文档频率是指一个比例。正如该命令的帮助页面所述(虽然不是很清楚),稀疏度在接近 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" 这样的常见词很可能出现在每个文档中,因此永远不会是 "sparse"。)
稀疏度阈值为 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
这种用法对我来说似乎更直接。
在函数removeSparseTerms()
中,参数sparse = x表示:
"remove all terms whose sparsity is greater than the threshold (x)".
例如:removeSparseTerms(my_dtm, sparse = 0.90)
表示删除语料库中所有稀疏度大于90%的词。
例如,一个词在大小为 1000 的语料库中出现 say 仅 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
)。
我在 R 中使用 removeSparseTerms 方法,它需要输入一个阈值。我还读到值越高,返回矩阵中保留的项数越多。
这种方法是如何工作的,其背后的逻辑是什么?我理解稀疏性的概念,但是这个阈值是否表示一个术语应该出现在多少文档中,或者其他比率等?
简单的说一个元素的点赞频率,如果你设置值为0,它会return所有文本中出现的所有项目,如果你设置为1,它会在任何地方return 文本中的所有项目。如果我选择 0.5,它会让我只查看整个元素中出现次数为 50% 的文本。这是通过计算
这样的每个处理完成的1- (总和(no_off_times_of_the_individual_text_element)/总和(no_off_total_text_elements)) <= Set_Value
在removeSparseTerms()
的sparse
论证意义上,稀疏度是指相对文档频率的阈值,上面这个词将被删除。这里的相对文档频率是指一个比例。正如该命令的帮助页面所述(虽然不是很清楚),稀疏度在接近 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" 这样的常见词很可能出现在每个文档中,因此永远不会是 "sparse"。)
稀疏度阈值为 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
这种用法对我来说似乎更直接。
在函数removeSparseTerms()
中,参数sparse = x表示:
"remove all terms whose sparsity is greater than the threshold (x)".
例如:removeSparseTerms(my_dtm, sparse = 0.90)
表示删除语料库中所有稀疏度大于90%的词。
例如,一个词在大小为 1000 的语料库中出现 say 仅 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
)。