R:替换缩写词\单词
R: Replace Abbreviations\ Words
我已经尝试解决这个问题一整天了,但没有任何改善。
我正在尝试将以下缩写替换为我的数据集中的以下所需词:
-缩写: USA, H2O, Type 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)}
我知道我肯定做错了什么。有人可以指导我吗?提前谢谢你。
如果您只需要替换整个单词(例如 Some bp.
中的 bp
而不是 bpcatalogue
中的),您将必须使用单词边界从缩写中构建正则表达式, 并且 - 因为你有多个单词的缩写 - 也按长度降序对它们进行排序(或者,例如 type
可能会在 type three
之前触发替换)。
示例代码:
abbreviations <- c("USA", "H2O", "Type 3", "T3", "bp")
desired_words <- c("United States of America", "Water", "Type 3 Disease", "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(",paste(sort.by.length.desc(abbreviations), collapse="|"), ")\b")
代码创建了一个像 \b(Type 3|USA|H2O|T3|bp)\b
这样的正则表达式,它匹配 Type 3
或 USA
等,因为 \b
是整个单词单词边界。如果找到匹配项,stringr::str_replace_all
会将其替换为相应的 desired_word
.
我已经尝试解决这个问题一整天了,但没有任何改善。
我正在尝试将以下缩写替换为我的数据集中的以下所需词:
-缩写: USA, H2O, Type 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)}
我知道我肯定做错了什么。有人可以指导我吗?提前谢谢你。
如果您只需要替换整个单词(例如 Some bp.
中的 bp
而不是 bpcatalogue
中的),您将必须使用单词边界从缩写中构建正则表达式, 并且 - 因为你有多个单词的缩写 - 也按长度降序对它们进行排序(或者,例如 type
可能会在 type three
之前触发替换)。
示例代码:
abbreviations <- c("USA", "H2O", "Type 3", "T3", "bp")
desired_words <- c("United States of America", "Water", "Type 3 Disease", "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(",paste(sort.by.length.desc(abbreviations), collapse="|"), ")\b")
代码创建了一个像 \b(Type 3|USA|H2O|T3|bp)\b
这样的正则表达式,它匹配 Type 3
或 USA
等,因为 \b
是整个单词单词边界。如果找到匹配项,stringr::str_replace_all
会将其替换为相应的 desired_word
.