如何在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
相关产品推荐
相关产品推荐

