Классификация предложения по максимальному количеству классов, содержащихся в нем - PullRequest
1 голос
/ 24 марта 2020

У меня есть следующие предложения:

sentences<-c("The color blue neutralizes orange yellow reflections.", 
         "Zod stabbed me with blue Kryptonite.", 
         "Because blue is your favourite colour.",
         "Red is wrong, blue is right.",
         "You and I are going to yellowstone.",
         "Van Gogh looked for some yellow at sunset.",
         "You ruined my beautiful green dress.",
         "There's nothing wrong with green.")

, которые я хотел бы классифицировать по следующим классам:

A<-c("red")
B<-c("orange")
C<-c("yellow","yellowstone")
D<-c("blue")
E<-c("green")

Сложность этой задачи заключается в том, что первое предложение, например , можно классифицировать в D, B, C, тогда результирующая классификация должна быть B+C+D. Второе и третье предложения просто D. Четвертое предложение - A и D, а затем A+D. Пятое предложение - C и т. Д.

Ответы [ 2 ]

1 голос
/ 24 марта 2020

Вот способ в базе R (может быть, немного запутанный):

list_col <- mget(LETTERS[1:5])

sapply(sentences, function(x) toString(names(Filter(function(y) 
           any(grepl(paste0("\\b", y, "\\b", collapse = "|"), x, 
               ignore.case = TRUE)), list_col))))


#The color blue neutralizes orange yellow reflections. 
#                                            "B, C, D" 
#                 Zod stabbed me with blue Kryptonite. 
#                                                  "D" 
#               Because blue is your favourite colour. 
#                                                  "D" 
#                         Red is wrong, blue is right. 
#                                               "A, D" 
#                  You and I are going to Yellowstone. 
#                                                  "C" 
#           Van Gogh looked for some yellow at sunset. 
#                                                  "C" 
#                 You ruined my beautiful green dress. 
#                                                  "E" 
#                    There's nothing wrong with green. 
#                                                  "E" 

L oop over sentences и возвращает строку разделенных запятыми классов, которые присутствуют.

1 голос
/ 24 марта 2020

Один dplyr, purrr и tibble Возможны следующие варианты:

map(lst, ~ grepl(paste(.x, collapse = "|"), sentences, ignore.case = TRUE)) %>%
 transpose() %>%
 map_chr(~ enframe(.x) %>%
          summarise(name = paste(name[unlist(value)], collapse = ",")) %>%
          pull(name))

[1] "B,C,D" "D"     "D"     "A,D"   "C"     "C"     "E"     "E"    

При этом:

lst <- list(A = c("red"),
B = c("orange"),
C = c("yellow","yellowstone"),
D = c("blue"),
E = c("green"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...