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

如何在quanteda中移除语料库内的标签及标签包含内容?

解决Quanteda中移除<...>标签及内容的问题

你遇到的问题核心在于时机不对:你是在生成DFM之后才尝试移除标签,但此时Quanteda的默认分词器已经把<oa>这类标签拆成了纯文本token(比如"oa"),尖括号被当作标点/符号去掉了,所以用<.*?>的正则表达式去匹配DFM里的token自然找不到,也就没法移除这些残留的标签内容。

正确的做法:先清理Corpus文本,再生成DFM

既然你已经用gsub("<.*?>", "", y)成功匹配过标签,那最佳方案是在生成DFM之前,先把Corpus中的所有文本都用这个正则清理一遍,从根源上移除所有<...>格式的标签及内部内容。修改后的代码如下:

library(readtext)
library(quanteda)

# 读取目标文本文件
data_dir <- list.files(pattern="*.txt", recursive = TRUE, full.names = TRUE)
micusp_corpus <- corpus(readtext(data_dir))

# 关键步骤:先清理所有<...>标签及内容
texts(micusp_corpus) <- gsub("<.*?>", "", texts(micusp_corpus))

# 添加Region字段(这里用documents()替代直接访问corpus内部结构,更符合quanteda规范)
docvars(micusp_corpus, "Region") <- gsub("(\\w{6})\\..*?$", "", rownames(documents(micusp_corpus)))

# 生成DFM
micusp_dfm <- dfm(micusp_corpus, groups = "Region", remove_punct = TRUE, remove_numbers = TRUE, remove_symbols = TRUE)

# 查看高频词,此时应该不会再出现oa这类标签内容了
textstat_frequency(micusp_dfm, n=10)

为什么之前的方法失效?

Quanteda的dfm()函数在默认分词过程中,会把尖括号<>当作标点符号/符号处理(因为你设置了remove_punct = TRUE和remove_symbols = TRUE),所以<oa>会被拆分成"oa"这个纯文本token。当你用dfm_select(micusp_dfm, "<.*?>", selection = "remove", valuetype = "regex")时,DFM里根本没有带尖括号的token,自然无法匹配和移除,残留的"oa"就会出现在高频词结果里。

备选方案:在分词阶段移除标签

如果你不想修改原始Corpus的文本,也可以在分词时直接移除这类标签对应的token。不过这种方法需要先确保标签被完整分词(比如临时禁用默认的标点移除,先匹配标签再处理),但操作起来不如直接清理文本直观,所以更推荐第一种方法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:50:35