Как добавить теги к отрицательным словам до следующего знака препинания в R

Мне нужна помощь, чтобы выяснить, как мы можем смоделировать в R решение для добавления тега «НЕ_» к каждому слову, которое следует за словом отрицания до следующего знака препинания.

Решение для кода Python можно найти здесь no-and-never">Как добавить теги к словам с отрицанием в строках, следующих за not, no и never.

У меня есть следующее решение для добавления тега «НЕ_» к следующему слову после слов отрицания: нет, никогда, нет, без, вряд ли

str_negate <- function(x) {
  gsub("not ","not NOT_",
            gsub("n't ","n't NOT_",
            gsub("never ","never NOT_",
            gsub("without ","without NOT_",
            gsub("unlikely to ","unlikely to NOT_",x)))))
}

str_negate(FeedbackCommentsVectorProc$Sentences)

но мне нужно адаптировать его, чтобы добавить тег «НЕ_» в каждое слово до следующего знака препинания.

Любая помощь высоко ценится!


person Cristina Cerqueira    schedule 25.08.2014    source источник


Ответы (1)


РЕДАКТИРОВАТЬ

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

library(gsubfn)
str_negate <- function(x) {
   x1 <- gsub("(not|n't|never|without|unlikely to) (\\w+)", '\\1 NOT_\\2', x)
   x2 <- gsubfn('NOT_([^[:punct:]]+)', ~ gsub('(\\w+)', 'NOT_\\1', x), x1)
   x2
}
x <- "It was never going to work, he thought. He did not play so well, so he had to practice some more."
str_negate(x)
## [1] "It was never NOT_going NOT_to NOT_work, he thought. He did not NOT_play NOT_so NOT_well, so he had to practice some more."

Если бы когда-либо имело место несколько слов отрицания перед знаком препинания...

str_negate <- function(x) {
   x1 <- gsub("(not|n't|never|without|unlikely to) \\K", 'NOT_', x, perl=T)
   x2 <- gsubfn('NOT_([a-zA-Z_ ]+)', ~ gsub("\\b(?!(?i:not|n't|never|without|unlikely to))(?=\\w+)", 'NOT_', x, perl=TRUE), x1)
   x2
}
x <- 'It was unlikely to work and it seems like it never was going to end.'
str_negate(x)
## [1] "It was unlikely to NOT_work NOT_and NOT_it NOT_seems NOT_like NOT_it never NOT_was NOT_going NOT_to NOT_end."
person hwnd    schedule 25.08.2014
comment
Спасибо за вашу помощь! Мне нужно добавить ко всем словам, которые следуют за не, никогда и т. д., до следующего знака препинания в предложении. Например, для ввода: это никогда не сработает, подумал он. Он играл не так хорошо, поэтому ему пришлось еще немного потренироваться. Мне нужен следующий вывод: Это никогда НЕ_будет НЕ_работать НЕ_, подумал он. Он НЕ_играл НЕ_так НЕ_хорошо, поэтому ему пришлось еще немного потренироваться. Ваше решение заключается в добавлении тега только к следующему слову, а не ко всем словам. - person Cristina Cerqueira; 26.08.2014
comment
что означает регулярное выражение \\K, которое вы используете в своем решении выше? Я нигде не могу найти его значение. Я пытался адаптировать ваш код к тому, что мне нужно. Спасибо! - person Cristina Cerqueira; 26.08.2014
comment
Считаете ли вы, что из приведенного здесь списка: regular-expressions.info/refcapture.html есть ли какое-нибудь регулярное выражение, которое подойдет мне? Большое спасибо! - person Cristina Cerqueira; 27.08.2014