Как просмотреть список векторов ключевых слов и нечеткое сопоставление их с другим файлом (R) - PullRequest
0 голосов
/ 25 октября 2018

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

Event Name            Keyword
All-day tabby fest    tabby, all-day
All-day tabby fest    tabby, fest
Maine Coon Grooming   maine coon, groom    
Maine Coon Grooming   coon, groom

keywordFile <- tibble(EventName = c("All-day tabby fest", "All-day tabby fest", "Maine Coon Grooming","Maine Coon Grooming"), Keyword = c("tabby, all-day", "tabby, fest", "maine coon, groom", "coon, groom")

Текстовый файл выглядит следующим образом:

Description
Bring your tabby to the fest on Tuesday
All cats are welcome to the fest on Tuesday
Mainecoon grooming will happen at noon Wednesday
Maine coons will be pampered at noon on Wednesday

text <- tibble(Description = c("Bring your tabby to the fest on Tuesday","All cats are welcome to the fest on Tuesday","Mainecoon grooming will happen at noon Wednesday","Maine coons will be pampered at noon on Wednesday")

Мне нужно перебирать текстовый файл и искать нечеткие совпадения (должно включать каждое словов столбце «Ключевое слово») и верните новый столбец, который отображает значение ИСТИНА или Ложь.Если это ИСТИНА, то я хочу, чтобы в третьем столбце отображалось название события.Итак, что-то вроде:

Description                                          Match?   Event Name
Bring your tabby to the fest on Tuesday              TRUE     All-day tabby fest
All cats are welcome to the fest on Tuesday          FALSE
Mainecoon grooming will happen at noon Wednesday     TRUE     Maine Coon Grooming
Maine coons will be pampered at noon on Wednesday    FALSE

Я могу успешно выполнять свои нечеткие совпадения (после преобразования всего в нижний регистр) с такими вещами, благодаря Molx ( Как я могу проверить, если несколько строксуществует в другой строке? ):

str <- c("tabby", "all-day")
myStr <- "Bring your tabby to the fest on Tuesday"
all(sapply(str, grepl, myStr))

Однако я застреваю при попытке нечеткого сопоставления целых файлов.Я попробовал что-то вроде этого:

for (i in seq_along(text$Description)){
  for (j in seq_along(keywordFile$EventName)) {
    # below I am creating the TRUE/FALSE column
    text$TF[i] <- all(sapply(keywordFile$Keyword[j], grepl, 
                                                     text$Description[i]))
    if (isTRUE(text$TF))
      # below I am creating the EventName column
      text$EventName <- keywordFile$EventName
    }
}

Я не думаю, что у меня возникают проблемы с преобразованием правильных вещей в векторы и строки.Мой столбец keywordFile $ Keyword представляет собой набор строковых векторов, а мой столбец text Description - символьная строка.Но я борюсь с тем, как правильно перебрать оба файла.Я получаю ошибку:

Error in ... replacement has 13 rows, data has 1

Кто-нибудь делал что-то подобное раньше?

1 Ответ

0 голосов
/ 25 октября 2018

Я не совсем уверен, что получу ваш вопрос, поскольку я бы не назвал grepl() нечетким соответствием.Лучше поймать ключевое слово, если оно внутри более длинного слова.Таким образом, «кошка» и «катастрофа» будут событием совпадения, потому что эти слова очень отличаются.

Я решил вместо этого написать ответ, если вы можете контролировать расстояние между строками, которые составляютсовпадение:

Загрузка библиотек:

library(tibble)
library(dplyr)
library(fuzzyjoin)
library(tidytext)
library(tidyr)

Создание словаря и объекта данных:

dict <- tibble(Event_Name = c(
  "All-day tabby fest",
  "All-day tabby fest",
  "Maine Coon Grooming",
  "Maine Coon Grooming"
), Keyword = c(
  "tabby, all-day",
  "tabby, fest",
  "maine coon, groom",
  "coon, groom"
)) %>% 
  mutate(Keyword = strsplit(Keyword, ", ")) %>% 
  unnest(Keyword)

string <- tibble(id = 1:4, Description = c(
  "Bring your tabby to the fest on Tuesday",
  "All cats are welcome to the fest on Tuesday",
  "Mainecoon grooming will happen at noon Wednesday",
  "Maine coons will be pampered at noon on Wednesday"
))

Применение словаря к данным:

string_annotated <- string %>% 
  unnest_tokens(output = "word", input = Description) %>%
  stringdist_left_join(y = dict, by = c("word" = "Keyword"), max_dist = 1) %>% 
  mutate(match = !is.na(Keyword))

> string_annotated
# A tibble: 34 x 5
      id word    Event_Name         Keyword match
   <int> <chr>   <chr>              <chr>   <lgl>
 1     1 bring   NA                 NA      FALSE
 2     1 your    NA                 NA      FALSE
 3     1 tabby   All-day tabby fest tabby   TRUE 
 4     1 tabby   All-day tabby fest tabby   TRUE 
 5     1 to      NA                 NA      FALSE
 6     1 the     NA                 NA      FALSE
 7     1 fest    All-day tabby fest fest    TRUE 
 8     1 on      NA                 NA      FALSE
 9     1 tuesday NA                 NA      FALSE
10     2 all     NA                 NA      FALSE
# ... with 24 more rows

max_dist контролирует то, что по-прежнему составляет совпадение.Расстояние между строками, равное 1 или меньше, в этом случае находит совпадение для всех текстов, но я пробовал также и строку без совпадения.

Если вы хотите вернуть этот длинный формат обратно воригинал:

string_annotated_col <- string_annotated %>% 
  group_by(id) %>% 
  summarise(Description = paste(word, collapse = " "),
            match = sum(match),
            keywords = toString(unique(na.omit(Keyword))),
            Event_Name = toString(unique(na.omit(Event_Name))))

> string_annotated_col
# A tibble: 4 x 5
     id Description                                       match keywords         Event_Name         
  <int> <chr>                                             <int> <chr>            <chr>              
1     1 bring your tabby tabby to the fest on tuesday         3 tabby, fest      All-day tabby fest 
2     2 all cats are welcome to the fest on tuesday           1 fest             All-day tabby fest 
3     3 mainecoon grooming will happen at noon wednesday      2 maine coon, coon Maine Coon Grooming
4     4 maine coons will be pampered at noon on wednesday     2 coon             Maine Coon Grooming

Не стесняйтесь задавать вопросы, если часть ответа не имеет для вас смысла.Некоторые из них объяснены в здесь .За исключением нечеткой совпадающей части.

...