Quanteda重叠术语词频统计偏差问题求助
重叠术语导致词频统计偏差的排查与解决
问题核心
测试数据集内,Australia(2次)与Australia Post(1次)的计数无重叠,结果符合预期;但在实际数据中,aus字典项(包含Australia、this country、our country)的统计值为2333次,而正确预期应为2188次——显然Australia Post中的145次Australia被重复计入了aus的统计。
可能原因
- 字典匹配顺序错误:quanteda的
tokens_compound按字典条目顺序优先匹配,若aus中的单个australia比auspost的australia post先出现在字典中,会先标记单个词,导致长短语无法被识别。 - 文本大小写不一致:实际数据中可能存在
Australia post、australia Post等大小写变体,与字典内的小写短语无法匹配。 - 文本格式问题:实际数据中
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
相关产品推荐
相关产品推荐

