Анализ тональности отзывов с использованием NLTK в Python

На основе исследования, проведенного исследователями Роджером Боном и Джеймсом Шортом из Калифорнийского университета в Сан-Диего, средний американец потребляет примерно 34 гигабайта данных каждый день (по состоянию на 2012 г.).

То есть… много данных. На момент написания статьи объем данных, потребляемых человеком, вероятно, был бы значительно больше.

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

Выдающийся тип данных — текстовые данные

Среди огромного объема данных в Интернете выделяется один тип данных — текст. Некоторые источники оценивают, что информация в Интернете на 80 % состоит из текста.

Действительно, независимо от процента текстовых данных в Интернете, никто из нас не может отрицать значимость этих текстовых данных.

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

В этой статье я расскажу о простом алгоритме анализа тональности для определения тональности текста с помощью библиотеки NLTK в Python.

Что такое анализ настроений? Что такое НЛТК? Читайте дальше, чтобы узнать!

Что такое НЛТК?

NLTK расшифровывается как Natural Language Toolkit, библиотека NLP (обработка естественного языка) на Python, которая позволяет нам анализировать текстовые данные и получать ценную информацию.

Некоторые функции NLTK включают в себя

  • Токенизация (т. е. разбиение предложений на список слов или разбиение абзацев на список предложений)
  • Основание (т. е. сокращение слова до его корневой формы. Заботливый, осторожный и небрежный относится к корневому слову «забота»)
  • Пометка частей речи (т.е. пометка каждого слова как существительного, местоимения, прилагательного, глагола и т. д.)
  • …и более!

Эта мощная библиотека позволяет нам анализировать наши текстовые данные и определять тональность текстов.

Что такое анализ настроений?

Иногда называемый анализом мнений, анализ настроений относится к выявлению эмоций, выраженных в тексте.

Пример

"Я очень счастлив" — это положительное предложение, поэтому оно идентифицируется как положительное.
"Эта камера так плохо, что заставило меня плакать»является отрицательным предложением, и, таким образом, оно идентифицируется как отрицательное.

Наше рабочее пространство — Jupyter Lab

Чтобы продемонстрировать примеры определенных методов в библиотеке NLTK, я буду использовать JupyterLab в качестве основного рабочего пространства.

JupyterLab – это веб-приложение, которое позволяет нам просматривать интерактивные результаты на основе нашего кода Python. Его также часто используют специалисты по данным и инженеры по машинному обучению.

Наш источник текстовых данных — обзор устройства Amazon Kindle

Наша цель в этом проекте - определить тональность различных текстов.

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

kindle_reviews.txt

Как люди, мы можем довольно четко определить, что первый отзыв отрицательный, а второй положительный.

Первый отзыв — The warranty and support is really bad: однозначно отрицательный
Второй отзыв — I highly recommend this...: однозначно положительный.

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

Наш алгоритм анализа настроений

Для нашего алгоритма анализа настроений мы создадим следующий рабочий процесс:

  1. Прочтите исходный файл и извлеките отдельные отзывы
  2. Для каждого отзыва мы будем размечать абзац в словесные токены, используя nltk.word_tokenize().
  3. Для каждого слова в обзоре мы будем определять часть речи (например, существительное, глагол, прилагательное и т. д.), связанную с ним, с помощью ntlk.pos_tag().
  4. Получив список слов вместе с соответствующими им частями речи, мы извлечем все прилагательные в список прилагательных слов.
  5. Затем мы пройдемся по каждому прилагательному в списке прилагательных слов и определим, является ли это прилагательное положительным или отрицательным, на основе наших файлов positive.txt и negative.txt, которые содержат список положительных и отрицательных слов.
    Если прилагательное положительное, мы добавит 1 к оценке тональности отзыва.
    Если прилагательное отрицательное, мы вычтем 1 из оценки тональности отзыва.
  6. Если итоговая оценка положительная, можно смело считать, что отзыв положительный. Кроме того, чем выше оценка, тем больше положительных эмоций. В противном случае отзыв может считаться нейтральным (если оценка равна 0) или негативным (если оценка отрицательная).

Смущенный? Не волнуйтесь, я буду объяснять каждый блок кода для создания этого алгоритма, так что продолжайте!

Примечание*. Исходный код этого проекта также доступен на GitHub: https://github.com/cyberjj999/kindle_reviews_sentiment_analysis

Без лишних слов, давайте сразу приступим к кодированию!

Шаг 1. Прочитайте исходный файл и извлеките отдельные обзоры.

Первый шаг — извлечь наши отдельные отзывы из файла kindle_reviews.txt, содержащего отзывы, которые я подготовил заранее.

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

Здесь мы открываем файл, содержащий отзывы, и извлекаем каждый отзыв как элемент списка, разделяя его разделителем \n\n.

Доступ к последнему элементу списка с помощью review_list[-1] показывает нам последний отзыв.

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

Шаг 2. Для каждого отзыва мы будем разбивать абзац на токены слов, используя nltk.word_tokenize().

Здесь мы токенизируем каждый отзыв (то есть абзац текста) в список слов, используя метод nltk.word_tokenize().

