使用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
相关产品推荐
相关产品推荐

