Существует ли более быстрый способ вычисления количества совпадений ключевых слов для каждого наблюдения в наборе данных - PullRequest
0 голосов
/ 13 июня 2019

Мой набор данных содержит переменные: целочисленный код (INS) и текстовое описание (Beskr).

Я выполнил webscraping, в котором я извлек различные ключевые слова для каждого из 88 различных кодов. Я хочу подсчитать количество совпадений в текстовых описаниях с этими ключевыми словами и сохранить счет в новой переменной для каждого кода.

Используя только несколько наблюдений, он быстро работает с вложенными циклами for, но когда я увеличиваю размер данных, это занимает очень много времени. Есть ли более простой и быстрый способ сделать это? Набор данных должен содержать столбцы для кода, описания и 88 переменных с количеством совпадений ключевых слов.

#For testing
descriptions <- c("Ska pyssla med bade Fiske och vattenbruk", "fiske", "jordbruk", 
            "tillverkning", "vattenbruk", "motorfordon")
ins <- 1:6

testDFScrape <- as.data.frame(matrix(ncol = 2, nrow =6))
testDFScrape[,1] <- ins
testDFScrape[,2] <- descriptions
colnames(testDFScrape) <- c("INS", "Beskr")

#Add the variable columns for the matches
colAdditions <- paste(rep("NbrOfMatchesWithCode", 3), 1:3, sep = "" )
testDFScrape[colAdditions] <- NA

#Faked keywords, the real data contains 88 groups of keywords.
scrapedTextTokens<- list(keywordscode1 = c("fiske", "jordbruk"), 
                         keywordscode2 = ("tillverkning"), 
                         keywordscode3 = c("motorfordon", "vattenbruk"))

#For each row, Count matches for each of the 88 Groups different keywords

keyMatchCount <- 0
for(rowNbr in 1:nrow(testDFScrape)){  
  for(i in 1:length(scrapedTextTokens)){
    for(keyword in scrapedTextTokens[[i]]){
      if(str_detect(tolower(testDFScrape[rowNbr, 2]), keyword)){
             keyMatchCount <- keyMatchCount + 1} 
    } 
    testDFScrape[rowNbr, i + 2] <- keyMatchCount
    keyMatchCount <- 0
  }
}


РЕДАКТИРОВАТЬ: Решение с помощью eastclintw00d

library(dplyr)

for(i in 1:length(scrapedTextTokens)){
  df <- as.data.frame(lapply(scrapedTextTokens[[i]], str_count, string = testDFScrape$Beskr))
  df <- df %>%
    mutate(total = rowSums(.))
  testDFScrape[ ,i + 2] <- df$total
}

1 Ответ

0 голосов
/ 13 июня 2019

Я адаптировал решение из здесь к вашей проблеме. Это дает вам счет за ключевое слово. Вам нужно только суммировать группы ключевых слов.

library(stringr)

lll <- tolower(c("Ska pyssla med bade Fiske och vattenbruk", "fiske", "jordbruk", 
                    "tillverkning", "vattenbruk", "motorfordon"))
dict <- list("fiske", "jordbruk", "tillverkning", "motorfordon", "vattenbruk")

as.data.frame(lapply(dict, str_count, string=lll), col.names = dict)
...