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

R quanteda:基于层级词典的文档Topic-Keyword匹配问题求助

问题修正方案

核心问题

当前使用tokens_lookup的逻辑是只要匹配字典中的keyword,就返回对应的topic.keyword组合,但没有验证文档中是否同时存在对应的topic,导致出现不符合预期的匹配结果(比如d2无任何topic却返回topic1.keyword3、topic2.keyword3)。

解决思路

  1. 先识别每个文档中实际存在的topic集合
  2. 对tokens_lookup的结果进行过滤:仅保留那些topic存在于当前文档topic集合中的组合,其余替换为"NA"
  3. 重构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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 18:52:53