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

Quanteda基于corpus识别搭配后无法正常词形还原问题咨询

问题根源

操作顺序逻辑错误:调用tokens_compound()后,missing和data已经被合并为单个独立token missing data,后续的tokens_replace()仅支持匹配完整的单个token,无法识别单个token内部的拆分词汇,因此针对单个词的词形还原规则完全失效。

解决方案

你可以继续保留「使用corpus生成搭配」的最优实践,仅调整词形还原与搭配合并的执行顺序,同步对搭配表做词形映射即可:

library(dplyr)
library(tibble)
library(quanteda)
library(quanteda.textstats)

# 示例数据与词形映射表(原代码不变)
df= c("this column has a lot of missing data, 50% almost!",
      "I am interested in missing data problems",
      "missing data is a headache",
      "how do you handle missing data?")

lemmas <- data.frame() %>%
  rbind(c("missing", "miss")) %>%
  rbind(c("data", "datum")) %>%
  `colnames<-`(c("inflected_form", "lemma"))

# 步骤1:使用corpus生成搭配(原代码不变,符合官方建议)
txtCorpus = corpus(df)
docvars(txtCorpus)$text <- as.character(txtCorpus)
myPhrases = textstat_collocations(txtCorpus, tolower = FALSE)

# 新增:将识别到的搭配转换为词形还原后的匹配pattern
collocation_lemma_pattern <- lapply(myPhrases$collocation, function(coll) {
  # 拆分搭配为单个词汇
  single_words <- tokens(coll, remove_punct = T) %>% as.character() %>% tolower()
  # 逐个映射词形
  lemma_words <- lemmas$lemma[match(single_words, lemmas$inflected_form)]
  lemma_words[is.na(lemma_words)] <- single_words[is.na(lemma_words)]
  # 转为phrase格式供匹配使用
  phrase(paste(lemma_words, collapse = " "))
}) %>% unlist() %>% as.phrases()

# 步骤2:调整顺序,先词形还原再合并搭配
txtTokens = tokens(txtCorpus, remove_numbers = TRUE, remove_punct = TRUE, 
                   remove_symbols = TRUE, remove_separators = TRUE) %>%
  tokens_tolower() %>%
  # 先执行单个词的词形还原
  tokens_replace(pattern = lemmas$inflected_form, replacement = lemmas$lemma) %>%
  # 再用词形还原后的搭配pattern合并短语
  tokens_compound(pattern = collocation_lemma_pattern, concatenator = " ")

# 步骤3:测试结果(原代码不变)
dtm = dfm(txtTokens, remove_padding = TRUE)
dfm_feat = as.data.frame(featfreq(dtm)) %>%
  rownames_to_column(var="feature") %>%
  `colnames<-`(c("feature", "count"))

dfm_feat

运行后你会看到特征表中miss datum的计数为4,符合预期效果。

简化备选方案

如果你的搭配数量较少,也可以直接对合并后的短语token做批量替换,无需调整原有流程顺序:

# 原有流程合并搭配后新增替换规则即可
txtTokens <- tokens_replace(txtTokens, pattern = "missing data", replacement = "miss datum")

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:30:01