Время прочтения: 3 мин.

ruGPT-3 – крупнейшая нейросеть для русского языка. Модель представлена Sberdevices в ноябре 2020 года. ruGPT-3 демонстрирует state-of-the-art возможности для русского языка и умеет продолжать любой текст. Размер модели от 125 млн до 13 млрд параметров. Модель показывает отличные результаты без дообучения для различных типов задач, это является главной особенностью моделей типа GPT(Generate Pretrained Transformers). Более подробно можно прочитать здесь.

В данной статье мы рассмотрим одну из возможностей ruGPT-3 – анализ тональности текста.

Анализ настроений текста – класс методов NLP для определения эмоциональной окраски текста. К основным видам классификации эмоциональности текста относятся:

  1. Классификация по бинарной шкале (позитивный/негативный)
  2. Классификация по многополосной шкале (от 0 до 10, где 0 – резко негативный, 10 – резко позитивный)
  3. Субъективность/объективность

Далее рассмотрим бинарную классификацию с помощью генеративной модели ruGPT-3 без дообучения. Для определения тональности возьмем модель размера Large (760 млн параметров). В качестве данных мы возьмем отзывы о мобильных приложениях в App Store.

Пример кода для работы с large моделью:

#загрузка необходимых библиотек
from transformers import GPT2Tokenizer, GPT2LMHeadModel
import math
import pandas as pd
#загрузка моделей из hugging face
tokenizer = GPT2Tokenizer.from_pretrained("sberbank-ai/rugpt3large_based_on_gpt2")
gpt3_large = GPT2LMHeadModel.from_pretrained("sberbank-ai/rugpt3large_based_on_gpt2")
gpt3_large = gpt3_large.to(device)

Для определения тональности будем использовать меру Перплексии. В теории информации, перплексии – мера того, насколько хорошо распределение вероятностей предсказывает выборку. Более подробно можно прочитать здесь. Говоря простым языком, перплексия – мера «удивлённости» модели.

На вход модели мы подаём затравку в формате <метка тональности> + <отзыв>. Далее мы считаем перплексию каждого из них. Выбираем наименьшую перплексию из двух и присваиваем метку отзыву.

def calculate_perplexity(sentence, model, tokenizer):
    sentence_positive = 'довольна:'+sentence               
    sentence_negative = 'недовольна:'+sentence               
    list_sent = [sentence_positive, sentence_negative]
    ppl_values = []

    for sentence in list_sent:
      encodings = tokenizer(sentence, return_tensors='pt')
      input_ids = encodings.input_ids.to(device)
      with torch.no_grad():
          outputs = gpt3_large(input_ids=input_ids, labels=input_ids)
      loss = outputs.loss
      ppl = math.exp(loss.item() * input_ids.size(1))
      ppl_values.append(ppl)
    
    if ppl_values[0] > ppl_values[1]:
      return 'отрицательный'
    elif ppl_values[0] < ppl_values[1]:
      return 'положительный' 

reviews = pd.read_excel('путь_до_файла_с_данными')
reviews['sentiment'] = reviews['review'].apply(lambda x: calculate_perplexity(x, gpt3_large, tokenizer))

Пример работы алгоритма:

Для оценки качества алгоритма использовался вручную размеченный датасет. С помощью сервиса разметки данных TAGME(https://tagme.ru) мы обработали одну тысячу отзывов. На валидационной выборке получили следующие результаты:

Accuracy = 0.87

F1-measure = 0.86

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