Использование современной модели для анализа настроений пользователей из магазина приложений.

В этой статье описаны необходимые шаги для выполнения анализа настроений в обзорах, сделанных общедоступным пользователем в магазине приложений. В этом руководстве я буду использовать модель Bert-Base Chinese вместо того, чтобы проверить производительность BERT при применении к языкам, отличным от английского. Шаги для анализа настроений остаются неизменными независимо от того, какую модель вы используете. Если вы не уверены, какую модель использовать, перейдите по следующей ссылке для получения дополнительной информации о предварительно обученной модели, предоставленной командой BERT. Если вы новичок в BERT, пожалуйста, ознакомьтесь с моим предыдущим руководством Задача множественной классификации с использованием BERT. В этом руководстве 5 разделов:

  1. Подготовка набора данных
  2. Обучение
  3. Прогноз
  4. Полученные результаты
  5. Вывод

1. Подготовка набора данных

Я буду использовать обзоры из Taptap, магазина игровых приложений для китайского рынка. Не стесняйтесь использовать свой собственный набор данных. Вы даже можете проверить это в обзорах в Google Play Store и iOS Apple Store. В этом случае убедитесь, что вы используете английскую модель для BERT. Давайте посмотрим на детали, которые мы можем получить из обзора в Taptap.

Здесь довольно много полезных данных:

  • Комментарий, оставленный пользователем
  • Рейтинг от 1 до 5
  • Считай за палец вверх
  • Подсчитайте палец вниз
  • Ответы других пользователей на этот комментарий

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

  1. Отрицательные: 1–3 ⭐
  2. Нейтральный: 4 ⭐
  3. Положительный: 5 ⭐

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

  1. Набор данных для поезда
  2. Набор данных оценки
  3. Набор тестовых данных

Давайте посмотрим на содержание данных для обучения и оценки. Оба они имеют одинаковую структуру.

  • Guid: идентификатор комментария.
  • Ярлык: мнение о комментарии. Маркировка основана на оценке пользователя.
  • Альфа: столбец "Выброс". Я просто залил его.
  • Текст: собственно комментарий пользователя.

Если у вас возникли проблемы с созданием фрейма данных выше, не стесняйтесь использовать следующий код (измените его соответствующим образом):

df_bert = pd.DataFrame({'guid': id_list,
    'label': label_list,
    'alpha': ['a']*len(count),
    'text': text_list})

Данные теста будут немного отличаться, поскольку они должны содержать только guid и текст.

Как только вы закончите, давайте сохраним его как файл tsv, используя следующий код (измените имя фрейма данных соответствующим образом):

df_bert_train.to_csv('data/train.tsv', sep='\t', index=False, header=False)
df_bert_dev.to_csv('data/dev.tsv', sep='\t', index=False, header=False)
df_bert_test.to_csv('data/test.tsv', sep='\t', index=False, header=True)

Обратите внимание, что файлы хранятся в папке data. Не стесняйтесь изменять его в зависимости от вашего варианта использования, но имена файлов должны быть следующими:

  • train.tsv
  • dev.tsv
  • test.tsv

Кроме того, данные test.tsv должны иметь заголовок, в отличие от train.tsv и dev.tsv. Установите для заголовка test.tsv значение True.

Когда вы закончите подготовку данных, перейдем к следующему разделу.

2. Обучение

Теперь мы приступим к обучению и настройке модели. Убедитесь, что вы клонировали репозиторий с официального сайта. Кроме того, у вас должны быть следующие файлы и папки, расположенные где-то внутри репозитория:

  • Каталог данных: каталог, в котором хранятся файлы train.tsv, dev.tsv и test.tsv.
  • Файл Vocab: файл Vocab.txt. Он идет вместе с моделью, которую вы скачали. Я создал новую папку модель и поместил в нее файл.
  • Файл конфигурации: файл config.json. Он также входит в комплект поставки модели. Точно так же я положил его в папку модель.
  • Исходная модель: модель, которая будет использоваться для обучения. Вы можете использовать предварительно обученную модель или продолжить работу с уже настроенной вами модели. Я храню его в папке модель
  • Выходной каталог: папка, в которую будет записана модель. Вы можете просто создать для него пустую папку.

Следующая часть - определить следующие переменные:

  • Максимальная длина последовательности: максимальная общая длина входной последовательности после токенизации WordPiece. Последовательности длиннее, чем это, будут усечены, а последовательности короче будут дополнены. По умолчанию 128, но в этом уроке я буду использовать 256.
  • Размер пакета обучения: общий размер пакета для обучения. По умолчанию - 32. В этом руководстве я буду использовать 8, так как я тренируюсь только на одной GeForce RTX 2080.
  • Скорость обучения: начальная скорость обучения Адама. По умолчанию 5e-5. Я установил значение 2e-5.
  • Num train epoch: общее количество тренировочных эпох, которое нужно выполнить. Я просто буду использовать значение по умолчанию 3.0.

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

