问题描述
我一整天都在尝试解决这个问题,但没有任何改善。
我正在尝试将以下缩写替换为我数据集中的以下所需单词:
-缩写:美国,H2O,3型,T3,bp
- 期望词美国,水,3 型疾病,3 型疾病,血压
输入数据例如
-
[1] 我有 3 型,它被认为是该疾病最严重的阶段。
-
[2] 多喝 H2O 会让你的皮肤焕发光彩。
-
[3] 我有 T2 还是 T3?请有人帮忙。
-
[4] 我们在 美国 没有这个,但我听说未来 3 年内会提供。
-
[5] bp 高意味着我必须注意饮食?
所需的输出是
-
[1] 我患有 3 型疾病,它被认为是最严重的阶段 疾病。
-
[2] 多喝水会让你的皮肤焕发光彩。
-
[3] 我是否患有3 型疾病?请有人帮忙。
-
[4] 我们在美利坚合众国没有这个,但我听说未来 3 年内会提供。
-
[5] 血压高意味着我必须注意饮食?
我尝试了以下代码但没有成功:
data= read.csv(C:"xxxxxxx,header= TRUE")
lowercase= tolower(data$MESSAGE)
dict=list("\\busa\\b"= "united states of america","\\bh2o\\b"=
"water","\\btype 3\\b|\\bt3\\"= "type 3 disease","\\bbp\\b"=
"blood pressure")
for(i in 1:length(dict1)){
lowercasea= gsub(paste0("\\b",names(dict)[i],"\\b"),dict[[i]],lowercase)}
我知道我肯定做错了什么。有人可以指导我吗?提前致谢。
解决方法
如果您只需要替换整个单词(例如 bp
中的 Some bp.
而不是 bpcatalogue
中),则必须使用单词边界从缩写中构建正则表达式,并且- 因为您有多词缩写 - 也可以按长度降序对它们进行排序(或者,例如 type
可能会在 type three
之前触发替换)。
示例代码:
abbreviations <- c("USA","H2O","Type 3","T3","bp")
desired_words <- c("United States of America","Water","Type 3 Disease","blood pressure")
df <- data.frame(abbreviations,desired_words,stringsAsFactors = FALSE)
x <- 'Abbreviations: USA,H2O,Type 3,T3,bp'
sort.by.length.desc <- function (v) v[order( -nchar(v)) ]
library(stringr)
str_replace_all(x,paste0("\\b(",paste(sort.by.length.desc(abbreviations),collapse="|"),")\\b"),function(z) df$desired_words[df$abbreviations==z][[1]][1]
)
paste0("\\b(",")\\b")
代码创建了一个像 \b(Type 3|USA|H2O|T3|bp)\b
这样的正则表达式,它匹配 Type 3
或 USA
等作为整个单词,仅当 \b
是一个单词时边界。如果找到匹配项,stringr::str_replace_all
会将其替换为相应的 desired_word
。