Как искать предыдущие строки в списке, пока не найдено совпадение - PullRequest
0 голосов
/ 16 января 2019

Этот вопрос является производным от предыдущего вопроса, который я задал здесь , но я изменил список ввода и вопрос другой:

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

Проблема, с которой я столкнулся, заключается в том, что местоположение может быть в предложении, которое на два или три предложения предшествует предложению с событием, поэтому я хотел бы также обнаружить это.

Мой входной вложенный список:

list(c("Oesophagus irregular z-line as previously.", " quad biopsies at ,,,m"
), c("Normal examination", "cardia mild inflammation."
), c("stomach normal", "No problems here", 
"Everything  normal", "Small polyp EMR and completely removed", "GOJ normal", 
"Nodule seen which was normal", "This was removed by EMR", 
"All other sites normal  normal", " A small area of residual stomach was removed by APC "))

Список событий

EventList<-c("RFA","EMR","APC")

Список местоположений

LocationList<-function(){

  tofind <-paste(c("Stomach","Antrum","Duodenum","Oesophagus","GOJ"),collapse = "|")

  return(tofind)

}

Мой желаемый вывод:

""  
""   
"stomach:EMR, goj:EMR, stomach:APC"

Попытка 1

@ akrun очень помог мне в создании решения (пока только одно предыдущее предложение в списке предложений ищет место) следующим образом:

sapply(text,function(x) {

           x1 <- str_extract_all(tolower(x),tolower(paste(EventList, collapse="|")))
           i1 <- which(lengths(x1) > 0)
           if(any(i1)) {
             paste(unlist(Map(c, str_extract_all(tolower(x[i1-1]), 
                                         tolower(LocationList())), 
                       str_extract_all(tolower(x[i1]), tolower(LocationList())))), 
                        toupper(x1[i1]), sep=":", collapse=", ") 

           } else ""

             }

             )

Кажется, что на самом деле мне не нужно сохранять входной список в виде вложенного списка (и, вероятно, его проще сохранить в виде полного текста, чтобы я мог использовать регулярное выражение в целом для положительного взгляда сзади) и таким образом, приведенная выше функция может быть переопределена (с помощью псевдокода для части, которую я испытываю при создании проблемы)

sapply(text,function(x) {


text<-lapply(text,function(x) paste(x,collapse=";"))
text<-unlist(text)

               x1 <- str_extract_all(tolower(x),tolower(paste(EventList, collapse="|")))
               i1 <- which(lengths(x1) > 0)
               if(any(i1)) {


              #How to iterate through all the events found in the x1 and then search the nearest location (from the location list) behind this in each report?

} else ""

                 }
)

1 Ответ

0 голосов
/ 16 января 2019

Проверьте мое решение:

library(tidyverse)
library(wrapr)

tofind <-paste(c("Stomach", "Antrum", "Duodenum", "Oesophagus", "GOJ"),collapse = "|")

EventList<-c("RFA","EMR","APC")

words <-
  YOURS_LIST %>%
  unlist() %>%
  str_replace_na()%>%
  str_c(collapse = ' ') %>%
  str_split(' ') %>%
  `[[`(1)

EventList %>%
  map(
    ~words %>%
      str_which(paste0('^.*', .x)) %>%
      map_chr(
        ~words[1:.x] %>%
          str_c(collapse = ' ') %>%
          str_extract_all(regex(tofind, ignore_case = TRUE)) %>%
          `[[`(1) %.>%
          .[length(.)]
      ) %>%
      paste0(':', .x)
  ) %>%
  unlist() %>%
  str_subset('.+:')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...