Создайте новый столбец со словами списка, который можно найти во фразе в R - PullRequest
1 голос
/ 29 апреля 2019

У меня есть два фрейма данных - один содержит столбец предложений / фраз, а другой содержит список слов-тегов. Я хочу создать новый столбец, который отображает слова тега, которые отображаются в этом предложении / фразе.

Sentence <- c(1,2,3)
Description <- c("I like potatoes, tomatoes, and broccoli", "Carrots, Radishes, and Potatoes", "Thanksgiving is my favorite because of Turkey")
df <- data.frame(Sentence, Description)


Names <- c("Potatoes", "Tomatoes", "Broccoli", "Turkey", "Thanksgiving")
Freq <- c("67", "13", "12", "10", "10")
List <- data.frame(Names, Freq)


#OUTPUT
df$Tags <- c("Potatoes, Tomatoes, Broccoli", "Potatoes", "Turkey, Thanksgiving")
df

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Вы можете использовать Tidyverse и библиотеку stringr, чтобы сопоставлять слова в предложении и извлекать их, используя вектор Имен. Есть более чистый способ сделать это, но это ответит на ваш вопрос:

library(tidyverse)

Sentence <- c(1,2,3)
Description <- c("I like potatoes, tomatoes, and broccoli", "Carrots, Radishes, and Potatoes", "Thanksgiving is my favorite because of Turkey")
df <- data.frame(Sentence, Description)


Names <- c("Potatoes", "Tomatoes", "Broccoli", "Turkey", "Thanksgiving")

df %>% 
  mutate(tags = str_extract_all(str_to_lower(Description), 
                                glue::glue_collapse(str_to_lower(Names), sep = "|")))
#>   Sentence                                   Description
#> 1        1       I like potatoes, tomatoes, and broccoli
#> 2        2               Carrots, Radishes, and Potatoes
#> 3        3 Thanksgiving is my favorite because of Turkey
#>                           tags
#> 1 potatoes, tomatoes, broccoli
#> 2                     potatoes
#> 3         thanksgiving, turkey

Создано в 2019-04-29 пакетом представ. (v0.2.1)

0 голосов
/ 29 апреля 2019

Следующее работает нормально:

library(magrittr)

word_hash <- new.env(hash=TRUE, parent=emptyenv())
for ( word in List$Names ) {
  word_hash[[ tolower(word) ]] = word
}

df$Tags <- df$Description %>% 
  tolower() %>% 
  (function(s) gsub("[^ a-z]", "", s)) %>% 
  strsplit(" ") %>% 
  sapply(function(words)
    paste0(unique(unlist(sapply(words, function(key) word_hash[[key]]))), collapse=", ")
  );

Использование окружения объекта используется для получения быстрой O (1) хеш-таблицы , без которой это будет очень медленно для больших словарей.

В строке gsub() предполагается, что все ваши слова будут состоять полностью из обычных букв a-z без знаков препинания или цифр. Возможно, вам придется изменить эту строку, если некоторые слова содержат другие символы.

Аналогично, strsplit(" ") предполагает, что все ваши слова могут быть разделены пробелом, что верно для вашего теста. Если они иногда будут разделяться на вкладки, новые строки или другие символы, вам придется немного их изменить.

Выполнение нечувствительного к регистру совпадения при одновременном отслеживании правильного регистра усложняет решение, но подразумевается в написанном вами тестовом примере. Если вас это не волнует, вы можете немного упростить.

Это решение возвращает уникальные слова в том порядке, в котором они были найдены в исходном предложении. Это похоже на то, что вы имели в виду, хотя ваш последний контрольный пример находится в другом порядке. Вы также можете подумать об обёртывании unique() в sort(), если хотите, чтобы теги были в согласованном порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...