nvidia-smi

Нам нужно изменить код в run_classifier.py, поскольку у нас есть 3 класса для этого варианта использования. Откройте файл python и найдите функцию get_labels () внутри класса ColaProcessor (DataProcessor). Измените его на следующее и сохраните:

def get_labels(self):
    """See base class."""
    return ["0", "1", "2"]

Когда вы закончите, активируйте виртуальную среду и измените каталог на корень репозитория. Введите в терминале следующую команду.

CUDA_VISIBLE_DEVICES=0 python run_classifier.py --task_name=cola --do_train=true --do_eval=true --data_dir=./data/ --vocab_file=./model/vocab.txt --bert_config_file=./model/bert_config.json --init_checkpoint=./model/bert_model.ckpt --max_seq_length=256 --train_batch_size=8 --learning_rate=2e-5 --num_train_epochs=3.0 --output_dir=./output/ --do_lower_case=False

Запустите его, и вы должны увидеть следующий результат:

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

Переходим к следующему шагу.

3. Прогноз

Модель будет создана в папке output. Пожалуйста, проверьте максимальное количество шагов, чтобы определить последнюю имеющуюся у вас модель. Если вы не уверены, какая модель является последней, откройте файл checkpoint, чтобы узнать. В моем случае у меня 37125 как последний шаг для модели.

В том же терминале запустите следующий код (убедитесь, что максимальная длина последовательности такая же, как та, которую вы использовали во время обучения):

CUDA_VISIBLE_DEVICES=0 python run_classifier.py --task_name=cola --do_predict=true --data_dir=./data/ --vocab_file=./model/vocab.txt --bert_config_file=./model/bert_config.json --init_checkpoint=./output/model.ckpt-37125 --max_seq_length=256 --output_dir=./output/

Код сгенерирует файл test_results.tsv в выходной папке. В моем случае я получил следующие результаты.

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

4. Результаты

Пришло время проанализировать результаты. Первая задача - загрузить test_results.tsv и преобразовать его в фрейм данных на основе наивысших предсказанных вероятностей. Прочтите файл со следующим кодом:

df_result = pd.read_csv('output/test_results.tsv', sep='\t', header=None)
df_result.head()

У вас должен быть фрейм данных для тестовых данных с тремя столбцами (я назвал его df_test_with_label):

  • гид
  • метка
  • текст

Создайте новый фрейм данных и сопоставьте результат с помощью idxmax.

df_predict = pd.DataFrame({'guid':df_test_with_label['guid'],
                            'label':df_result.idxmax(axis=1),
                            'text':df_test_with_label['text'],})
df_predict.head()

Импортировать

Как только вы закончите, давайте импортируем следующую функцию метрик из sklearn, чтобы рассчитать производительность нашей модели.

from sklearn.metrics import accuracy_score, precision_score, recall_score, confusion_matrix

Точность

Вы можете рассчитать точность модели следующим образом.

accuracy_score(df_test_with_label['label'], df_predict['label'])

В результате я получил 0.7033952594490711.

Отзывать

На основе склеарн Документация. Отзыв - это соотношение tp / (tp + fn), где tp - количество истинных положительных результатов, а fn - количество ложных отрицательных результатов. Отзыв - это интуитивно понятная способность классификатора находить все положительные образцы. Лучшее значение - 1, а худшее - 0. Также требуется параметр, называемый средним. Я устанавливаю его на макрос.

recall_score(df_test_with_label['label'], df_predict['label'], average='macro')

В результате выполнения кода на выходе получилось 0,6312777479889565.

Точность

Точность - это отношение tp / (tp + fp), где tp - количество истинных срабатываний, а fp - количество ложных срабатываний. Точность интуитивно представляет собой способность классификатора не маркировать отрицательный образец как положительный. Лучшее значение - 1, а худшее - 0. Аналогично, для среднего параметра установлено значение макрос.

precision_score(df_test_with_label['label'], df_predict['label'], average='macro')

Точность немного ниже, чем у отзыва, всего 0,6303571005505256.

Матрица путаницы

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

confusion_matrix(df_test_with_label['label'], df_predict['label'])

Получил следующий вывод.

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

5. Заключение

Поздравляем с завершением этого урока. Подведем итоги тому, что мы узнали сегодня.

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

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

Наконец, мы загрузили результаты в фрейм данных и проанализировали их, используя функции метрик из sklearn. Предоставленная информация позволяет нам определить эффективность нашей модели.

Спасибо за чтение и надеюсь, что вам понравился этот урок. Увидимся снова в следующей статье. Удачного дня! ❤️

Ссылка

  1. Https://towardsdatascience.com/beginners-guide-to-bert-for-multi-classification-task-92f5445c2d7c
  2. Https://github.com/google-research/bert
  3. Https://scikit-learn.org/stable/modules/classes.html#module-sklearn.metrics
  4. Https://www.taptap.com/