Как два находят два слова в любом порядке в предложении, разделенном точкой - PullRequest
0 голосов
/ 08 декабря 2018

Я пытаюсь извлечь любое предложение (определяемое как состоящее из двух периодов), в котором есть два слова column и Barr в любом порядке.Это сложно, так как на данный момент я создал регулярное выражение, которое находит только два слова в любом порядке перед точкой, но если два слова присутствуют в двух предложениях, то выбирается весь текст между двумя предложениями.Как я могу сделать предложение регулярного выражения конкретным?

Ввод

try<-c("I am a sentence.I am a sentence and I contain Barr. I contain other things. I contain column as well.","Here we go. I am a sentence and I contain column but also Barr. I only contain Barr. I am too.")

Желаемый вывод

[1] NA
[2] "I am a sentence and I contain column but also Barr.

Попытка

str_extract_all (попробуйте, "\ .. * column. Barr. ? \. |. * Barr. column. ? \." ")

токовый выход

[[1]]
[1] "I am a sentence.I am a sentence and I contain Barr. I contain other things. I contain column as well."

[[2]]
[1] ". I am a sentence and I contain column but also Barr. I only contain Barr."

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Вот более общая попытка, которая не требует создания каждой перестановки нужных слов, полезна, когда требуется более двух работ.

Стратегия - найти предложения с каждым отдельным словом, а затем найтипересечение для результатов.

#split the long text into individual sentences.
sentences<-strsplit(try, "\\.")

#create list of matches for each desired word
columnlist<-lapply(sentences, function(x) {grep("(column)", x)})
barrlist<-lapply(sentences, function(x) {grep("(Barr)", x)})

#find intersection between lists
intersection<-lapply(seq_along(columnlist), function(i){intersect(columnlist[[i]], barrlist[[i]])} )

#extract the sentences out
answer<-sapply(seq_along(intersection), function(i) { 
  if(length(intersection[[i]])) 
    {trimws(sentences[[i]][intersection[[i]] ])}  
  else {NA}
})

Результат

#[[1]]
#[1] NA
#
#[[2]]
#[1] "I am a sentence and I contain column but also Barr" 
0 голосов
/ 08 декабря 2018

Чтобы найти два слова, представленные в любом порядке, вы можете использовать два положительных указателя: например, grepl((?=.*Barr)(?=.*column),x,perl=T) будет возвращать TRUE каждый раз, когда присутствуют оба слова, независимо от их порядка, и FALSE в противном случае, но этоне учитывает структуру предложения.Поскольку вы хотите извлечь текст, и вы хотите найти два слова между точками, мы можем изменить его на:

library(stringr)
## Example data
x <- c("I am a sentence.I am a sentence and I contain Barr. I contain other things. I contain column as well.","Here we go. I am a sentence and I contain column but also Barr. I only contain Barr. I am too.","Barr and column and also column. But just Barr. And just column. Now again column and Barr")
> x
[1] "I am a sentence.I am a sentence and I contain Barr. I contain other things. I contain column as well."
[2] "Here we go. I am a sentence and I contain column but also Barr. I only contain Barr. I am too."       
[3] "Barr and column and also column. But just Barr. And just column. Now again column and Barr"           

str_extract_all(x,"(\\.|^)(?=[^\\.]*Barr)(?=[^\\.]*column)[^\\.]*(\\.|$)")

Это ищет начало предложения или точку (\\.|^), за которой следуетсимволы, которые не являются точками и содержат Barr и столбец (?=[^\\.]*Barr)(?=[^\\.]*column)[^\\.]*, за которыми следуют точка или конец предложения (\\.|$).Это возвращает список:

[[1]]
character(0)

[[2]]
[1] ". I am a sentence and I contain column but also Barr."

[[3]]
[1] "Barr and column and also column." ". Now again column and Barr"
0 голосов
/ 08 декабря 2018

Это регулярное выражение, кажется, делает то, что вам нужно:

(\\.[^.]*column[^.]*Barr[^.]*)|(\\.[^.]*Barr[^.]*column[^.]*)

Оно будет начинаться с точки (.) и захватывает все, что не является точкой, но также имеет column и Barr,Или то же самое с обоими словами в другом порядке.

Пример:

try = c("I am a sentence.I am a sentence and I contain Barr. I contain other things. I contain column as well.",
        "Here we go. I am a sentence and I contain column but also Barr. I only contain Barr. I am too.",
        "I am a sentence and I contain column but also Barr. I only contain Barr. I am too.",
        "I contain column and Barr. I have Barr and column. I don't.",
        "Hello. I contain Barr and column but also Barr. I only contain Barr. I am too.") 

k = sapply(try, function(x){
  str_extract(paste0(".",x), "(\\.[^.]*column[^.]*Barr[^.]*)|(\\.[^.]*Barr[^.]*column[^.]*)")
})
names(k) = NULL

Результат:

[1] NA                                                    
[2] ". I am a sentence and I contain column but also Barr"
[3] ".I am a sentence and I contain column but also Barr" 
[4] ".I contain column and Barr"                          
[5] ". I contain Barr and column but also Barr"

Если вы используете str_extract_all имейте в виду, что он возвращает список совпадений.

[[1]]
character(0)

[[2]]
[1] ". I am a sentence and I contain column but also Barr"

[[3]]
[1] ".I am a sentence and I contain column but also Barr"

[[4]]
[1] ".I contain column and Barr" ". I have Barr and column"  

[[5]]
[1] ". I contain Barr and column but also Barr"

Я добавил paste0(".",x), чтобы обнаружить предложения, которые содержат оба слова и являются первыми (они не начинаются с точки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...