Краткое введение в анализ текста

Анализ текста (TA) – это раздел машинного обучения, связанный с извлечением ценной информации/пониманий из неструктурированных текстовых данных (так называемых текстовых корпусов). От выяснения того, какие U.S. Президент дает самые длинные речи для выявления следов разжигания ненависти, анализ текста находит применение почти во всех областях, о которых вы только можете подумать.

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

Извлечение ключевых слов

Ключевые слова — это наиболее часто используемые и наиболее релевантные термины в тексте, слова и фразы, обобщающие содержание текста. Методы ТА часто включают создание документа частоты терминов для определения наиболее часто встречающихся ключевых слов. Обычный способ легко визуализировать извлеченные ключевые слова — использовать WordCloud, который обеспечивает быстрое понимание длинных фрагментов текста.

Анализ настроений

Использование алгоритмов машинного обучения для автоматического определения эмоций в тексте является неотъемлемой частью анализа текста. Анализ настроений может варьироваться от обнаружения базовой полярности мнений, таких как положительное, нейтральное и отрицательное, до более глубокого обнаружения сарказма!

Набор данных

Вдохновением для этого проекта послужило популярное YouTube видео от Glamour. Участникам в возрасте от 5 до 75 лет задавали один вопрос:

О чем вы больше всего сожалеете?

Ответы варьировались от детей, которые хотели бы иметь больше времени для игр, до взрослых, сожалеющих о жизненном выборе. Степень эмоций, выраженных в этих ответах, дает возможность научиться углубляться в НЛП и анализ настроений. Это также дает вам возможность обдумать некоторые жизненные решения во время написания кода, но это совершенно необязательно.

Чтобы преобразовать видео в пригодный для работы набор данных, я расшифровал ответы, предоставленные людьми, в лист Excel, который затем был экспортирован в виде файла CSV.

Полученный CSV-файл содержал 3 столбца: возраст, пол и ответы, предоставленные участниками.

Код

Следующие библиотеки CRAN будут вашим спасением, когда дело доходит до выполнения TA в RStudio.

  • SnowballC: интерфейс R к библиотеке C libstemmer, который реализует алгоритм Портера для объединения слов в общий корень, чтобы облегчить сравнение словарного запаса.
  • wordcloud: возможность создавать красивые облака слов, визуализировать различия и сходства между документами и избегать чрезмерного наложения текста на точечные диаграммы.
  • сюжет: извлекает настроения и сюжетные дуги, основанные на настроениях, из текста, используя различные словари настроений, удобно упакованные для использования пользователями R.
  • tm: фреймворк для приложений интеллектуального анализа текста в R.

Несколько других полезных библиотек включают: gridExtra, RColorBrewer, janitor и dplyr.

Мой набор данных загружается и очищается под самой оригинальной переменной dset. Здесь можно разделить большой набор данных на более мелкие категории, чтобы проанализировать их отдельно, как показано ниже:

#Разделение набора данных на разные возрастные группы

dset_young ‹- dset %›% filter(возраст ›= 5 и возраст ‹ 25)
dset_mid ‹- dset %›% filter(возраст ›= 25 & age ‹ 50)
dset_old ‹- dset %› Фильтр %(возраст›=50 и возраст ‹ 76)

#В качестве альтернативы мы можем разделить по полу
dset_f ‹- dset %›% filter(gender==”F”)
dset_m ‹- dset %›% filter(gender==”M”)

Из-за ограниченного набора фактических слов, доступных для игры, я буду использовать весь набор данных как есть. Колонка, с которой мне особенно интересно поэкспериментировать, — это реакция аудитории под названием «сожаление», которая будет извлечена:

#Работа с необходимыми столбцами для анализа текста
dset_analysis ‹- dplyr::select(dset, c(‘regret’))

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

TextDoc ‹- Корпус (VectorSource (dset_analysis))

Несколько основных шагов по очистке с использованием встроенных функций библиотеки tm, выполняемых на текстовом корпусе, чтобы гарантировать, что мы не столкнемся с какими-либо странными ошибками:

Преобразование всего текста в нижний регистр
TextDoc ‹- tm_map(TextDoc, content_transformer(tolower))

#Удалить знаки препинания
TextDoc ‹- tm_map(TextDoc, removePunctuation)

#Удаление лишних пробелов
TextDoc ‹- tm_map(TextDoc, stripWhitespace)

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

Сначала мы создадим функцию, которая преобразует аргумент в пространство:

toSpace ‹- content_transformer(функция(x, шаблон) gsub(шаблон", ", x))

#Замена -, “ и , пробелом

TextDoc ‹- tm_map(TextDoc, toSpace, ",")
TextDoc ‹- tm_map(TextDoc, toSpace, "\"")
TextDoc ‹- tm_map(TextDoc, toSpace, "-")

Последним шагом очистки является удаление стоп-слов.

