Quanteda实操:移除目标词出现频次过低的文档
用Quanteda过滤含特定关键词的文档
下面针对你提到的两种过滤需求,给出具体实现代码:
一、按绝对频次过滤(移除关键词总出现次数低于3的文档)
- 先统计每份文档中
refugee和asylum seeker的总出现次数:
# 加载quanteda包 library(quanteda) # 假设你的语料库对象是corpus_obj # 处理多词单元"asylum seeker",避免被拆分 kw_tokens <- tokens(corpus_obj, remove_punct = TRUE) %>% tokens_compound(pattern = phrase("asylum seeker")) # 统计每份文档中两个关键词的总频次 kw_counts <- dfm(kw_tokens, select = c("refugee", "asylum_seeker")) %>% rowSums()
- 过滤语料库,只保留总频次≥3的文档:
filtered_corpus_absolute <- corpus_obj[kw_counts >= 3]
二、按相对频率过滤(移除相对频率均低于阈值的文档)
步骤1:计算整体平均相对频率
相对频率用关键词频次/文档总词数计算,先算出两个关键词在整个语料库的平均水平:
# 生成全量dfm full_dfm <- dfm(kw_tokens) # 统计关键词总频次和语料库总词数 total_kw_counts <- colSums(dfm_select(full_dfm, c("refugee", "asylum_seeker"))) total_words <- sum(full_dfm) # 得到两个关键词各自的整体平均相对频率 avg_rel_freq <- total_kw_counts / total_words
你可以用这个平均值作为阈值X,也可以根据需求调整(比如取平均值的一半)。
步骤2:计算单文档相对频率并过滤
# 计算每份文档的总词数 doc_word_counts <- rowSums(full_dfm) # 计算每份文档中两个关键词的相对频率 kw_rel_freq <- dfm_select(full_dfm, c("refugee", "asylum_seeker")) / doc_word_counts # 设置阈值X,这里用整体平均值举例 X <- avg_rel_freq # 过滤逻辑:只要有一个关键词相对频率≥阈值,就保留文档 keep_rows <- apply(kw_rel_freq, 1, function(x) any(x >= X)) filtered_corpus_relative <- corpus_obj[keep_rows]
如果需要固定阈值(比如0.001),直接把X替换为对应数值即可。
另外,如果你要实现开头提到的「移除密度得分最低的10%文档」,可以基于相对频率分位数过滤:
# 计算每份文档的关键词总相对频率 total_rel_freq <- rowSums(kw_rel_freq) # 移除相对频率最低的10%文档 threshold <- quantile(total_rel_freq, 0.1) filtered_corpus_density <- corpus_obj[total_rel_freq >= threshold]
内容的提问来源于stack exchange,提问作者andupaz
相关产品推荐
相关产品推荐

