在R中搜索同一句子中的一组单词

时间:2017-02-08 19:48:49

标签: r regex grep grepl

我正在尝试在相同句子的上下文中搜索一组单词。例如,我正在尝试查找单词 "not" "sugar" 是否都存在于单句的上下文中

string = c(
"I do not like sugar. However, I like coffee.", 
"I like sugar. But I do not like coffee.")

这两个文字都带有"not""sugar"字样,但只有第一个文字在相同的句子中同时包含"not""sugar"字样。在第二个文本中,"not""sugar"存在于不同的句子中。

我想为第一个文本返回TRUE,为第二个文本返回FALSE

我试过了grepl("not\\ssugar", string)

2 个答案:

答案 0 :(得分:2)

这是一种可能的方式,当然不是最有效的,也不是更容易阅读(!) 虽然好处,它甚至为您提供了正确的句子。 我已经隔离了要测试的单词集和代码,以便您能够测试任意数量的单词的共同出现。

string = c(
  "I do not like sugar. However, I like coffee.", 
  "I like sugar. But I do not like coffee.")

checkwords=lapply(string,
FUN=function(str,words=c("sugar","not"))
{
  sapply(strsplit(str,"\\.")[[1]],FUN=function(el){
    any(all(sapply(words,
           FUN=function(wd)grepl(wd,el))))
     })
})
# yes this can be a one line instruction...
checkwords

 [[1]]
     I do not like sugar  However, I like coffee 
               TRUE                   FALSE 

 [[2]]
              I like sugar  But I do not like coffee 
                     FALSE                     FALSE 

然后检查初始向量string的每个元素是否存在至少一个TRUE:

sapply(checkwords, any)
[1]  TRUE FALSE

答案 1 :(得分:2)

你的尝试非常接近.... [^\\.,!?:;]允许除之类之间的标点符号之外的任何字符。

string = c(
  "I do not like sugar. However, I like coffee.", 
  "I like sugar. But I do not like coffee.",
  "I do not like coffee. But I love sugar.")

grepl("not[^\\.,!?:;]*sugar", string)