Стоп-слова — это набор часто используемых слов на любом языке. Например, в английском языке «the», «is» и «and» легко можно было бы назвать стоп-словами. В приложениях НЛП и интеллектуального анализа текста стоп-слова используются для устранения неважных слов, что позволяет приложениям вместо этого сосредоточиться на важных словах.

Сначала я объявляю общий список стоп-слов, который всегда можно изменить после создания облака слов.

TextDoc ‹- tm_map(TextDoc, removeWords, c("что", "что", "и", "не", "когда", "было",))

#Построение матрицы терминов-документов
TextDoc_tdm ‹- TermDocumentMatrix(TextDoc)
dtm_m ‹- as.matrix(TextDoc_tdm)

# Сортировка по убыванию значения Freq
dtm_v ‹- sort(rowSums(dtm_m), уменьшение=TRUE)
dtm_d ‹- data.frame(word = name(dtm_v), freq=dtm_v)

#генерировать облако слов
set.seed(1234)
wordcloud(words = dtm_d$word, freq = dtm_d$freq, min.freq = 3,
max.words=100, случайный. order=FALSE, rot.per=0,40,
colors=brewer.pal(8, «BuPu»))

Подсказка: вы можете поиграть с количеством слов или даже с цветом облака слов, используя доступные палитры на RColorBrewer.

У этой конкретной группы людей, похоже, есть сожаления, связанные либо со школьными годами, либо с студенческой жизнью, либо с семьей. Я лично хотел бы, чтобы было больше доступного текста, чтобы дать нам более глубокое понимание мыслей людей. Но эй, лучше оставить свое прошлое в прошлом!

Чтобы выполнить анализ настроений, мы сначала должны перейти к классификации эмоций. Еще раз, я буду работать со всем набором данных, но было бы неплохо разделить его по полу, чтобы увидеть, какая из восьми эмоций доминирует между полами!

# Выполнение классификации эмоций
dset ‹- get_nrc_sentiment(dset$regret)
head(dset,10)
nrow(dset)
td ‹- data.frame(t(dset) ) #конвертируем в таблицу

#Вычисление сумм столбцов для каждой отдельной строки и каждого уровня
td_new ‹- data.frame(rowSums(td[1:71]))
#Очистка и преобразование данных
names(td_new)[ 1] ‹- «count»
td_new ‹- cbind («Настроение» = rownames(td_new), td_new)
rownames(td_new) ‹- NULL
td_new2‹- td_new[1:8 ,] #8 столбцов для 8 доступных эмоций.

Построение наших преобразованных данных:

#Plot One — количество слов, связанных с каждым настроением
quickplot(Sentiment, data=td_new2, weight=count, geom="bar", fill=Sentiment, ylab="count")+ggtitle("Сожаление о чувствах" )

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

Необязательный шаг — просмотреть эти эмоции, выраженные в процентах,

#Plot two — количество слов, связанных с каждым настроением, выраженное в процентах
barplot(
sort(colSums(prop.table(dset[, 1:8]))),
horiz = TRUE,
cex.names = 0,7,
las = 1,
main = «Эмоции в тексте», xlab = «Процент»
)

Эта гистограмма позволяет быстро и легко сравнить долю слов, связанных с каждой эмоцией в тексте. Эмоция «доверие» имеет самую длинную полосу и показывает, что слова, связанные с этой положительной эмоцией, составляют чуть более 25% всех значимых слов в этом тексте. С другой стороны, негативная эмоция «грусть» превышает чуть более 15% всех слов, сказанных участниками. Кажется, существует дисбаланс между положительными и отрицательными эмоциями в целом, причем первые берут на себя инициативу, что может помочь нам сделать вывод, что общий тон видео был более счастливым/светлым.

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

Я надеюсь, что этот проект не только дал вам уверенность в себе, чтобы погрузиться в ТА и НЛП, но и осознал, что почти все можно превратить в набор данных, с которым вы можете поиграть.

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

Ссылки

Барбара Маседа (2021) Текст как данные: поиск историй в текстовых коллекциях

Чанг, А. (2016, 11 января). Президент Обама — один из самых многословных ораторов в истории Союза. Вокс. www.vox.com/2016/1/11/10736570/obama-wordy-state-of-the-union

Элизабет Гюнтер и Торстен Квандт (2016) Количество слов и тематические модели, цифровая журналистика, 4:1, 75–88, DOI: 10.1080/21670811.2015.1093270

Сравнение выступлений Клинтон и Трампа на съездах с выступлениями их предшественников. (2016, 29 июля). Экономист. www.economist.com/graphic-detail/2016/07/29/how-clintons-and-trumps-convention-speeches-compared-to-the-of-their-predecessors

Джурафски, Д., и Мартин, Дж. Х. (2008). Обработка речи и языка. Пирсон.

Ларсон, Дж., и Шоу, А. (2012, 17 июля). Машина сообщений: Обратный инжиниринг кампании 2012 года. ProPublica. projects.propublica.org/emails/

Саиф Мохаммад (2022). Словарь ассоциации слов и эмоций NRC. http://saifmohammad.com/WebPages/NRC-Emotion-Lexicon.html