В этом блоге мы анализируем настроения твитов, которые имели место во время президентских дебатов в августе 2016 года в Огайо. Мы провели как категоризацию данных, так и анализ контента, чтобы ответить, был ли твит релевантным, какой кандидат упоминал больше всего в твитах и ​​тональность твита.

Считайте данные в R, данные также доступны в базе данных SQL, но здесь мы загрузили файл CSV в R.

data=read.csv("Sentiment.csv") head(data)

Структурирование данных - самая важная часть этого процесса. Набор данных «Настроение» содержит различную другую информацию, которая не имеет отношения к этому, чтобы выбрать здесь конкретно столбцы «текст» и «тональность» и исключить остальное.

library(tidyverse) datas=data%>%select(text,sentiment) head(datas) round(prop.table(table(datas$sentiment)),2)

Вывод после структурирования данных:

Очистка данных:

library(tm) library(SnowballC) corpus = VCorpus(VectorSource(datas$text)) corpus = tm_map(corpus, content_transformer(tolower)) corpus = tm_map(corpus, removeNumbers) corpus = tm_map(corpus, removePunctuation) corpus = tm_map(corpus, removeWords, stopwords("english")) corpus = tm_map(corpus, stemDocument) corpus = tm_map(corpus, stripWhitespace) as.character(corpus[[1]])

Вывод после очистки текста:

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

dtm = DocumentTermMatrix(corpus) dtm dim(dtm) dtm = removeSparseTerms(dtm, 0.999) dim(dtm)

Ниже показан список слов из нашего текста, повторяющийся как минимум более 100 раз.

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

library(wordcloud) 
library(ggplot2) 
install.packages("RColorBrewer") 
#wordcloud requires RColorBrewer positive= subset(datas,sentiment=="Positive") wordcloud(positive$text, max.words = 100, colors = "blue") negative = subset(datas,sentiment=="Negative") wordcloud(negative$text, max.words = 100, colors = "purple") neutral = subset(datas,sentiment=="Neutral") wordcloud(neutral$text, max.words = 100, colors = "turquoise")

Кроме того, мы использовали алгоритм машинного обучения «Наивный Байес» для прогнозирования, обсуждаемого ниже.

#As naive bayes algorithm excepts binary 
convert <- function(x) {
y <- ifelse(x > 0, 1,0)
y <- factor(y, levels=c(0,1), labels=c("No", "Yes"))
y
    }  
    
    datanaive = apply(dtm, 2, convert)
    
    dataset = as.data.frame(as.matrix(datanaive))    
    dataset$Class = datas$sentiment
    str(dataset$Class)

Разделение данных

    set.seed(31)
    split = sample(2,nrow(dataset),prob = c(0.75,0.25),replace = TRUE)
    train_set = dataset[split == 1,]
    test_set = dataset[split == 2,] 
    
    prop.table(table(train_set$Class))
    prop.table(table(test_set$Class))

# naive bayes
    install.packages("e1071")
    library(e1071)
    library(caret)
    control= trainControl(method="repeatedcv", number=10, repeats=2)
    system.time( classifier_nb <- naiveBayes(train_set, train_set$Class, laplace = 1,trControl = control,tuneLength = 7) )

Выход модели:

Оценка модели Наивного Байеса и прогнозируемая точность составляет 98,67%, что показано ниже:

# model evaluation
    
    nb_pred = predict(classifier_nb, type = 'class', newdata =  test_set)
    confusionMatrix(nb_pred,test_set$Class)

Статистика наивной байесовской модели:

Спасибо, что прочитали мою статью. Надеюсь, вы получили некоторое представление о том, как алгоритм машинного обучения работает с контент-анализом.