Выбор текста из соответствующих тегов в последовательности в R

Я пытаюсь последовательно извлечь текст из соответствующего тега в предложении. В основном я пытаюсь получить часть речи, соответствующую каждому предложению в текстовом файле. Код:

   posText<- "The VeriFone is not working, when customers slide card nothing happens. The screen is frozen. We rebooted but it did not help."
   posText1<- c("The VeriFone is not working","scanner is not scanning","printer offline","when customers slide card nothing happens. The screen is frozen. We rebooted but it did not help.")

   tagPOS <-  function(x, ...) {
   s <- as.String(x)
   word_token_annotator <- Maxent_Word_Token_Annotator()
   a2 <- Annotation(1L, "sentence", 1L, nchar(s))
   a2 <- annotate(s, word_token_annotator, a2)
   a3 <- annotate(s, Maxent_POS_Tag_Annotator(), a2)
   a3w <- a3[a3$type == "word"]
   POStags <- unlist(lapply(a3w$features, `[[`, "POS"))
   POStagged <- paste(sprintf("%s/%s", s[a3w], POStags), collapse = " ")
   list(POStagged = POStagged, POStags = POStags)
   }

   dd1 <- do.call(rbind, strsplit(as.character(posText), ' '))
   dd_V1 <- tagPOS(dd1)$POStagged
   dd_V1

Вывод

   [1] "The/DT VeriFone/NNP is/VBZ not/RB working/VBG ,/, when/WRB customers/NNS slide/NN card/NN nothing/NN happens/VBZ ./. The/DT screen/NN is/VBZ frozen/VBN ./. We/PRP rebooted/VBD but/CC it/PRP did/VBD not/RB help/VB ./."

Я хочу извлечь текст тега в последовательности. Например: я хочу извлечь тексты с тегом «NNP», «VBZ», «RB», «VBG» последовательно из всего текстового файла, где бы мы ни имели следующую последовательность в предложениях.

Мои желаемые результаты:

 [1] VeriFone is not working

Спасибо за помощь.


person Kiwi    schedule 17.11.2016    source источник
comment
Код вашего примера выдает ошибку и, вероятно, нуждается в коде из приведенного здесь ответа: stackoverflow.com/questions/28764056/   -  person Daniel Fischer    schedule 17.11.2016
comment
Спасибо, Даниил, что упомянул об этом. Я ошибочно скопировал свой другой код здесь. Виноват. Теперь я обновил его.   -  person Kiwi    schedule 17.11.2016
comment
Это все еще не работает для меня, извините! Вы уверены, что этот код работает для вас? Например, as.String и Maxent_Word_Token_Annotator() не находятся в базе R. Возможно, вы также могли бы отредактировать вопрос, чтобы posText был вектором, и каков результат, соответствующий желаемому результату в этом случае.   -  person Daniel Fischer    schedule 18.11.2016


Ответы (1)


Это довольно наивный подход, и если у вас много строк, он, вероятно, слишком медленный, но просто попробуйте.

# Get the constrol sequence IDs (probably with RegEx nicer to do...)
  tags <- sapply(strsplit(strsplit(dd_V1,"/")[[1]][-1]," "),"[",1)

# Define constants
  matchSeq <- c('NNP','VBZ','RB', 'VBG')
  totalTags <- length(tags)
  searchLength <- length(matchSeq)

# Loop through all subvectors and store starting points of possible matches
  startPoints <- c()
  for(i in 1:(totalTags-searchLength)){
    if(identical(tags[i:(i+searchLength-1)], matchSeq)) startPoints <- c(startPoints,i)
  }

# Print results, if there are any
  if(!is.null(startPoints)) paste(dd1[startPoints:(startPoints+searchLength-1)], collapse=" ")

Если вы найдете больше, чем даже местоположение, вы можете, например. перебрать startPoints и распечатать каждую последовательность отдельно.

person Daniel Fischer    schedule 17.11.2016
comment
Спасибо Даниэль. Ваш код работает хорошо для меня. Но если моя переменная (posText) имеет значения ниже, она не соответствует последовательности. posText‹- c(VeriFone не работает,сканер не сканирует,принтер отключен,когда клиент вставляет карту ничего не происходит. Экран завис. Мы перезагрузили,но это не помогло.) - person Kiwi; 17.11.2016
comment
В случае, если posText является вектором, как выглядит ваш объект dd_V1? Кажется, когда я использую ваш код, он уже там предложения перемешивает, так что структура в dd_V1 перекручивается! - person Daniel Fischer; 18.11.2016
comment
Да, @Daniel Fischer, вы правы. Когда я использую «posText» в качестве входных данных для вашего кода, я получаю желаемый результат. Но если я использую «posText1» в качестве входных данных для вашего кода, структура «dd_V1» искажается. Кажется, что строка, разделенная в «dd1», не имеет одинаковой длины. Мой ожидаемый результат с использованием «posText1»: извлечь слова с тегом «NNP», «VBZ», «RB», «VBG» в последовательности из 4 предложений в «posText1». - person Kiwi; 22.11.2016
comment
В зависимости от количества введенного текста вы можете зациклиться на объекте posText1 и рассматривать его как исходную проблему. Но, конечно, это может быть медленно. Просто оберните все вокруг for(j in 1:length(posText1)) и получите доступ к элементу через posText[1] и обработайте его как один элемент. И запишите результат в каждом цикле. Может медленно, но должно работать. - person Daniel Fischer; 22.11.2016
comment
Спасибо @Daniel Fischer за ваше руководство. Я пробовал ваш код с разными образцами. Но он терпит неудачу, если в каком-либо предложении заданная последовательность соответствия не найдена. Ошибка: Ошибка в startPoints: (startPoints + searchLength - 1): аргумент длины 0 - person Kiwi; 24.11.2016
comment
Не могли бы вы привести пример posText, где это не удается? Возможно, последний пункт if неверен и нуждается в небольшой корректировке. - person Daniel Fischer; 24.11.2016