Поиск группы слов в одном предложении в R

Я пытаюсь найти группу слов в контексте одного и того же предложения. Например, я пытаюсь выяснить, существуют ли слова "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)


person gibbz00    schedule 08.02.2017    source источник


Ответы (2)


Ваша попытка была очень близка... Этот [^\\.,!?:;] позволяет использовать любой символ, кроме знака препинания между like и sugar.

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)
person emilliman5    schedule 08.02.2017

Вот возможный способ, конечно, не самый эффективный и не самый легкий для чтения (!) Преимущества, хотя он даже предоставляет вам предложения, которые ИСТИННЫ. Я уже выделил набор слов для проверки и код, чтобы вы могли проверить совпадение любого произвольного количества слов.

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 

И затем вы проверяете наличие хотя бы одного TRUE для каждого элемента исходного вектора string:

sapply(checkwords, any)
[1]  TRUE FALSE
person Eric Lecoutre    schedule 08.02.2017