首页 > 解决方案 > 将数据框中的文本信息拆分为单个单词并检测它们是否是字典 R 的一部分

问题描述

我正在尝试编写一个脚本来检测未定义数量的单词中的一个单词是否是字典的一部分。

为了让这个问题更容易理解,我有以下数据:

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

对于这个例子,我只是假设一个英文字典。在这种特定情况下,如果只有一个单词是字典的一部分,就足够了。

我已经尝试使用 qdapDictionaries 库和标记器来标记数据框单元格的内容,但我无法正确检查我有多个单词的单元格。

非常感谢您的帮助,

谢谢!

标签: rdataframenlp

解决方案


由于我不知道您正在使用哪本词典,以下是您原则上如何执行此任务的说明:

数据:

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

假设您使用GradyAugmented来自 的字典library(qdapDictionaries),您可以将字典中的单词粘贴在一起,通过正则表达式交替标记将它们分开,|并使用grepl返回 TRUE 或 FALSE 的 来检查字典单词是否包含在任何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

希望这可以帮助。


推荐阅读