Разделение текстовой информации во фрейме данных на отдельные слова и определение, являются ли они частью словаря R - PullRequest
0 голосов
/ 09 июля 2020

Я пытаюсь написать сценарий, чтобы определить, является ли одно слово из неопределенного количества слов частью словаря.

Чтобы сделать эту проблему немного более понятной, у меня есть следующие данные:

Items | Descriptions    | 
-------------------------
Item1 | poster           
Item2 | used cd music etc
Item3 | hckd herbal ingds.
Item4 | 823942 blc

Итак, что я хочу сделать, это проверить описания столбцов, если какое-либо из этих отдельных слов является частью словаря или самостоятельно созданного вектора строк. Таким образом, результат должен выглядеть примерно так:

Items | Descriptions       | inDictionary
--------------------------------------------------
Item1 | poster             | TRUE
Item2 | used cd music etc  | TRUE
Item3 | hckd herbal ingds. | TRUE
Item4 | 823942 blc         | FALSE

В этом примере я просто предполагаю словарь engli sh. В этом c случае достаточно, если только одно слово является частью словаря.

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

Помощь приветствуется,

Спасибо!

1 Ответ

3 голосов
/ 09 июля 2020

Так как я не знаю, с каким словарем вы работаете, вот описание в принципе вы можете go по этой задаче:

Данные:

df <- data.frame(Descriptions = c("cyber"," &%@","aah ingds.", "823942 blc"))

Допустим, вы работаете со словарем GradyAugmented из library(qdapDictionaries), вы можете вставить слова в словарь вместе, разделяя их маркером чередования регулярных выражений |, и использовать grepl, который возвращает TRUE или ЛОЖЬ, чтобы проверить, содержатся ли слова словаря в какой-либо из df$Description строк:

df$inDict <- grepl(paste0("\\b(", paste(GradyAugmented[1:100], collapse = "|"), ")\\b"), df$Descriptions)

Результат:

df
  Descriptions inDict
1        cyber   TRUE   
2          &%@  FALSE   
3   aah ingds.   TRUE
4   823942 blc  FALSE

Словарь может быть очень большим, и вы можете столкнуться с проблемы с памятью. В этом случае вы можете выбрать другой маршрут, через %in%:

df$inDict <- lapply(strsplit(df$Descriptions, " "), function(x) x %in% GradyAugmented)

Здесь строки представляют собой списки:

df$inDict <- lapply(strsplit(df$Descriptions, " "), function(x) x %in% GradyAugmented)
df
  Descriptions       inDict
1        cyber         TRUE
2          &%@        FALSE
3   aah ingds.  TRUE, FALSE
4   823942 blc FALSE, FALSE

Надеюсь, это поможет.

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