我试图用R中现有的单词词典分析调查评论列表。调查评论的范围从一个单词到多个句子。我有多个单词词典,如下面的样本。理想情况下,我希望第1列成为调查评论,然后是每个字典的列。
字典列将返回" True"或"错误"如果词典中的单词出现在调查评论中。一些调查评论应该有多个标签,表明评论中有多个类别。
调查评论
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")
对此的任何帮助将不胜感激。如果我能提供其他任何有用的内容,请告诉我。
答案 0 :(得分:1)
鉴于您所述的问题,这里是使用基础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
搜索单词并返回逻辑TRUE / FALSE(如果存在)。但是,grepl
只接受一个输入,因此我们需要apply
超过字典术语列表。然后我们需要检查它们any
是否为真。我把所有这些都包含在一个函数中,以便稍后调用它。
现在,我们需要为每个Dictionary运行该函数。我创建了一个命名列表(使data.frame步骤更容易)并使用lapply
将每个字典传递给我所做的函数。生成的命名列表将转换为data.frame,并附加调查注释。
潜在的失败点
grepl
使用正则表达式,这是一种模式匹配形式。我已将ignore.case
标记设置为TRUE,以便&#39;有益于&#39;将匹配&#39;福利&#39;。尽管如此,对于更复杂的比赛(例如&#39; flex day&#39;),您只能在完全匹配时获得正确,因此灵活的小时数&#39;目前还没有与你的任何词典相匹配。所以,虽然你有“受益”。和&#39;福利&#39;在你的词典中(在这种情况下是不必要的),你必须拥有灵活的小时&#39;和&#39; flex hour&#39;使用“灵活”这个术语来吸引人们。或者&#39; flex&#39;。
需要考虑的事项
对文本进行标记然后应用词形变换器(或者甚至是词干)可以帮助减少术语的变化(使&#39; flex&#39;以及&#39;灵活&#39;相同的词)。这将要求您随后了解新单词的内容并将其插入到词典中。