R quanteda:基于层级词典的文档Topic-Keyword匹配问题求助
问题修正方案
核心问题
当前使用tokens_lookup的逻辑是只要匹配字典中的keyword,就返回对应的topic.keyword组合,但没有验证文档中是否同时存在对应的topic,导致出现不符合预期的匹配结果(比如d2无任何topic却返回topic1.keyword3、topic2.keyword3)。
解决思路
- 先识别每个文档中实际存在的topic集合
- 对
tokens_lookup的结果进行过滤:仅保留那些topic存在于当前文档topic集合中的组合,其余替换为"NA" - 重构tokens对象以匹配期望输出格式
修正后代码
library(quanteda) # 原始输入文本 txt <- c(d1 = "smth topic1 smth keyword1 keyword2 smth smth keyword3 smth", d2 = "smth keyword3 smth smth", d3 = "smth keyword3 smth topic2 smth smth") toks_txt <- tokens(txt) # 定义topic-keyword映射字典(从df_dict转换,更贴合需求) df_dict <- data.frame(topic = c("topic1", "topic1", "topic2", "topic2"), keywords = c("keyword1 keyword2", "keyword3", "keyword4 keyword5", "keyword3")) # 转换为quanteda字典格式 dict <- dictionary(lapply(split(df_dict$keywords, df_dict$topic), function(kws) { strsplit(trimws(kws), "\\s+") |> unlist() |> setNames(., .) })) # 1. 提取每个文档中存在的topic doc_topics <- lapply(toks_txt, function(toks) { intersect(names(dict), as.character(toks)) }) # 2. 执行初始lookup lookup <- tokens_lookup(toks_txt, dict, levels = 1:2, nomatch = "NA") # 3. 过滤lookup结果:仅保留topic存在于当前文档的组合 filtered_lookup <- lapply(names(lookup), function(doc) { current_topics <- doc_topics[[doc]] # 拆分每个匹配项,检查topic是否存在 sapply(lookup[[doc]], function(item) { if (item == "NA") return("NA") # 提取topic部分 topic_part <- strsplit(item, "\\.")[[1]][1] if (topic_part %in% current_topics) item else "NA" }) }) # 转换回tokens对象 filtered_lookup <- as.tokens(filtered_lookup) names(filtered_lookup) <- names(txt) # 输出结果 filtered_lookup
验证输出
Tokens consisting of 3 documents. d1 : [1] "NA" "NA" "NA" "topic1.keyword1 keyword2" "NA" [6] "NA" "topic1.keyword3" "NA" "NA" d2 : [1] "NA" "NA" "NA" "NA" "NA" d3 : [1] "NA" "topic2.keyword3" "NA" "NA" "NA" "NA"
关键说明
- 从
df_dict直接生成字典:确保topic-keyword映射完全符合原始定义,避免手动构建字典时出现偏差 - 文档topic识别:通过
intersect快速获取每个文档中存在的有效topic - 结果过滤:对每个lookup匹配项拆分出topic部分,验证是否存在于当前文档的topic集合中,不符合则替换为NA
内容的提问来源于stack exchange,提问作者Aussie
相关产品推荐
相关产品推荐

