Замените слова / фразы в более длинных строках, если они найдены в таблице поиска - PullRequest
0 голосов
/ 24 марта 2020

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

Пример данных:

sentences <- data.frame( ID = c( "1", "2", "3", "4"),
                         text = c("the kitten in the hat",
                                  "a dog with a bone",
                                  "this is a category",
                                  "their cat has no hat"),
                         stringsAsFactors=FALSE)

lookup <- data.frame( key = c("cat", "a", "has"),
                       synonym = c("kitten", "the", "with"),
                       stringsAsFactors=FALSE)

Я хотел бы получить данные обратно в виде фрейма данных, очень похожего только на оригинальные "предложения" с заменой синонимов. Например:

ID        text
1        a cat in a hat
2        a dog has a bone
3        this is a category
4        their cat has no hat

Фактические данные состоят из предложений 2016 года объемом от 200 до 500 слов каждое. Таблица поиска содержит около 200 000 строк слов и фраз. Я понял, как заменить отдельные слова и фразы без особых проблем, но я не могу понять, как это сделать с помощью справочной таблицы.

Еще одно замечание, которое вызывает у меня горе: мне нужно сопоставить точные слова / фразы, включая специальные символы. Например, «болезнь Адисона» должна соответствовать «болезни Адисона», а не «болезни Адисона». «Cotton-Roll» должен соответствовать «Cotton-Roll», но он не должен соответствовать «Cottonroll» или «Cotton Roll».

Я использую версию R 3.6.2 (2019-12-12) Платформа: x86_64-w64-mingw32 / x64 (64-разрядная версия) Работает под: Windows 10 x64 (сборка 18362)

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

Вот вариант с str_replace_all

library(stringr)
str_replace_all(sentences$text, setNames(lookup$key,
        str_c("\\b(", lookup$synonym, ")\\b")))
#[1] "a cat in a hat"       "a dog has a bone"     "this is a category"   "their cat has no hat"

Или с использованием dplyr

library(dplyr)
sentences %>%
   mutate(text = str_replace_all(text, 
         set_names(lookup$key,
        str_c("\\b(", lookup$synonym, ")\\b"))))
#  ID                 text
#1  1       a cat in a hat
#2  2     a dog has a bone
#3  3   this is a category
#4  4 their cat has no hat
1 голос
/ 24 марта 2020

По большей части то же самое, что и ответ @ akrun, но я лично предпочитаю stringi версию stringr str_replace_all, которая не работает со странным именем вектора. Так что здесь для альтернативы:

sentences$text <- stringi::stri_replace_all_regex(
  str = sentences$text,
  pattern = paste0("\\b", lookup$key, "\\b"),                    # add word boundaries
  replacement = lookup$synonym,
  vectorize_all = FALSE, 
  opts_regex = stringi::stri_opts_regex(case_insensitive = TRUE) # set additional options
)
sentences
#>   ID                     text
#> 1  1    the kitten in the hat
#> 2  2    the dog with the bone
#> 3  3     this is the category
#> 4  4 their kitten with no hat
1 голос
/ 24 марта 2020

Используя gsubfn, создайте список перевода trans, а затем для каждого слова (определяемого регулярным выражением, где \ y означает границу слова, а \ w - символ слова) замените его на trans, если в * 1003 есть совпадение *:

library(gsubfn)

trans <- with(lookup, setNames(as.list(key), synonym))
transform(sentences, text = gsubfn("\\y\\w+\\y", trans, text))

подача:

  ID                 text
1  1       a cat in a hat
2  2     a dog has a bone
3  3   this is a category
4  4 their cat has no hat
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...