Введение

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

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

Например, «Сегодня так много тестовyy, я ни в чем не уверен». Это твит, и ему соответствует «Отрицательное». Таким образом, драйвер настроения для этого твита - «Я не уверен», поскольку этот раздел в основном играет роль для негативных настроений.

Описание постановки задачи:

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

Пунктуация и специальные символы также являются частью скрытого смысла в твиттере. Так что при извлечении мы собираемся сохранить и их. Например, есть твит типа «С днем ​​рождения! Только что проснулся на этой стороне Земли, поэтому желания немного запаздывают », и соответствующее настроение -« Положительное ». Здесь извлеченный драйвер настроения для этого твита должен быть «Happy b-day!». Видно, что восклицательный знак (!) здесь тоже является частью положительного отношения, поэтому его также следует сохранить.

Набор данных и описания

Здесь мы собираемся использовать kaggle-dateset для нашего моделирования. У тренировочных данных есть твиты, соответствующие настроения и драйвер настроений. В наборе тестов только твиты и соответствующие настроения.

Вот фрагмент набора поездов:

Вот фрагмент тестового набора:

Используемые библиотеки:

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

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

Вот результат после выполнения приведенного выше фрагмента:

3. Следующая часть - токенизация текстов (твитов). Поскольку специальные символы и пунктуация также важны, мы будем использовать Tweet-Tokenizer для токенизации текстов. Для перспективы маркировки мы установим «O» для частей, которые находятся за пределами выделенного текста, и «Y» для тех, которые находятся внутри выделенного текста в твите. Вот фрагмент кода:

4. Модели машинного обучения работают только с числовыми данными. Итак, мы преобразуем эти токены в числовые значения. Для этого мы перечислим уникальные слова, используемые во всем корпусе. Вот фрагмент:

5. Мы добавим слово «НАБИВКА» в этот набор слов, поскольку оно будет использоваться в следующей части моделирования.

6. Теперь нам нужен тег label для обучения. Итак, здесь мы разделили твит на три части: «начало», «выделенный текст» и «окончание». В соответствии с этим у нас есть «Y» для выделенного текста и «O» для остальных двух. Ключевым моментом здесь является добавление еще одной метки для заполнения, поскольку мы будем дополнять предложения, чтобы получить ту же длину. Чтобы преодолеть отступы, мы добавим «PAD» в качестве метки и создадим словарь для уникальных слов и уникальных меток. Вот фрагмент кода:

7. Следующая часть - дополнить предложения, чтобы получить ту же длину, которая требуется для модели машинного обучения. Нам нужна максимальная длина всего корпуса. Для заполнения текстового корпуса мы добавим значение максимальный индекс + 1 в словарь уникальных слов. Аналогично для заполнения меток мы будем использовать «PAD», созданный на предыдущем шаге. Вот фрагмент максимальной длины и заполнения:

8. На данный момент мы закончили с частью предварительной обработки текста и выделенного текста (драйвер). Теперь переместите один к части настроений, которая также войдет в тренировку в качестве входных данных. Итак, у нас есть столбец для настроений, в котором есть три уникальных значения: 1. положительное, 2. отрицательное, 3. естественное. вот фрагмент для преобразования их в числовой формат:

9. Мы преобразовали текст и метки в формат ввода, совместимый с моделями машинного обучения. Поскольку в данных тональности и метки (тега) всего три уникальных значения, мы преобразуем их в один вектор с горячим кодированием. вот фрагмент и формы для ввода и меток:

Моделирование глубокого обучения:

Теперь у нас есть два входа X и X1 для твита (текста) и настроения, а также соответствующая метка для выделенного текста (драйвер). Что касается каждого токена в тексте, у нас есть метка, например, если слово является частью выделенного текста, метка - «Y», иначе «O». Для заполнения есть дополнительная метка «PAD».

Логика моделирования:

Если посмотреть на эту проблему, это своего рода проблема seq2seq. Последовательные модели RNN дают лучшие результаты в этом сценарии. У нас есть один входной плотный вектор (shape = (3,)) для тональности независимо от отметки времени и другой вход (shape = (66,)) для твита, который представляет собой последовательность по времени. Таким образом, ключевым моментом в этом виде моделирования является распределение плотного вектора по заданным временным меткам. Здесь мы будем использовать повторяющийся вектор, чтобы преобразовать плотный вектор в плотный вектор, распределенный во времени. Пользовательское встраивание слов было использовано для получения непрерывного вектора для каждого слова и корреляции между ними.

Вложение слов:

Встраивание слов Word2Vec можно использовать для преобразования каждого токена индекса в соответствующий векторный формат. Каждое слово отображается с векторным представлением его семантики и контекста, например, слова, содержащие одну и ту же семантику, имеют наименьшее косинусное расстояние друг от друга. Вот вид:

Условное случайное поле:

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

Есть два входа, которые будут импортированы в модель.

  1. input1: один вектор горячего кодирования для значения тональности
  2. input2: последовательность максимальной длины (здесь 66)

Встраивание слоев применимо только к последовательностям слов. Таким образом, input2 будет сопоставлен с внедрением Word2Vec перед переходом к слоям Bidirectional-LSTM. Примечательным моментом здесь является сохранение mask_zero = False, поскольку мы уже добавили в последовательность слово «PADDING», и мы также импортировали для него метку «PAD». Вот архитектура решения:

вот сводка параметров:

Мы использовали оптимизатор «Adam» для сходимости потерь. Выходной слой закодирован в CRF, поэтому мы использовали потерю CRF в качестве функции потерь. Для обучения мы использовали размер пакета 128, а набор для проверки составляет 10% от общих данных обучения.

Вот фрагмент:

После старта тренировки мы видим здесь потери и точность. вот фрагмент после 5 эпох обучения:

Можно сохранить модель и пройти визуализацию обученной модели:

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

Здесь мы можем увидеть предсказанную и обоснованную истину для этого примера. Is предсказал довольно близкое к истине значение:

Дальнейшее улучшение для устойчивости модели:

  1. Мы можем использовать слои BERT в начале слоев LSTM, чтобы лучше понять контекст и значение предложения.
  2. Для повышения точности можно настроить гиперпараметры, такие как количество слоев, количество нейронов в каждом из слоев и оптимизаторы.
  3. Мы также можем использовать некоторые методы регуляризации, чтобы предотвратить чрезмерную подгонку модели, поскольку мы видим, что точность обучения составляет 98,89%, а точность проверки составляет 95,91%. Например, мы можем добавить скорость kernel_decay, комбинацию регуляризатора L1 и L2 и добавить слои Dropout. Одним из ключевых моментов здесь является то, что как только мы применим эти регуляризаторы, нам придется увеличить больше уровней LSTM, чтобы модель не могла привести к недостаточной подгонке.

Спасибо!