Классифицируйте текст с помощью предварительно обученных встраиваний и двунаправленных LSTM

Подготовка текстовых данных для машинного обучения немного отличается от подготовки табличных данных. Что отличает текстовые данные, так это то, что они в основном представлены в строковой форме. Следовательно, мы должны найти лучший способ представить это в числовой форме. В этой части мы увидим, как мы можем подготовить текстовые данные с помощью TensorFlow. В конце концов, мы построим двунаправленную модель долговременной краткосрочной памяти для классификации текстовых данных.

Импортируйте необходимые пакеты

Как всегда, мы начинаем с импорта пакетов и модулей, которые будем использовать в этом упражнении:

  • Tokenizer для предварительной обработки текстовых данных
  • pad_sequences для обеспечения того, чтобы окончательные текстовые данные имели одинаковую длину
  • sequential для инициализации слоев
  • Dense для создания полносвязной нейронной сети
  • LSTM используется для создания слоя LSTM
  • Bidirectional для обеспечения передачи информации в обоих направлениях
  • pandas для загрузки в текстовый файл
  • numpy преобразует данные в массивы NumPy

Загрузите данные

Давайте сначала импортируем набор данных. Данные и код доступны в этом репозитории.

Мы можем взглянуть на образец из набора данных. Это показывает нам, что у нас есть столбцы Review и Status.

Разделить данные

Затем мы разделяем набор данных на обучающий набор и набор для тестирования. Но прежде чем мы сможем это сделать, мы сначала должны определить функции X и цель y.

Давайте теперь используем 80% данных для обучения и 20% для тестирования.

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

На этом этапе нам нужно выполнить пару операций с текстовыми данными:

  • преобразовать его в нижний регистр
  • отфильтровывать знаки препинания, такие как ? и !
  • удалите любые специальные символы, такие как @ и $
  • преобразовать текст в предпочтительное числовое представление

Теперь, как мы увидим, выполнять эти операции в TensorFlow довольно просто.

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

  • vocab_size - это количество общих слов, которое мы хотим - максимальное количество слов, которые будут включены в индекс слова
  • oov_token - это элемент, который будет использоваться для обозначения слов, которых нет в нашем словаре; это возможно при установке токенизатора в набор для тестирования. Это представлено цифрой 1.
  • max_length - максимальная длина каждой последовательности
  • padding_type используется для заполнения нулей в начале или в конце последовательности.
  • trunction_type указывает, следует ли обрезать предложения длиннее, чем max_lenth в начале или в конце.

Теперь давайте токенизируем - преобразуем текст в числовое представление. Мы делаем это, создавая экземпляр tokenizer и вызывая fit_on_texts в обучающий набор. tokenizer удалит знаки препинания и специальные символы, а затем преобразует слова в нижний регистр.

Мы можем увидеть сопоставление слов и текста с помощью индекса слов.

Создать последовательности

Теперь давайте преобразуем предложения в токенизированные последовательности. Это делается с помощью функции texts_to_sequences.

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

Заполните последовательности

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

Теперь мы можем видеть, что в конце последовательностей есть нули, что делает их все одинаковой длины. Заполнение происходит в конце последовательности, потому что мы указали тип заполнения как post.

Теперь сделаем то же самое с набором для тестирования.

Подготовьте вложения перчаток

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

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

Мы начинаем с загрузки вложения GloVe и добавления их в словарь.

Затем нам нужно создать матрицу вложения для каждого слова в обучающем наборе. Это делается путем получения вектора внедрения для каждого слова из embedding_index.

Например, давайте посмотрим на вектор встраивания слова «внимание».

Слова, не найденные в индексе внедрения, будут иметь матричное представление со всеми нулями.

Встраиваемый слой

Теперь мы можем подготовить слой для встраивания:

  • Мы устанавливаем trainable на False, потому что мы используем предварительно обученные вложения слов.
  • Мы устанавливаем weights как embedding_matrix, который мы создали выше
  • len(word_index) + 1 - это размер словарного запаса. Мы добавляем один, потому что 0 никогда не используется - он зарезервирован для заполнения
  • input_length - длина входных последовательностей

Определите модель

Настал момент, которого мы все ждали. Мы определяем модель со слоем внедрения, который является первым слоем, за которым следуют два двунаправленных слоя LSTM. Двунаправленные уровни гарантируют, что модель обрабатывает последовательность от начала до конца, а также в обратном направлении. Это очень важно, особенно при работе с такими проблемами, как предсказание следующего слова в предложении, потому что контекст слов до и после определенного слова полезен при предсказании следующего слова.

После этого мы определяем плотный слой с 6 единицами и последний выходной слой.

Проверив сводку, мы видим, что два двунаправленных слоя показывают 32 единицы; однако мы определили 16. Это связано с тем, что информация перемещается вперед и назад, следовательно, единицы удваиваются. Мы также можем видеть наши необучаемые параметры из слоя внедрения.

Обучите модель

Теперь мы можем обучить и визуализировать работу модели.

Давайте визуализируем точность модели.

Мы видим, что точность обучения начинается примерно с 50% и постоянно увеличивается. Точность проверки начинается примерно с 60% и постепенно увеличивается, но устанавливается немного ниже точности обучения.

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

Последние мысли

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

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



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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее создавать лучшие модели машинного обучения.