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

Quanteda重叠术语词频统计偏差问题求助

重叠术语导致词频统计偏差的排查与解决

问题核心

测试数据集内,Australia(2次)与Australia Post(1次)的计数无重叠,结果符合预期;但在实际数据中,aus字典项(包含Australia、this country、our country)的统计值为2333次,而正确预期应为2188次——显然Australia Post中的145次Australia被重复计入了aus的统计。

可能原因

  1. 字典匹配顺序错误:quanteda的tokens_compound按字典条目顺序优先匹配,若aus中的单个australia比auspost的australia post先出现在字典中,会先标记单个词,导致长短语无法被识别。
  2. 文本大小写不一致:实际数据中可能存在Australia post、australia Post等大小写变体,与字典内的小写短语无法匹配。
  3. 文本格式问题:实际数据中Australia Post可能存在多余空格、特殊字符,导致分词后无法被识别为完整短语。

解决步骤

1. 调整字典顺序,优先匹配长短语

将包含多词的短语条目放在单个词条目之前,确保长短语先被合并为单个token,避免单个词被重复统计:

dict  <- dictionary(list(
  auspost = "australia post",  # 长短语放在最前
  dairy = c("dairy", "dairy farms","dairy farm","milk"),
  aus = c("australia", "this country", "our country"),
  farmers = c("farmers", "farmer", "farm", "farms")
))

2. 统一文本大小写

分词前将所有文本转为小写,消除大小写差异对匹配的影响:

x <- tokens(txt, remove_punct = TRUE) %>% tokens_tolower()

3. 清理文本格式

处理实际数据中的多余空格、特殊字符,确保短语分词正确:

# 替换多个空格为单个空格,清理特殊字符
txt_clean <- stringr::str_replace_all(txt, "\\s+", " ")
x <- tokens(txt_clean, remove_punct = TRUE) %>% tokens_tolower()

4. 显式设置匹配参数

强制tokens_compound进行大小写不敏感的精确匹配:

dfm2 <- dfm(tokens_compound(x, dict, case_insensitive = TRUE, valuetype = "fixed")) %>% 
  dfm_select(dict)

5. 验证匹配结果

用kwic分别查看auspost和aus的匹配位置,确认无重叠:

# 查看auspost的所有匹配
kwic_auspost <- kwic(x, pattern = dict[["auspost"]], case_insensitive = TRUE)
# 查看aus中australia的匹配
kwic_aus <- kwic(x, pattern = "australia", case_insensitive = TRUE)

测试集正常的原因

测试集的字典中auspost条目位于aus之前,Australia Post被优先合并为单个token,不会被aus中的australia再次匹配,因此计数无重叠。

内容的提问来源于stack exchange,提问作者bgreen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:57:08