在 R 中使用模糊 LR 模式提取字符串
Extract strings using fuzzy LR patterns in R
我挣扎了很久
我设法提取字符串中左右模式之间的所有内容,如下例所示。
library(tidyverse)
data=c("everything will be ok one day")
str_extract(string = data, pattern = "(?<=thing).*(?=ok one)")
#> [1] " will be "
由 reprex package (v2.0.1)
于 2022-01-26 创建
正如您在代码中注意到的那样,我提取了“thing”和“ok one”之间的所有内容。
我需要将不匹配的可能性纳入这些模式中。
我想允许最多两个 不匹配 并考虑插入缺失和插入。
示例 1
例如我要解释的一个不匹配
是在所有内容中插入字母“s”
dat.1=c("everythings will be ok one day")
在这种情况下,我希望能够提取短语
will be
示例 2
dat.2=c("everythingswillbeokoneday")
在这种情况下,我希望能够提取短语
will be
PS:
这只是一个简化的例子。我的实际数据不包含差距,而且很复杂。期待您的帮助和指导。
一种方法是使用字符串的模糊匹配,例如,依赖包 stringdist
和计算,对于每个分隔符字符串(thing
和 ok
,在您的示例中), 相应的匹配分数(即下面函数 maxsim
所做的)。
library(tidyverse)
library(stringdist)
dat.1=c("everythings will be ok one day")
maxsim <- function(df, delim)
{
df %>%
str_split(" ") %>% unlist %>%
map(~ stringsim(delim,.x)) %>%
which.max
}
dat.1 %>%
str_split(" ") %>% unlist %>%
.[ (maxsim(dat.1,"thing") + 1) : (maxsim(dat.1,"ok") - 1) ] %>%
str_c(collapse = " ")
#> [1] "will be"
我挣扎了很久
我设法提取字符串中左右模式之间的所有内容,如下例所示。
library(tidyverse)
data=c("everything will be ok one day")
str_extract(string = data, pattern = "(?<=thing).*(?=ok one)")
#> [1] " will be "
由 reprex package (v2.0.1)
于 2022-01-26 创建正如您在代码中注意到的那样,我提取了“thing”和“ok one”之间的所有内容。
我需要将不匹配的可能性纳入这些模式中。 我想允许最多两个 不匹配 并考虑插入缺失和插入。
示例 1
例如我要解释的一个不匹配 是在所有内容中插入字母“s”
dat.1=c("everythings will be ok one day")
在这种情况下,我希望能够提取短语
will be
示例 2
dat.2=c("everythingswillbeokoneday")
在这种情况下,我希望能够提取短语
will be
PS: 这只是一个简化的例子。我的实际数据不包含差距,而且很复杂。期待您的帮助和指导。
一种方法是使用字符串的模糊匹配,例如,依赖包 stringdist
和计算,对于每个分隔符字符串(thing
和 ok
,在您的示例中), 相应的匹配分数(即下面函数 maxsim
所做的)。
library(tidyverse)
library(stringdist)
dat.1=c("everythings will be ok one day")
maxsim <- function(df, delim)
{
df %>%
str_split(" ") %>% unlist %>%
map(~ stringsim(delim,.x)) %>%
which.max
}
dat.1 %>%
str_split(" ") %>% unlist %>%
.[ (maxsim(dat.1,"thing") + 1) : (maxsim(dat.1,"ok") - 1) ] %>%
str_c(collapse = " ")
#> [1] "will be"