词条文档熵计算
Term document entropy calculation
使用 dtm
可以获取术语频率。
如何计算 entropy?有什么简单的方法吗?它对某些文档中频率较低的术语给予更高的权重。
entropy = 1 + (Σj pij log2(pij)/log2n
pij = tfij / Σj tfij
tfij 是词 i 在文档 j 中出现的次数。
这是一个用于执行此操作的函数,尽管它可以通过在 p_ij 和对数计算中保持稀疏性来改进(例如 dfm_tfidf()
就是这样写的)。请注意,我稍微更改了公式,因为(根据 https://en.wikipedia.org/wiki/Latent_semantic_analysis#Mathematics_of_LSI 和其他来源)总和前面应该有一个负号。
library("quanteda")
textstat_entropy <- function(x, base = exp(1), k = 1) {
# this works because of R's recycling and column-major order, but requires t()
p_ij <- t(t(x) / colSums(x))
log_p_ij <- log(p_ij, base = base)
k - colSums(p_ij * log_p_ij / log(ndoc(x), base = base), na.rm = TRUE)
}
textstat_entropy(data_dfm_lbgexample, base = 2)
# A B C D E F G H I J K
# 1.000000 1.000000 1.000000 1.000000 1.000000 1.045226 1.045825 1.117210 1.173655 1.277210 1.378934
# L M N O P Q R S T U V
# 1.420161 1.428939 1.419813 1.423840 1.436201 1.440159 1.429964 1.417279 1.410566 1.401663 1.366412
# W X Y Z ZA ZB ZC ZD ZE ZF ZG
# 1.302785 1.279927 1.277210 1.287621 1.280435 1.211205 1.143650 1.092113 1.045825 1.045226 1.000000
# ZH ZI ZJ ZK
# 1.000000 1.000000 1.000000 1.000000
这匹配lsa包中的权重函数,当基数为e:
library("lsa")
all.equal(
gw_entropy(as.matrix(t(data_dfm_lbgexample))),
textstat_entropy(data_dfm_lbgexample, base = exp(1))
)
# [1] TRUE
使用 dtm
可以获取术语频率。
如何计算 entropy?有什么简单的方法吗?它对某些文档中频率较低的术语给予更高的权重。
entropy = 1 + (Σj pij log2(pij)/log2n
pij = tfij / Σj tfij
tfij 是词 i 在文档 j 中出现的次数。
这是一个用于执行此操作的函数,尽管它可以通过在 p_ij 和对数计算中保持稀疏性来改进(例如 dfm_tfidf()
就是这样写的)。请注意,我稍微更改了公式,因为(根据 https://en.wikipedia.org/wiki/Latent_semantic_analysis#Mathematics_of_LSI 和其他来源)总和前面应该有一个负号。
library("quanteda")
textstat_entropy <- function(x, base = exp(1), k = 1) {
# this works because of R's recycling and column-major order, but requires t()
p_ij <- t(t(x) / colSums(x))
log_p_ij <- log(p_ij, base = base)
k - colSums(p_ij * log_p_ij / log(ndoc(x), base = base), na.rm = TRUE)
}
textstat_entropy(data_dfm_lbgexample, base = 2)
# A B C D E F G H I J K
# 1.000000 1.000000 1.000000 1.000000 1.000000 1.045226 1.045825 1.117210 1.173655 1.277210 1.378934
# L M N O P Q R S T U V
# 1.420161 1.428939 1.419813 1.423840 1.436201 1.440159 1.429964 1.417279 1.410566 1.401663 1.366412
# W X Y Z ZA ZB ZC ZD ZE ZF ZG
# 1.302785 1.279927 1.277210 1.287621 1.280435 1.211205 1.143650 1.092113 1.045825 1.045226 1.000000
# ZH ZI ZJ ZK
# 1.000000 1.000000 1.000000 1.000000
这匹配lsa包中的权重函数,当基数为e:
library("lsa")
all.equal(
gw_entropy(as.matrix(t(data_dfm_lbgexample))),
textstat_entropy(data_dfm_lbgexample, base = exp(1))
)
# [1] TRUE