Используйте sapply/lapply или foreach для доступа к атрибутам данных R
Это может быть очень простой вопрос, но, честно говоря, я попробовал несколько решений по тем же вопросам, но не смог добиться успеха в своих данных. Это может быть из-за моих данных или у меня тяжелый день, и я ничего не могу понять.:(
У меня есть вектор предложений
vec = c("having many items", "have an apple", "item")
Кроме того, у меня есть фрейм данных для лемматизации данных
lem = data.frame(pattern = c("(items)|(item)", "(has)|(have)|(having)|(had)"), replacement = c("item", "have"))
lem$pattern = as.character(lem$pattern)
lem$replacement = as.character(lem$replacement)
Я хочу пройти через каждый ряд в lem
фрейм данных для формирования команды замены.
Опция 1:
library(stringr) #this is said to be quicker than gsub and my data has 3 mil sentences
vec <- sapply(lem, function(x) str_replace_all(vec, pattern=x$pattern, replacement = x$replacement))
Error in x$pattern : $ operator is invalid for atomic vectors
Вариант 2:
library(doPar)
vec <- foreach(i = 1:nrow(lem)) %dopar% {
str_replace_all(vec, pattern = lem[i, "pattern"], replacement = lem[i, "replacement"])
}
Вариант 2 возвращает список из 2 векторов: первый - то, что я хочу, второй - оригинал, чего я не знаю почему. Кроме того, я проверил на моей машине, doPar
(хотя и с использованием параллельного программирования) не так быстро, как sapply
,
Поскольку мои данные довольно большие (3 млн предложений), может ли кто-нибудь порекомендовать эффективный метод лемматизации текстовых данных?
2 ответа
Другой вариант - создать именованный вектор из шаблона и вектора замены вместо фрейма данных, а затем использовать str_replace_all
прямо так:
library(stringr)
vec <- c("having many items", "has an apple", "items")
lem <- c("item", "have")
names(lem) <- c("(items)|(item)", "(has)|(have)|(having)|(had)")
str_replace_all(vec, lem)
## "have many item" "have an apple" "item"
Вы могли бы использовать stri_replace_all_regex
от stringi
библиотека, которая будет выполнять ваши замены последовательно:
library(stringi)
stri_replace_all_regex(vec,lem$pattern,lem$replacement,vectorize_all=F)
[1] "have many item" "have an apple" "item"