Используйте 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"
Другие вопросы по тегам