1. Предпосылки

Вы можете подумать, что представление на уровне слов - лучшая эффективная функция для задачи классификации тональности. * НО это правда? Я покажу интересный результат моего эксперимента, который вас удивит.

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

Остальная часть этой статьи организована следующим образом.

  • Методы встраивания, используемые при анализе настроений, работают в ACL 2018.
  • Обсуждение того, почему встраивание на уровне слов так широко используется для анализа тональности.
  • Настройка эксперимента и результаты

Вы можете найти весь код здесь: настроение-сравнение

2. Встраивание методов анализа настроений в ACL 2018

Ассоциация компьютерной лингвистики (ACL) - очень известная конференция по НЛП. Если вы взглянули на работы, связанные с анализом настроений, в ACL 2018, вы можете заметить, что в большинстве работ были выбраны методы встраивания на уровне слов.

Доказано, что методы встраивания слов являются мощным средством решения задач НЛП. Но кроме встраивания слов, есть еще два метода встраивания: встраивание на уровне символа и вложение на уровне подслова.

Я рассчитываю длинные и короткие статьи ACL 2018 по задаче анализа настроений. Это показывает, что вложение на уровне слов широко используется для анализа тональности.

Всего 12 длинных статей и 5 коротких статей, в названии которых есть ключевое слово «настроение». Согласно нашему исследованию, существует 15 статей, основанных на встраивании на уровне слов, и 1 статья, основанная на встраивании на уровне символов, и 1 статья, объединяющая встраивание на уровне символов и слов.

Я перечисляю все статьи ниже с категориями уровней. SP означает короткую статью.

А. Уровень слов:

Word2Vec

  • Определение передаваемой информации между доменами для междоменной классификации настроений
  • SemAxis: облегченная структура для характеристики предметно-ориентированной семантики слов помимо сантиментов
  • Адаптивные сквозные диалоговые системы по тональности
  • Двуязычные вложения настроений: совместное проецирование настроений на разных языках
  • (SP) Использование знаний о документах для классификации мнений на уровне аспектов
  • (SP) Моделирование настроений в дискурсе для распознавания юмора

Перчатка

  • Рука помощи: перенос обучения для глубокого анализа настроений
  • Внимательный пользователь и внимание к продукту для классификации настроений
  • Чувствительные к цели сети памяти для классификации настроений аспектов.
  • Сети трансформации для целевой классификации настроений
  • Междоменная классификация настроений с информацией, специфичной для целевого домена
  • Аспектно-ориентированный анализ тональности с помощью сверточных сетей с закрытыми воротами

Объединить Word2Vec, GloVe

  • (SP) Адаптированные к домену вложения слов для улучшенной классификации тональности

Изучите информацию о настроениях на уровне слов

  • Изучение встраивания слов с учетом доменов и мнений

Модель без предварительной подготовки (случайная генерация)

  • Непарный перевод настроения в настроение: подход к циклическому обучению с подкреплением

Б. Уровень персонажа

  • (SP) Предварительное обучение классификаторов настроений с помощью диалоговых данных без меток

С. Комбинируйте уровень персонажа и уровень слова

  • (SP) Сеть с расширенным вниманием к ресурсам с несколькими тонами для классификации настроений

3. Почему вложение на уровне слов так популярно для анализа тональности?

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

Мы знаем, что самым большим преимуществом представления на уровне символов и представления на уровне подслов является решение проблем вне словарного запаса (OOV). Означает ли это, что слова OOV не важны для задач анализа тональности?

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

Что касается представления на уровне персонажа, даже если оно решает проблему OOV, мы вряд ли можем сказать, что легко извлечь тональности из текстов. Например, мы можем представить 'happy' как 'h', 'a', 'p', 'p', 'y'. Тональное слово разбито на символы, и становится все труднее извлекать эмоциональные характеристики из такого рода контекстов. Потому что одним персонажем сложно передать сентиментальную информацию.

Как насчет представления на уровне подслов? Мы можем представить 'happy' на уровне подслова как 'hap', 'py', это похоже на представление на уровне символов, которое не содержит большого значения. Но если мы обработаем некоторый набор данных с большим количеством неизвестных слов, это может быть другая история. Учитывая эти слова 'coooool' и «woooooow». Они будут удалены во время предварительной обработки в представлении на уровне слов, даже если мы знаем, что эти слова содержат сильную эмоциональную информацию. С другой стороны, если мы представим эти слова на уровне подслов 'co', 'ooo', 'ol' и 'wo', 'oooo', 'ow', представление на уровне подслов может захватить эмоциональную информацию из 'oooo'. Эти неформальные слова очень часто встречаются в коротких текстовых сообщениях из текстов социальных сетей, таких как Twitter и Reddit.

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

4. Сравнение экспериментов.

Мы выбираем два набора данных для сравнения. Для каждого набора данных мы выбираем три уровня представления. Для каждого уровня мы реализуем две модели глубокого обучения, CNN и LSTM.

  • Два набора данных: обзор фильма, Twitter.
  • Три уровня представления: слово, символ, подслово
  • Две модели глубокого обучения: CNN, LSTM

4.1 Настройка эксперимента

4.1.1 Набор данных

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

Использование LSTM для обучения всего набора данных Twitter займет слишком много времени (одна эпоха 9 часов!), Поэтому мы берем 50 000 выборок в качестве небольшого набора данных для сравнения CNN / LSTM и обучения CNN на всем наборе данных.

4.1.2 Методы встраивания

Для каждого набора данных мы проведем эксперименты на трех уровнях встраивания: слово / символ / подслово.

A. Встраивание на уровне слов

