如何用quanteda计算全局TF并乘以词项专属IDF得到DFM?
计算TF-IDF并返回DFM格式结果
嘿,在quanteda里处理这个需求超级简单——不用手动拆分TF和IDF的计算,官方已经封装好了专门的函数,直接就能得到你要的DFM格式TF-IDF结果!
最直接的方法:使用dfm_tfidf()函数
你已经构建好了myDfm,只需要把它传入dfm_tfidf()函数,就能一步得到TF-IDF加权后的DFM:
# 计算TF-IDF,返回DFM格式 myDfm_tfidf <- dfm_tfidf(myDfm) # 查看结果示例(前5行前5列) head(myDfm_tfidf[, 1:5])
这个函数默认的计算逻辑完全符合你的需求:
- TF(词频):采用原始词频(即每个词在对应文档中的出现次数)
- IDF(逆文档频率):使用经典公式
log(N / df),其中N是总文档数,df是包含该词的文档数量 - 最终输出的
myDfm_tfidf依然是quanteda的DFM对象,保留所有原始DFM的属性和方法
自定义TF/IDF计算规则
如果需要调整TF或IDF的计算方式,dfm_tfidf()支持通过参数自定义:
# 示例:使用相对词频(词频/文档总词数)作为TF,平滑IDF避免除以0 myDfm_tfidf_custom <- dfm_tfidf( myDfm, scheme_tf = "prop", # TF采用相对频率 scheme_idf = "smooth" # IDF采用平滑版:log((N + 1)/(df + 1)) + 1 )
可选的参数值:
scheme_tf:"count"(默认,原始词频)、"prop"(相对频率)、"log"(对数转换词频)等scheme_idf:"inverse"(经典IDF)、"smooth"(平滑IDF)、"probabilistic"(概率IDF)等
手动计算(仅作原理演示)
如果你想手动实现计算逻辑(虽然不推荐,内置函数更高效稳定),可以这样做:
# 1. 提取TF(原始词频就是DFM本身) tf <- myDfm # 2. 计算IDF(平滑版,避免出现词在所有文档都出现时IDF为0的情况) total_docs <- nrow(myDfm) doc_freq <- colSums(dfm_weight(myDfm, scheme = "boolean")) # 统计每个词出现在多少文档中 idf <- log(total_docs / (doc_freq + 1)) # 3. 加权得到TF-IDF,结果依然是DFM格式 myDfm_tfidf_manual <- dfm_weight(tf, weights = idf)
手动计算的结果和dfm_tfidf(myDfm, scheme_idf = "smooth")是一致的,但直接用内置函数显然更省心~
内容的提问来源于stack exchange,提问作者Vl_dem
相关产品推荐
相关产品推荐

