RでremoveSparseTermsメソッドを使用していますが、入力にはしきい値が必要です。また、値が大きいほど、返される行列に保持される項の数が多くなることを読みました。
このメソッドはどのように機能し、その背後にあるロジックは何ですか?スパース性の概念は理解していますが、このしきい値は、用語が存在するドキュメントの数、または他の比率などを示していますか?
removeSparseTerms()
へのsparse
引数の意味では、スパース性は、用語の相対ドキュメント頻度のしきい値which上記の用語は削除されます。ここでの相対的な文書頻度は割合を意味します。コマンドのヘルプページに記載されているように(あまり明確ではありませんが)、スパース性は1.0に近づくにつれてsmallerです。 (スパース性は0または1.0の値を取ることができず、その間の値のみを取ることに注意してください。)
たとえば、removeSparseTerms()
の引数として_sparse = 0.99
_を設定した場合、これはmore0.99よりまばらな用語のみを削除します。 _sparse = 0.99
_の正確な解釈は、用語$ j $に対して、$ df_j> N *(1-0.99)$のすべての用語を保持することです。ここで、$ N $はドキュメントの数です。この場合おそらくすべての用語が保持されます(以下の例を参照)。
もう一方の極端に近い、_sparse = .01
_の場合、(ほぼ)すべてのドキュメントに現れる用語のみが保持されます。 (もちろん、これは用語の数とドキュメントの数に依存します。自然言語では、「the」のような一般的な単語はすべてのドキュメントで発生する可能性が高いため、決して「まばら」ではありません。)
スパース性しきい値0.99の例。最大で0.01個のドキュメント(最初の例)で発生する用語、および(2番目の例)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
_を使用した最後の例では、ドキュメントの3分の2に出現する用語のみが保持されました。
ドキュメントの頻度に基づいてドキュメント用語マトリックスから用語をトリミングするための代替アプローチは、テキスト分析パッケージ quantedaです。ここでの同じ機能は、sparsityではなく、用語のdocument frequencyを直接参照します(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
> 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は次を意味します。
"スパース性がしきい値(x)より大きいすべての用語を削除します"。
e.g: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
)よりも低いため、この用語は削除されません。
単純な要素の頻度。値を0に設定すると、すべてのテキストに表示されるすべてのアイテムが返されます。1に設定すると、すべてのアイテムがテキストで返されます。 0.5を選択すると、要素全体で50%の時間に表示されるテキストのみを表示できます。これは、次のようなすべての処理ごとに計算することにより行われます。
1-(sum(no_off_times_of_the_individual_text_elements)/ sum(no_off_total_text_elements))<= Set_Value