如何使用gsub批量替换quanteda语料库中的指定表达式列表
解决方案
首先修正你的映射表变量名,不要用list作为变量名(list是R的内置函数关键字,极易触发异常),建议重命名为replace_map。
你之前的代码失效有两个核心原因:
- 基础
gsub的pattern参数传入向量时,只会按位置循环匹配,不会自动按照你定义的键值对逐组匹配替换,会出现匹配错位的问题 - quanteda的corpus对象是结构化S3对象,不能直接作为字符串传入
gsub处理,需要先用texts()提取出文本向量再操作
推荐两种适配quanteda对象的实现方法:
方法1:使用quanteda内置函数(最高效,不破坏语料结构)
quanteda自带的char_replace原生支持批量键值对替换,直接操作语料对象即可:
library(quanteda) # 构造替换用命名向量:键为待匹配文本,值为替换后文本 replace_vec <- setNames(replace_map$joined_name, replace_map$name) # 对语料库的全部文本执行批量替换,ignore.case对应忽略大小写需求 texts(data) <- char_replace(texts(data), pattern = replace_vec, ignore_case = TRUE)
如果已经完成分词要在tokens层面替换,可以使用tokens_replace:
data_tokens <- tokens_replace(data_tokens, pattern = names(replace_vec), replacement = replace_vec, ignore_case = TRUE)
方法2:使用stringr的批量替换方法
如果习惯用字符串处理包,可以用str_replace_all,原生支持命名向量批量匹配:
library(stringr) replace_vec <- setNames(replace_map$joined_name, replace_map$name) # regex参数设置忽略大小写 texts(data) <- str_replace_all(texts(data), pattern = regex(replace_vec, ignore_case = TRUE))
内容的提问来源于stack exchange,提问作者ab0rt
相关产品推荐
相关产品推荐

