使用 R 与词典进行单词匹配。使用现有词典分析调查评论

Word matching with dictionaries using R. Analyzing Survey Comments with existing dictionaries

我正在尝试使用 R 中的现有单词词典分析调查评论列表。调查评论的范围从一个词到多个句子。我有多个单词词典,如下所示。理想情况下,我希望第 1 列是调查评论,然后是每个字典的列。

如果词典中的单词出现在调查评论中,词典列将 return 和 "True" 或 "False"。一些调查评论应该有多个记录,表示评论中有多个类别。

调查评论

Survey<- c("Benefits are great", "I like the flexible hours", "my manager is bad", "the manager is great", "my manager gives me flexible hours to work")

词典

CompDictionary<- c("benefit", "benefits", "pay")
FlexDictionary<- c("flexible", "flex day", "flex time")
LeadDictionary<- c("manager", "boss", "director")

如有任何帮助,我们将不胜感激。让我知道是否还有其他我可以提供的帮助。

鉴于您所述的问题,这里有一个使用 base R 的解决方案。

Survey<- c("Benefits are great", "I like the flexible hours", "my manager is bad", "the manager is great", "my manager gives me flexible hours to work")

CompDictionary<- c("benefit", "benefits", "pay")
FlexDictionary<- c("flexible", "flex day", "flex time")
LeadDictionary<- c("manager", "boss", "director")

f = function(dict,Survey){
  apply(do.call(rbind,lapply(dict,grepl,Survey,ignore.case=T)),2,any)
}

res = lapply(list("Comp"=CompDictionary,"Flex"=FlexDictionary,"Lead"=LeadDictionary),f,Survey)

df = as.data.frame(res)
df$Survey = Survey

由于您有一个目标词列表并且您的调查回复未经处理,因此您需要使用 grepl 来搜索一个词,并使用 returns 逻辑 TRUE/FALSE 如果它存在。但是,grepl 只接受一个输入,因此我们需要 apply 遍历字典术语列表。然后我们需要检查它们中的 any 是否为真。我将所有这些都封装在一个函数中,以便以后轻松调用它。

现在,我们需要 运行 每个词典的功能。我创建了一个命名列表(使 data.frame 步骤更容易)并使用 lapply 将每个字典传递到我创建的函数中。生成的命名列表变成了 data.frame,我附加了调查评论。

潜在的故障点

grepl 使用正则表达式,这是一种模式匹配形式。我已经将 ignore.case 标志设置为 TRUE,这样 'benefits' 将匹配 'Benefits'。不过,对于更复杂的匹配(例如 'flex day'),您只会在 完全匹配 上得到 TRUE,因此 'flexible hours' 现在与您的任何词典都不匹配.因此,虽然您的词典中有 'benefit' 和 'benefits'(在这种情况下是不必要的),但您必须有 'flexible hour' 和 'flex hour' 才能抓住使用术语 [=46= 的人] 或 'flex'.

需要考虑的事项

标记您的文本,然后应用词形还原器(甚至词干提取器)可以帮助减少术语的变化(使 'flex' 和 'flexible' 成为同一个词)。这将要求您随后了解新单词是什么并将其插入您的词典。