如何使用 R 中的“tm”包设置语料库中术语的 TF 权重
How do I set up TF weight of terms in corpus using the ‘tm’ package in R
我想知道如何在 tm packge 中获取术语频率权重,即(文档中的 tf=term/total 个术语)`
MyMatrix <- DocumentTermMatrix(a, control = list(weight= weightTf))
在我使用这个权重后,它显示的是术语的频率,而不是像这样的 TF 权重
Doc(1) 1 0 0 3 0 0 2
Doc(2) 0 0 0 0 0 0 0
Doc(3) 0 5 0 0 0 0 1
Doc(4) 0 0 0 2 2 0 0
Doc(5) 0 4 0 0 0 0 1
Doc(6) 5 0 0 0 1 0 0
Doc(7) 0 5 0 0 0 0 0
Doc(8) 0 0 0 1 0 0 7
像 MyMatrix / rowSums(MyMatrix) 这样的东西应该会给你想要的结果。
但是,如果文档没有术语(DTM 的文档全为零),则上述内容将导致一行 NaN,如下所示(如您的情况)
Doc(1) 0.1111111 0 0 0.5555556 0.1111111 0.2222222 0.0000000
Doc(2) 0.0000000 1 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(3) NaN NaN NaN NaN NaN NaN NaN
Doc(4) 1.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(5) 0.0000000 0 0 0.0000000 0.2857143 0.5714286 0.1428571
所以,更好的方法是:
t(apply(myMatrix, 1, function(x) if(sum(x) != 0) x / sum(x) else x))
期望的结果:
Doc(1) 0.1111111 0 0 0.5555556 0.1111111 0.2222222 0.0000000
Doc(2) 0.0000000 1 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(3) 0.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(4) 1.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(5) 0.0000000 0 0 0.0000000 0.2857143 0.5714286 0.1428571
例如
library(tm)
corp <- Corpus(VectorSource(c(doc1="hello world", doc2="hello new world")))
myfun <- WeightFunction(function(m) {
cs <- slam::col_sums(m)
m$v <- m$v/cs[m$j]
return(m)
}, "Term Frequency by Total Document Term Frequency", "termbytot")
dtm <- DocumentTermMatrix(corp, control = list(weighting = myfun))
inspect(dtm)
# <<DocumentTermMatrix (documents: 2, terms: 3)>>
# Non-/sparse entries: 5/1
# Sparsity : 17%
# Maximal term length: 5
#
# Terms
# Docs hello new world
# 1 0.5000000 0.0000000 0.5000000
# 2 0.3333333 0.3333333 0.3333333
我想知道如何在 tm packge 中获取术语频率权重,即(文档中的 tf=term/total 个术语)`
MyMatrix <- DocumentTermMatrix(a, control = list(weight= weightTf))
在我使用这个权重后,它显示的是术语的频率,而不是像这样的 TF 权重
Doc(1) 1 0 0 3 0 0 2
Doc(2) 0 0 0 0 0 0 0
Doc(3) 0 5 0 0 0 0 1
Doc(4) 0 0 0 2 2 0 0
Doc(5) 0 4 0 0 0 0 1
Doc(6) 5 0 0 0 1 0 0
Doc(7) 0 5 0 0 0 0 0
Doc(8) 0 0 0 1 0 0 7
像 MyMatrix / rowSums(MyMatrix) 这样的东西应该会给你想要的结果。
但是,如果文档没有术语(DTM 的文档全为零),则上述内容将导致一行 NaN,如下所示(如您的情况)
Doc(1) 0.1111111 0 0 0.5555556 0.1111111 0.2222222 0.0000000
Doc(2) 0.0000000 1 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(3) NaN NaN NaN NaN NaN NaN NaN
Doc(4) 1.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(5) 0.0000000 0 0 0.0000000 0.2857143 0.5714286 0.1428571
所以,更好的方法是:
t(apply(myMatrix, 1, function(x) if(sum(x) != 0) x / sum(x) else x))
期望的结果:
Doc(1) 0.1111111 0 0 0.5555556 0.1111111 0.2222222 0.0000000
Doc(2) 0.0000000 1 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(3) 0.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(4) 1.0000000 0 0 0.0000000 0.0000000 0.0000000 0.0000000
Doc(5) 0.0000000 0 0 0.0000000 0.2857143 0.5714286 0.1428571
例如
library(tm)
corp <- Corpus(VectorSource(c(doc1="hello world", doc2="hello new world")))
myfun <- WeightFunction(function(m) {
cs <- slam::col_sums(m)
m$v <- m$v/cs[m$j]
return(m)
}, "Term Frequency by Total Document Term Frequency", "termbytot")
dtm <- DocumentTermMatrix(corp, control = list(weighting = myfun))
inspect(dtm)
# <<DocumentTermMatrix (documents: 2, terms: 3)>>
# Non-/sparse entries: 5/1
# Sparsity : 17%
# Maximal term length: 5
#
# Terms
# Docs hello new world
# 1 0.5000000 0.0000000 0.5000000
# 2 0.3333333 0.3333333 0.3333333