На этом уровне мы берем предварительно обученные вложения слов (вложения GloVe) в качестве вектора слов. Предварительная обработка данных на уровне слов очень проста. Сначала мы загружаем и очищаем данные с помощью _10 _ (исходный код), а затем токенизируем и дополняем тексты функциями keras. После того, как мы знаем максимальную длину, мы устанавливаем maxlen как 56 в процессе заполнения.

Блокнот Jupyter: фильм-препроцесс на уровне слов

Что касается предварительной обработки набора данных Twitter, очистка состоит из дополнительных шагов.

  • Декодирование HTML
  • Удалить упоминание @
  • Удалить URL-ссылку
  • Спецификация Latin 1 (знак порядка байтов), замените символы подписи  на ?
  • Удалить хэштег и числа

Мы сохраняем очищенный набор данных как clean_tweet.csv

Сначала я намеревался использовать исправление орфографии для предварительной обработки текста, но результат алгоритма исправления орфографии кажется недостаточно хорошим, поэтому я не использовал исправление орфографии. Если вы знакомы с исправлением орфографии, TextBlob реализует алгоритм исправления орфографии, о котором я упоминал выше. Вы можете найти результат исправления орфографии в блокноте ниже.

Блокнот Jupyter: word-level-preprocess-twitter

Б. Встраивание на уровне персонажа

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

Всего у нас 70 персонажей:

abcdefghijklmnopqrstuvwxyz0123456789,;.!?: ’\” / \\ | _ @ # $% ^ & * ~ `+ - =‹ ›() [] {}

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

Если вы не знакомы с горячим кодированием, вот отличная статья для вас. Как одним способом закодировать данные последовательности в Python.

Второй метод - мы генерируем случайное значение как вектор для каждого символа. При инициализации слоя внедрения мы не передаем embedding_weights параметру weights.

Третий метод - мы используем встраивание предварительно обученных символов. Здесь я использую встраивание слов GloVe для встраивания символов. В этом нам может помочь скрипт create_embeddings.py. Тогда мы получим файл, содержащий вложение символа. При инициализации слоя внедрения мы вручную устанавливаем символ пробела со средним значением других внедренных символов и устанавливаем неизвестный символ со случайными значениями.

Я использую эти три способа для набора данных обзора фильмов с моделью CNN. Результат показывает, что метод случайной инициализации имеет наилучшую производительность. Поэтому я использую случайную инициализацию для всех экспериментов на уровне персонажей.

Вы можете найти три метода встраивания в этом каталоге.

Блокнот Jupyter: предварительный процесс-фильм на уровне символов

Что касается набора данных Twitter в представлении на уровне символов, предварительная обработка проще, чем набор данных обзора фильма. Представление на уровне символов может обрабатывать неизвестные слова и неформальные слова. Таким образом, нет необходимости убирать знаки препинания и исправлять орфографию.

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

Блокнот Jupyter: char-level-preprocess-twitter

В. Встраивание на уровне подслова

Что касается предварительной обработки на уровне подслов, мы загружаем словарь и предварительно обученные схемы встраивания подслов из BPEmb. Я выбираю merge ops как 25000 и 50 dims. Вот простой скрипт для разделения предложения на представление уровня подслова, bpe.py

Записная книжка Jupyter:

4.1.3 Модели глубокого обучения

Для каждого уровня мы берем две модели глубокого обучения. Один из них - CNN, мы реализуем модифицированную версию CNN Кима Сверточные нейронные сети для классификации предложений. Вы можете проверить мою реализацию здесь, cnn-text-classification.

Ниже перечислены гиперпараметры модифицированной версии.

Установка измененного размера встраивания 50 Размер фильтра (3, 8) Номер фильтра 10 Объединение в пул Максимальное объединение в пул

Вторая модель - LSTM, складываем два слоя LSTM.

4.2 Результаты эксперимента

Резюмируем результат в таблице ниже.

4.3 Наблюдения и анализ

Есть несколько наблюдений за различными комбинациями классификации настроений.

  • Представление на уровне подслова имеет лучшую производительность, чем представление на уровне слов в наборе данных Twitter. То же самое и с нашей гипотезой. Если набор данных содержит несколько неформальных слов и хорошо предварительно обрабатывается, встраивание на уровне слов действительно обеспечивает лучшую производительность при классификации тональности. Но если набор данных содержит слишком много неформальных слов, встраивание на уровне подслов может дать лучший результат, чем встраивание на уровне слов.
  • CNN лучше, чем LSTM. В небольшом наборе данных Twitter наилучшая производительность достигается при представлении на уровне подслов. Несмотря на то, что оценки точности CNN и LSTM довольно близки, учитывая, что скорость обучения CNN очень высокая, нет сомнений в том, что CNN - лучший выбор, чем LSTM.
  • Представление на уровне символов имеет самую низкую точность среди трех уровней представления. Причина может быть в том, что встраивание символов не имеет хороших предварительно обученных векторов символов. CNN / LSTM сложно уловить информацию о настроениях только на уровне персонажа.

5. Резюме

В этот раз я не стал уделять слишком много времени настройке гиперпараметров. А модель LSTM может быть слишком простой. Но этот эксперимент по-прежнему показывает, что представление на уровне подслов полезно для классификации тональности, особенно для неформальных текстов. Таким образом, для классификации анализа тональности вложение подслова является хорошим выбором для нас.

Вы можете найти весь код здесь: настроение-сравнение

Просмотрите другие мои сообщения на Medium с категориальным представлением!
GitHub: BrambleXu
LinkedIn: Xu Liang
Блог: BrambleXu