Как связать вместе несколько преобразований qdap для интеллектуального анализа текста/анализа настроений (полярности) в R

У меня есть data.frame с номерами недель, week, и текстовыми отзывами, text. Я хотел бы рассматривать переменную week как свою группирующую переменную и запускать для нее базовый текстовый анализ (например, qdap::polarity). Часть текста обзора состоит из нескольких предложений; однако меня волнует только полярность недели «в целом».

Как связать вместе несколько текстовых преобразований перед запуском qdap::polarity и придерживаться его предупреждающих сообщений? Я могу объединить преобразования с помощью tm::tm_map и tm::tm_reduce -- есть ли что-то похожее в qdap? Каков правильный способ предварительной обработки/преобразования этого текста перед запуском qdap::polarity и/или qdap::sentSplit?

Подробнее в следующем коде/воспроизводимом примере:

library(qdap)
library(tm)

df <- data.frame(week = c(1, 1, 1, 2, 2, 3, 4),
                 text = c("This is some text. It was bad. Not good.",
                          "Another review that was bad!",
                          "Great job, very helpful; more stuff here, but can't quite get it.",
                          "Short, poor, not good Dr. Jay, but just so-so. And some more text here.",
                          "Awesome job! This was a great review. Very helpful and thorough.",
                          "Not so great.",
                          "The 1st time Mr. Smith helped me was not good."),
                 stringsAsFactors = FALSE)

docs <- as.Corpus(df$text, df$week)

funs <- list(stripWhitespace,
             tolower,
             replace_ordinal,
             replace_number,
             replace_abbreviation)

# Is there a qdap function that does something similar to the next line?
# Or is there a way to pass this VCorpus / Corpus directly to qdap::polarity?
docs <- tm_map(docs, FUN = tm_reduce, tmFuns = funs)


# At the end of the day, I would like to get this type of output, but adhere to
# the warning message about running sentSplit. How should I pre-treat / cleanse
# these sentences, but keep the "week" grouping?
pol <- polarity(df$text, df$week)

## Not run:
# check_text(df$text)

person JasonAizkalns    schedule 01.12.2015    source источник


Ответы (1)


Вы можете запустить sentSplit, как предложено в предупреждении, следующим образом:

df_split <- sentSplit(df, "text")
with(df_split, polarity(text, week))

##   week total.sentences total.words ave.polarity sd.polarity stan.mean.polarity
## 1    1               5          26       -0.138       0.710             -0.195
## 2    2               6          26        0.342       0.402              0.852
## 3    3               1           3       -0.577          NA                 NA
## 4    4               2          10        0.000       0.000                NaN

Обратите внимание, что у меня есть пакет настроений прорыва sentimentr, доступный на github, который является улучшением. по скорости, функциональности и документации по сравнению с версией qdap. Это разбивает предложение внутри функции sentiment_by. Сценарий ниже позволяет вам установить пакет и использовать его:

if (!require("pacman")) install.packages("pacman")
p_load_gh("trinker/sentimentr")

with(df, sentiment_by(text, week))

##    week word_count        sd ave_sentiment
## 1:    2         25 0.7562542    0.21086408
## 2:    1         26 1.1291541    0.05781106
## 3:    4         10        NA    0.00000000
## 4:    3          3        NA   -0.57735027
person Tyler Rinker    schedule 02.12.2015
comment
Спасибо, Тайлер, я надеялся, что это привлечет ваше внимание. Очень быстро (и, надеюсь, чтобы помочь другим тоже), sentSplit и/или sentiment_by делают какие-либо внутренние преобразования? Я все еще хотел бы потенциально выполнить некоторые преобразования очистки перед разделением предложения или как я могу применить преобразования до (или после) вызова sentSplit, но перед вычислением полярности/настроения? Смотрите список функций, funs в вопросе - у меня нет времени (немедленно) смотреть на сентимент, поэтому, если это описано в его документах, пожалуйста, игнорируйте или чувствуйте, чтобы указать мне правильное направление. - person JasonAizkalns; 02.12.2015
comment
Да, надоело разбивать текст на уровне предложений. настроение гораздо точнее справляется с этой задачей, и поэтому вы получите лучшие результаты, не анализируя текст вручную. Чтобы преобразовать, просто оперируйте столбцом как вектором. Я бы сделал уборку раньше (скорее всего). - person Tyler Rinker; 02.12.2015