Соответствующий текст из столбцов в фрейме данных - PullRequest
0 голосов
/ 30 мая 2018

Я ищу, чтобы найти ключевые слова, которые появляются в строке поиска (в данном случае, вопрос исследования).Я думаю, что я близко, но я не совсем уверен, в чем проблема, с которой я сталкиваюсь.Мой фрейм данных выглядит примерно так:

Q1                                                     keywords
How do you assess strategic deterrence messaging?      Deterrence messaging effects perception assessment
An energy transition for green growth                  Energy transition sustainable
Some other research question here                      research keywords topics etc

, где Q1 относится к вопросу, а keywords - это список слов (в данном случае очищенный логический поиск с AND, NOT,и ИЛИ удалены).Я пытаюсь определить, появляется ли какой-либо из keywords в строке Q1, находит совпадения и подсчитывает, как часто это происходит (поэтому я могу сказать, что keywords появилось в column1 n % времени, в column2 n % времени ...).

Вот с чего я начал, используя tidyverse:

df_final <- df %>% 
  mutate(matches = str_extract_all(
    Q1,
    str_c(df$keywords, collapse = "|") %>% regex(ignore_case = T)),
    match = map_chr(matches, str_c, collapse = ", "),
    count = map_int(matches, length)
  )

Но я не получаю никаких совпадений.Я предполагаю, что это может иметь какое-то отношение к моей колонке keyword?Нужно ли преобразовывать это, скажем, в вектор или список через запятую, чтобы это работало правильно?Заранее спасибо за предложения!

РЕДАКТИРОВАТЬ: Пример вывода из dput():

structure(list(Q1 = c("Assessing the effects of strategic deterrence messaging in the cognitive dimension", 
"How do you assess effects of strategic deterrence messaging?", 
"Determine Strategic Implications of Climate Change to USG/DoD"
), keywords = c("Deterrence messaging effects perception assessment", 
"political philosophy sociology social sciences history marketing power structure government governing class bourgeoisie social class military class ruling class governing class", 
"Climate Change Strategic Global Warming Strategic Climate Change Policy Global Warming Policy"
)), .Names = c("Q1", "keywords"), row.names = c(NA, -3L), class = c("tbl_df", 
"tbl", "data.frame"))

Ответы [ 2 ]

0 голосов
/ 31 мая 2018

Приведенный ниже код вернет ваш data.frame плюс количество вхождений ключевых слов в вопросе на основе ключевых слов после вопроса.В вашем примере вывода это 3 0 6. Все функции из пакетов tidyverse.

library(stringr)
library(dplyr)
library(purrr)

df  %>%  mutate(count = map2_int(Q1, keywords, function(x, y) sum(str_detect(str_to_lower(x), str_to_lower(flatten_chr(str_split(y, " ")))))))

# A tibble: 3 x 3
  Q1                                                                                 keywords                                        count
  <chr>                                                                              <chr>                                           <int>
1 Assessing the effects of strategic deterrence messaging in the cognitive dimension Deterrence messaging effects perception assess~     3
2 How do you assess effects of strategic deterrence messaging?                       political philosophy sociology social sciences~     0
3 Determine Strategic Implications of Climate Change to USG/DoD                      Climate Change Strategic Global Warming Strate~     6

data:

df <- structure(list(Q1 = c("Assessing the effects of strategic deterrence messaging in the cognitive dimension", 
"How do you assess effects of strategic deterrence messaging?", 
"Determine Strategic Implications of Climate Change to USG/DoD"
), keywords = c("Deterrence messaging effects perception assessment", 
"political philosophy sociology social sciences history marketing power structure government governing class bourgeoisie social class military class ruling class governing class", 
"Climate Change Strategic Global Warming Strategic Climate Change Policy Global Warming Policy"
)), row.names = c(NA, -3L), class = c("tbl_df", "tbl", "data.frame"
))
0 голосов
/ 31 мая 2018

Не может быть оптимальным, но, возможно, это помогает.Я добавил tolower(), так как полагаю, что вам все равно, сдерживание или сдерживание.

a <-tolower(unique(unlist(strsplit(df$keywords, " "))))

dfcounter <- data.frame(table(tolower(unlist(strsplit(df$Q1, " ")))),stringsAsFactors = F)

dfcounter[match(a,dfcounter$Var1,nomatch = 0),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...