Извлечь соответствующее ключевое слово для текста - PullRequest
0 голосов
/ 30 мая 2018

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

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

Dataframe2

Keywords
New
FUND
EVENT 
Author
book

Dataframe1

ID  NAME    Month   DESCRIPTION              Keywords
12  x1       Jan    funding recived            fund
23  x2       Feb    author of the book     author, book
14  x3       Mar    new year event         new, event

Также,Мне нужны ключевые слова, даже в описании есть полное слово.Т.е. финансирование, где я могу получить ключевое слово fund в новом столбце.

Ответы [ 2 ]

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

Решением может быть использование stringr::str_detect для проверки наличия Keywords в каждом DESCRIPTION.

library(stringr)

df1$Keywords <- mapply(function(x)paste(df2$Keywords[str_detect(x, tolower(df2$Keywords))],
                                        collapse = ","), df1$DESCRIPTION)

df1
#   ID NAME Month        DESCRIPTION    Keywords
# 1 12   x1   Jan    funding recived        FUND
# 2 23   x2   Feb author of the book Author,book
# 3 14   x3   Mar     new year event   New,EVENT

Данные:

df1 <- read.table(text = 
"ID  NAME    Month   DESCRIPTION      
12  x1       Jan    'funding recived'   
23  x2       Feb    'author of the book'
14  x3       Mar    'new year event'",
header = TRUE, stringsAsFactors = FALSE)

df2 <- read.table(text = 
"Keywords
New
FUND
EVENT 
Author
book",
header = TRUE, stringsAsFactors = FALSE)
0 голосов
/ 30 мая 2018

Мы можем использовать regex_left_join из fuzzyjoin и выполнить конкатенацию group_by (paste)

library(fuzzyjoin)
library(dplyr)
df1 %>% 
   regex_left_join(df2, by = c('DESCRIPTION' = 'Keywords'), 
              ignore_case = TRUE) %>% 
   group_by(ID, NAME, Month, DESCRIPTION) %>% 
   summarise(Keywords = toString(unique(tolower(Keywords))))
# A tibble: 3 x 5
# Groups:   ID, NAME, Month [?]
#     ID NAME  Month DESCRIPTION        Keywords    
#  <int> <chr> <chr> <chr>              <chr>       
#1    12 x1    Jan   funding recived    fund        
#2    14 x3    Mar   new year event     new, event  
#3    23 x2    Feb   author of the book author, book

data

df1 <- structure(list(ID = c(12L, 23L, 14L), NAME = c("x1", "x2", "x3"
), Month = c("Jan", "Feb", "Mar"), DESCRIPTION = c("funding recived", 
"author of the book", "new year event")), .Names = c("ID", "NAME", 
"Month", "DESCRIPTION"), class = "data.frame", row.names = c(NA, 
-3L))

df2 <- structure(list(Keywords = c("New", "FUND", "EVENT", "Author", 
"book")), .Names = "Keywords", class = "data.frame", row.names = c(NA, 
-5L))
...