Текстовый анализ тональности с помощью машин опорных векторов. Часть 2. Предварительная обработка и векторизация данных

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

Это серия из трех частей, и сейчас вы читаете первую. С учебным планом вы можете ознакомиться ниже:

  1. Часть 1 — знакомит читателя с концепцией анализа настроений и машин опорных векторов.
  2. Часть 2. Объясняет конвейер предварительной обработки данных, необходимый перед обучением классификатора.
  3. Часть 3 — описывает этапы реализации и представляет фактические результаты.

Предварительная обработка

Предварительная обработка — одна из самых фундаментальных частей потока Data Science. После сбора данных мы должны их очистить. Очистка набора данных, вероятно, является самой трудоемкой задачей во всем потоке, поскольку требует тщательных действий, которые преобразуют данные из их исходного формата в формат, который мы можем правильно использовать. Если этот шаг выполнен плохо, то есть данные не были предварительно обработаны должным образом или о крайних случаях и выбросах не позаботились, никакая модель нас не спасет. Если наша база, то есть наши данные, — мусор, то и наш конечный результат тоже будет мусором. Как говорится, мусор на входе, мусор на выходе.

Текст

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

Мешок слов

Как же это делается? Есть много различных способов сделать это. Один из самых основных называется «Мешок слов». В этом сценарии мы создаем словарь, в котором мы храним уникальные слова, которые появляются в нашем наборе данных. Каждому из этих слов сопоставляется определенный индекс в одномерном векторе, длина которого равна количеству слов в словаре. Это легко понять на простом примере. Предположим, что наш набор данных состоит из следующих двух предложений:

я люблю гироскопы

мне очень нравится киноа

Если мы подсчитаем уникальные слова, мы можем построить следующий список:

[«Я», «люблю», «действительно», «нравится», «гирос», «квиноа»]

Так «Я» отображается на самый первый элемент (индекс 0), слово «любовь» соответствует второму элементу (индекс 1) и так далее и тому подобное. Основываясь на этом, мы можем преобразовать предложения в числовые списки, поставив 1 в индексах, которые указывают на то, что в предложении есть эти конкретные слова, и 0, чтобы обозначить прямо противоположное. Имея это в виду, предложения могут быть преобразованы в:

[1, 1, 0, 0, 1, 0]

[1, 0, 1, 1, 0, 1]

Даже этот наивный способ перехода от текстов к числам может оказаться очень полезным во многих задачах НЛП. Однако есть более надежные и мощные методы.

Частота термина — обратная частота документа

Частота термина — обратная частота документа, или сокращенно TF-IDF, — это еще один метод кодирования текста в числа. Он основан на расчете двух отдельных показателей. Первый — это Частота термина, который измеряет частоту термина в контексте одного документа.

Например, рассмотрим следующее предложение:

«Я пошел в магазин, увидел свежие фрукты и купил их».

Если мы посчитаем «TF» для слова «store», мы получим 1/15, так как общее количество терминов в предложении равно 15. Слово «I» имеет TF 3/15, что означает, что оно тройное. так же часто, как слово «магазин». Чем больше TF, тем больше ценной информации. Однако верно ли это для слова «я»?

Вторая метрика — это обратная частота документа. Чтобы лучше понять это, давайте кратко рассмотрим, что такое частота документов.

По существу, он выражает долю документов, содержащих данное слово. Итак, обратное этому:

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

Этот процесс можно рассматривать как механизм извлечения признаков, когда мы пытаемся извлечь полезную информацию о каждом термине. TF-IDF также требует дополнительной настройки, которую следует правильно настроить, чтобы получить от нее максимум. Один из этих параметров известен как «максимальные функции», который учитывает только первые «n» функций, упорядоченных по частоте терминов во всем наборе данных. Мы рассмотрим это через некоторое время.

Трубопровод

Теперь мы знаем несколько способов кодирования нашего текста. Должно быть ясно, что TF-IDF работает с «терминами», что означает «слова». Прежде чем мы применим его, нам нужно разделить наши предложения и получить эти «слова». В области НЛП мы называем эти «токены», и этот процесс называется «Токенизация». Токенизация — это само по себе искусство, поэтому мы не будем больше ничего обсуждать, кроме того, что она просто разбивает предложения на токены. Кроме того, мы обычно конвертируем текст в формат нижнего регистра, чтобы избежать дублирования. По сути, это первые 2 шага конвейера предварительной обработки, который мы будем использовать. С помощью термина конвейер мы описываем предопределенный поток, содержащий дискретные шаги, где каждый шаг получает в качестве входных данных выходные данные предыдущего шага.

Наш конвейер начинает с преобразования текста в нижний регистр, а затем передает вывод в токенизатор. После завершения токенизации следующим шагом будет удаление «стоп-слов». Стоп-слова — это слова, которые имеют незначительное значение и, таким образом, отфильтровываются для уменьшения сложности задачи. Наиболее популярными являются такие слова, как «a», «the», «is» и «are».

Четвертый шаг направлен на то, чтобы еще больше сократить наш словарь, сохранив только «лемму» каждого слова. Слово «есть» является изменённой формой основного слова «есть». То же самое касается слов «съел» и «ест», где все они заменены словом «есть». В итоге наш пайплайн выглядит так:

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

В нашем словаре 40 813 слов, а это значит, что если мы используем TF-IDF, каждое слово будет иметь 40 813 признаков. С точки зрения памяти, это чрезвычайно сложно. Один из способов обойти это — использовать вышеупомянутый параметр «max_features», чтобы ограничить количество функций. В нашем случае мы можем обнаружить, что всего 3034 слова встречаются не менее 10 раз. Установив «max_features» на 3034, мы можем получить более жизнеспособное кодирование как с точки зрения памяти, так и с точки зрения вычислений.

Для стоп-слов, токенизации и лемматизации мы использовали библиотеку nltk, а для TF-IDF — scikit-learn. Конвейер в Python показан ниже:

Краткое содержание

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