dfm_lookup异常问题:词典条目顺序影响特征频次统计
问题分析与解决方案
问题本质
在quanteda 4.1.0中,使用dfm_lookup()并设置exclusive = FALSE时,词典条目的顺序会错误影响特征频次统计,导致计数结果颠倒。这是该版本dfm_lookup()的已知bug——非排他性匹配场景下,后定义的词典键会错误覆盖先定义键的计数,即便特征本身不存在交叉匹配的情况。
解决方案
方案1:使用exclusive = TRUE(推荐,无需保留原特征时)
将exclusive设为TRUE,dfm_lookup()会直接把匹配特征替换为词典键,不再保留原特征,此时词典顺序不会影响统计结果:
library(quanteda) library(quanteda.textstats) # 构建原始dfm dfmat <- dfm(tokens(c("I like apples, but I don't like apple pie. Bananas are OK", "I like bananas, but I don't like banana fritter."))) # 词典顺序为banana在前 dict <- dictionary(list(banana = c("banana*"), apple = c("apple*"))) # 设置exclusive = TRUE dfmat <- dfm_lookup(dfmat, dictionary = dict, exclusive = TRUE, capkeys = FALSE) # 查看统计结果 textstat_frequency(dfmat) %>% filter(grepl("apple|banana", feature)) # feature frequency rank docfreq group # 1 banana 3 1 2 all # 2 apple 2 2 1 all
方案2:先对tokens执行lookup再转dfm
若需要保留原特征(exclusive = FALSE场景),可以先对tokens对象执行tokens_lookup(),再转换为dfm,绕过dfm_lookup()的bug:
# 构建tokens对象 toks <- tokens(c("I like apples, but I don't like apple pie. Bananas are OK", "I like bananas, but I don't like banana fritter.")) # 词典顺序为banana在前 dict <- dictionary(list(banana = c("banana*"), apple = c("apple*"))) # 先对tokens执行lookup toks_lookup <- tokens_lookup(toks, dictionary = dict, exclusive = FALSE) # 转换为dfm dfmat <- dfm(toks_lookup) # 查看统计结果 textstat_frequency(dfmat) %>% filter(grepl("apple|banana", feature)) # 结果会正确显示banana频次3,apple频次2
方案3:升级quanteda版本
该bug在quanteda后续版本(如4.2.0及以上)已被修复,升级到最新版本即可彻底解决问题:
install.packages("quanteda")
内容的提问来源于stack exchange,提问作者Rob Ackland
相关产品推荐
相关产品推荐

