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

使用quanteda提取特定正则模式的多词短语构建字符向量问题

解决quanteda中提取"aged xx-xx"格式多词表达式的问题

我之前也碰到过类似的情况——想用quanteda提取带空格的多词表达式,结果直接用dfm的select参数匹配正则没效果。先给你理清楚问题出在哪,再给几个可行的解决方案:

问题根源

quanteda默认会把文本拆分成单个token,所以aged和20-45是两个独立的特征。你用select = "aged\\s([0-9]{2}-[0-9]{2})"去匹配dfm的特征名,本质是在找单个包含空格的token,但原始分词里根本不存在这样的token,所以返回空结果就不奇怪了。

可行解决方案

方案1:用kwic直接提取匹配短语

kwic专门用来定位语料中的关键词短语,跨token的正则匹配在这里完全适用,是最直接的方法:

library(quanteda)

# 示例文本
txt <- c("In India, male smokers aged 20-45 perceive brandX positively.", 
         "In Spain, female buyers aged 30-39 don't purchase brandY.")
corp <- corpus(txt)

# 匹配"aged xx-xx"格式的短语
kwic_result <- kwic(corp, pattern = "aged [0-9]{2}-[0-9]{2}", valuetype = "regex")
# 提取唯一的匹配结果
unique_age_groups <- unique(kwic_result$keyword)
unique_age_groups

运行后会得到:

[1] "aged 20-45" "aged 30-39"

方案2:用tokens_compound合并token后提取

先把符合模式的连续token合并成一个,再提取合并后的特征:

# 分词(保留数字和必要符号)
toks <- tokens(txt, remove_punct = TRUE)

# 合并"aged"和后续的数字范围为单个token
toks_compound <- tokens_compound(toks, 
                                pattern = regex("aged [0-9]{2}-[0-9]{2}"), 
                                valuetype = "regex")

# 提取合并后的目标特征
target_features <- types(toks_compound)[grep("aged [0-9]{2}-[0-9]{2}", types(toks_compound))]
target_features

方案3:合并token后构建dfm再筛选

如果后续需要用这些特征来构建dfm,可以先合并token再生成dfm,直接提取特征名:

toks_compound <- tokens_compound(tokens(txt, remove_punct = TRUE), 
                                pattern = regex("aged [0-9]{2}-[0-9]{2}"), 
                                valuetype = "regex")

# 构建包含合并后token的dfm
dfm_age <- dfm(toks_compound)

# 筛选出目标特征
featnames(dfm_age)[grep("aged [0-9]{2}-[0-9]{2}", featnames(dfm_age))]

这几个方法都能帮你提取到想要的"aged xx-xx"格式短语,之后不管是用来筛选dfm还是加到字典里都没问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:12:44