Имея список слов, мы можем приступить к идентификации части речи.

Примечание*. Метод word_tokenize() в nltk не так прост, как метод string.split() в Python. Из анализа исходного кода метода видно, что в процессе токенизации реализованы различные алгоритмы регулярных выражений.

Шаг 3. Для каждого слова в обзорах мы будем определять часть речи, связанную с ним, используя ntlk.pos_tag()

Чтобы определить части речи, мы можем передать наш список слов в качестве аргумента в метод nltk.pos_tag() и указать параметр tagset='universal'

Целью tagset='universal' является упрощение разделения частей речи на общие категории, такие как глаголы, существительные, прилагательные и т. д.. Без использования универсального набора тегов будут очень специфические теги и множество вариантов глаголов, существительных, прилагательных и т. д.

Результатом является список tuple, в котором первый элемент хранит слово, а второй элемент хранит значение части речи, т. е. ('reading', 'VERB')

Шаг 4. Получив список слов вместе с их частями речи, мы извлечем все прилагательные в список прилагательных слов.

Этот шаг требует некоторых базовых знаний Python для работы с list и tuple .

Мы можем сделать простое понимание списка, чтобы отфильтровать pos_list и извлечь только прилагательные, то есть те, которые помечены как "ADJ".

adj_list = [word[0] for word in pos_list if word[1] == 'ADJ']

Этот код перебирает pos_list и извлекает первый элемент (исходное слово), если второй элемент (значение части речи) равен ADJ (прилагательное).

Большой! Теперь у нас есть список прилагательных. Следующий шаг прост.

Шаг 5. Мы пройдемся по каждому прилагательному в списке прилагательных слов и определим, является ли это прилагательное положительным или отрицательным, на основе наших файлов Positive.txt и Negative.txt, которые содержат список положительных и отрицательных слов.

Мы можем сначала извлечь все положительные и отрицательные слова из текстового файла и сохранить их в списках.

Вы можете заметить, что некоторые слова написаны с ошибками, например, "доступный". Это не ошибка, так как интернет-обзоры часто полны опечаток/орфографических ошибок. В этом списке будут учтены слова с частыми ошибками, что позволит сделать наш анализ более точным.

Затем мы рассчитаем нашу оценку тональности, сравнив наш список прилагательных со списками положительных и отрицательных слов.

Если прилагательное положительное, мы добавим 1 к оценке тональности отзыва.
Если прилагательное отрицательное, мы вычтем 1 из оценки тональности отзыва.

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

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

Здесь вы можете видеть, что окончательная рассчитанная оценка тональности равна 4.

Шаг 6. Если итоговая оценка положительная, можно смело считать отзыв положительным. Кроме того, чем выше оценка, тем больше положительных эмоций.

Используя эту логику, мы видим, что настроение нашего обзора положительное — с желаемой оценкой 4!

Давайте еще раз посмотрим на обзор.

"I've been reading with an e-reader for years. Mostly a Kobo. Also have the Kobo Forma, great e-reader. But I was always curious about the Kindle. Now ordered the Kindle with Amazon.nl and I'm very happy with it! Nice small size. Fits almost in my pocket. Fantastic dictionaries and great ease of reading. I can see that there are years of experience with e-readers behind this. Super purchase."

great , happy , Fantastic , super — кажется, у нас много положительных слов!

Точный? Определенно похоже!

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

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

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

Это показывает, что хороший анализ тональности не так прост, как подсчет количества положительных и отрицательных прилагательных. и как будет много случаев, когда этот алгоритм не будет работать желательно.

Улучшения алгоритма

Есть много алгоритмов, которые мы можем изучить, чтобы еще больше усовершенствовать наш текущий алгоритм анализа тональности.

Одним из улучшений является использование bigrams или trigrams (то есть последовательных соседних слов) для более точного расчета оценки тональности.

Рассмотрим следующее

“This device is not good at all. I heard from my friend that it was great, but it is really not very impressive.”

Мы, вероятно, можем выделить здесь 3 положительных слова — «хорошо», «отлично» и «впечатляет». Однако видно, что отзыв отрицательный.

Чтобы улучшить наш алгоритм, мы можем учитывать слова перед положительным/отрицательным словом. "NOT good" = <negative> * <positive> = <negative> и поэтому его следует идентифицировать как отрицательный. "NOT bad" = <negative> * <negative> = <positive> и, таким образом, это должно быть определено как положительное.

Используя bigrams и trigrams, мы могли бы сделать алгоритм намного более надежным.

Заключительные мысли

И… это обертка! Спасибо, что прочитали мою статью об анализе настроений с помощью NLTK в Python! Надеюсь, вы сделали несколько ценных выводов и узнали что-то новое.

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

Понимание языка — это не только искусство, но и наука, и я надеюсь на продвижение НЛП (обработка естественного языка) в ближайшие годы!

Нежное напоминание — вы можете получить доступ к полному исходному коду этого проекта здесь:https://github.com/cyberjj999/kindle_reviews_sentiment_analysis

Продолжайте качаться и наслаждайтесь обучением! До скорого!