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

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

Для этого я разделю эту статью на четыре части следующим образом:

  1. Обзор Yelp DataSet (ссылка)
  2. Словарь и векторизатор (данная статья касается этой части)
  3. Распорядок дня
  4. Оценка и вывод

Заранее благодарим за вашу поддержку. Если вы решите зарегистрироваться на Medium, вот моя страница подписки: https://abdelkader-rhouati.medium.com/membership

Часть 2. Словарь и векторизатор

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

Пополнение словарного запаса

В этом примере мы будем использовать биекцию между токенами и целыми числами, что означает наличие двух переменных словаря. Двумя основными функциями класса Vocabulary являются lookup_tooken() и lookup_index(), для извлечения соответственно индекса для данного токена и токена, соответствующего данному индексу.

Помимо обработки этой биекции, класс Vocabulary позволяет добавлять новый токен, автоматически увеличивая его индекс: функция add_token().

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

Содержание класса словаря:

Векторизация текста

Класс Vectorizer инкапсулирует функции Vocabulary. Таким образом, он предлагает механизм с помощью функции from_dataframe() для создания персонализированного словаря на основе определенного набора данных (как правило, корпус соответствует обучающему набору данных). Эта функция перебирает строки Pandas DataFrame, чтобы, во-первых, подсчитать частоту каждого токена, присутствующего в наборе данных, а во-вторых, создать словарь (список пар токенов и индексов). Одна из хороших практик — ограничить словарный запас, игнорируя менее часто встречающиеся токены. это делается путем определения параметра cutoff.

В дополнение к созданию словаря функция Vectorize() возвращает векторизованное представление введенного текста (= вектор числовых значений). В этой работе мы используем свернутое однократное представление. Это представление создает двоичный вектор, длина которого равна размеру Vocabulary. двоичный вектор имеет 1 в местах, соответствующих Word в тексте. Это имеет ограничения, связанные с порядком слов в тексте, который не обрабатывается, и тем фактом, что токены, появляющиеся несколько раз, учитываются только один раз.

Содержимое класса Vectorizer:

Использование DataLoader для создания мини-пакетов.

Завершающим этапом является группировка векторизованных данных в мини-пакеты. Это жизненно важная часть обучения нейронных сетей. Для этого Pytorch предоставляет встроенный класс DataLoaer ([2] для более подробной информации).

Функция генерации мини-пакетов:

Ссылки:

  1. Книга Обработка естественного языка с помощью Pytorch (https://www.amazon.fr/Natural-Language-Processing-Pytorch-Applications/dp/1491978236)
  2. https://pytorch.org/tutorials/beginner/basics/data_tutorial.html?highlight=dataloader