Считайте положительные и отрицательные слова в строке, учитывая отрицательные и отрицательные - PullRequest
1 голос
/ 17 марта 2020

Следующий код сопоставляет положительные и отрицательные слова в тексте и считает их. Давайте рассмотрим, например,

sentences<-c("You are not perfect!", 
            "However, let us not forget what happened across the Atlantic.", 
            "And I can't support you.",
            "No abnormal energy readings",
            "So with gratitude, the universe is abundant forever.")

Сначала мы импортируем положительные и отрицательные слова

pos = readLines("positive-words.txt")
neg = readLines("negative-words.txt")

из текстовых файлов. В этих файлах мы нашли:

abundant
gratitude
perfect
support

для positive-words.txt и

abnormal

для negative-words.txt. Следующие команды:

sentence = gsub("[[:punct:]]", "", sentence)
sentence = gsub("[[:cntrl:]]", "", sentence)
sentence = gsub('\\d+', '', sentence)

удаляют цифры, управляющие символы и знаки препинания. Затем мы разбиваем предложение на слова с помощью str_split (stringr package)

word.list = str_split(sentence, "\\s+")
words = unlist(word.list)

и сравниваем слова со словарями положительных и отрицательных терминов

pos.matches = match(words, pos)
neg.matches = match(words, neg)
pos.matches = !is.na(pos.matches)
neg.matches = !is.na(neg.matches)

Переменная sentence может быть sentences[1], sentences[2], sentences[3], sentences[4] или sentences[5]. Например, если sentence=sentences[5], этот код правильно возвращает два положительных слова; фактически результат:

> pos.matches
[1] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE

То же самое происходит для всех других предложений. Например, если sentence=sentences[4]:

> neg.matches
[1] FALSE  TRUE FALSE FALSE

В любом случае, я хотел бы изменить этот код для того, чтобы разрешить ситуации, заключенные в sentences[1], sentences[3] и sentences[4]. На самом деле: perfect в sentences[1] является положительным словом, но ему предшествует not, и тогда я хотел бы рассмотреть эти два слова как один (отрицательный) термин; support в sentences[3] является положительным словом, но ему предшествует cant, и тогда я хотел бы рассмотреть эти два слова как отрицательный термин; abnormal в sentences[4] является отрицательным словом, но ему предшествует no, и тогда я хотел бы рассмотреть эти два слова как один положительный термин. Например, желаемый результат для sentence=sentences[4]:

> pos.matches
[1] TRUE FALSE FALSE

Вместо этого с помощью этого кода я получаю:

> pos.matches
[1] FALSE FALSE FALSE FALSE

Я подумал, а затем определить переменную с отрицаниями и отрицаниями:

NegativesNegations <- paste("\\b(", paste(c("no","not","couldnt","cant"), collapse = "|"), ")\\b")

Но я не знаю, как двигаться вперед с этим.

1 Ответ

1 голос
/ 17 марта 2020

Вы можете выполнить sh эту задачу с помощью простого регулярного выражения. Сначала вы преобразуете свои положительные и отрицательные списки в строки регулярных выражений, как вы делали со списком отрицательных отрицаний:

pos_rgx = paste0("\\b(", paste(pos, collapse="|"), ")\\b")
neg_rgx = paste0("\\b(", paste(neg, collapse="|"), ")\\b")

Теперь вы можете проверять каждое предложение, если существует положительное или отрицательное слово:

grepl(pos_rgx, sentences, ignore.case=TRUE)
grepl(neg_rgx, sentences, ignore.case=TRUE)

для добавления отрицаний вы можете действовать соответствующим образом:

pos_neg_rgx = paste0('\\b(no|not|couldn\'t|can\'t)\\s', pos_rgx)
grepl(pos_neg_rgx, sentences)

note: '\\ s' означает, что между отрицанием и положительным словом находится один пробел

note ( 2): если вы цитируете свою строку одинарными кавычками, вы должны экранировать кавычку в «not» (как в примере). В противном случае вы можете заключить строку в кавычки: "\ b (нет | не | не смог / не могу) \ s"

Если вы хотите углубиться в интеллектуальный анализ текста, посмотрите в пакете Tidytext

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