You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:41:12