Я какое-то время обдумывал это, пробуя множество вариантов map
, Reduce
и тому подобное, но пока безуспешно.
Я ищу функциональный, элегантный подход для замены последовательности gsub
, как в
text_example <- c(
"I'm sure dogs are the best",
"I won't, I can't think otherwise",
"We'll be happy to discuss about dogs",
"cant do it today tho"
)
text_example %>%
gsub(pattern = "'ll", replacement = " will") %>%
gsub(pattern = "can'?t", replacement = "can not") %>%
gsub(pattern = "won'?t", replacement = "will not") %>%
gsub(pattern = "n't", replacement = " not") %>%
gsub(pattern = "'m", replacement = " am") %>%
gsub(pattern = "'s", replacement = " is") %>%
gsub(pattern = "dog", replacement = "cat") %>%
На что-то вроде
text_example %>%
???(dict$pattern, dict$replacement, gsub())
Где,ради воспроизводимого примера, dict
может быть data.frame, например
dict <- structure(
list(
pattern = c("'ll", "can'?t", "won'?t", "n't", "'m", "'s", "dog"),
replacement = c(" will", "can not", "will not", " not", " am", " is", "cat")
),
row.names = c(NA, -7L),
class = "data.frame"
)
(и я знаю, что выполненные замены могут быть некорректными с лингвистической точки зрения, но сейчас это не проблема)
Конечно, брутальный
for(i in seq(nrow(dict))) {
text_example <- gsub(dict$pattern[i], dict$replacement[i], text_example)
}
сработает, и Я знаю, что существуют десятки библиотек, которые решают эту проблему с помощью определенной функции.Но я хочу понять, как справиться с рекурсиями и такими проблемами, как эта, простым и функциональным способом , стараясь держаться как можно ближе к базе R. Я люблю свои лямбды!
Заранее благодарю за помощь.