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

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

Оглавление:

И. Методология:
1. Парсинг данных
2. Предварительная обработка данных
3. Извлечение аспектов и тем
4. Многоклассовая классификация
5. Создание представлений

II. Выводы:
1. Удаление ненужных тем
2. Анализ тем:
2.1. Контент Netflix
2.2. Контент Netflix как временной ряд
2.3. Подтемы контента Netflix

III. Заключительное заявление

I. Методология:

I.1. Скрапинг данных:

Данные были извлечены с помощью google-play-scraper, который предоставляет API-интерфейсы Python для сканирования Google Play Store без внешних зависимостей. Когда вы закончите, у вас будет фрейм данных Pandas, который выглядит следующим образом:

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

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

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

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

# make sure df['date'] is a Series with dtype datetime64[ns]
df['date'] = pd.to_datetime(df['date'])

# Make a boolean mask
mask = (df['date'] >= '2022-1-1') & (df['date'] <= '2022-12-31')
df = df.loc[mask]

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

Как правило, оценки 4 и 5 я считаю положительными, оценки 1 и 2 — отрицательными, а оценки 3 — нейтральными. Следующий код поможет вам быстро разделить ваши данные по рейтингу:

def LabelingFunc(rating):
  if rating >= 4:
    return 1 # Positive
  elif rating <= 2:
    return 0 # Negative
  else:
    return -1 # Neutral

df['label'] = df['rating'].apply(LabelingFunc)

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

Следуйте вышеупомянутым подходам с осторожностью, так как значительное изменение контекста обучающих данных классификатора и ваших данных (например, уникальный диалект) может привести к вводящим в заблуждение выводам. Самый безопасный подход — вручную аннотировать образец ваших данных по настроению, обучить вашу модель как классификатор по аннотированному образцу и, наконец, использовать модель для прогнозирования настроений оставшихся обзоров.

Наконец, мы должны убедиться, что наши данные подходят для извлечения аспектов на основе тональности. Обзоры с нейтральным настроением представляют собой проблему, поскольку они обычно включают как положительные, так и отрицательные настроения.
Если процент нейтральных отзывов низкий, мы можем сэкономить много времени и сил, просто удалив их. С другой стороны, если нейтральная категория составляет большую часть набора данных, перед продолжением следует выполнить анализ тональности на основе аспектов (ABSA). Реализация ABSA сама по себе является сложной задачей, но при правильном выполнении она значительно улучшит качество выводов.

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

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

I.3 Извлечение аспектов и тем:

Аспекты и темы могут быть извлечены из наших обзоров путем их кластеризации с использованием заранее определенной функции сходства. Для этого мы должны создать числовые представления обзоров. Существует несколько доступных методов встраивания текста, но модель Sentence-T5-XL лучше всего подходит для моей реализации.

Sentence-T5-XL — это предварительно обученная модифицированная версия T5–3B (3 миллиарда параметров). Он обучен отображать предложения в векторном пространстве таким образом, чтобы семантически сходные предложения были близки в пространстве. Затем мы можем использовать метрики подобия, такие как косинусное сходство, чтобы определить, связаны ли два предложения семантически. Если вы хотите узнать больше о Sentence-T5, прочтите следующую публикацию: Sentence-T5: Масштабируемые кодировщики предложений на основе предварительно обученных моделей преобразования текста в текст.

Вложения Sentence-T5 можно использовать для кластеризации большого или малого набора отзывов различными способами. Я часто использую алгоритм кластеризации HDBSCAN, что означает «Пространственная кластеризация приложений с шумом на основе иерархической плотности». HDBSCAN был разработан Кампелло, Мулави и Сандером. Он расширяет DBSCAN, преобразуя его в алгоритм иерархической кластеризации, а затем извлекая плоскую кластеризацию на основе стабильности кластера. В отличие от хорошо известного алгоритма K-средних, HDBSCAN может систематически находить кластеры различной формы без указания фиксированного количества кластеров для создания и имеет дополнительное преимущество, заключающееся в выявлении выбросов, где это возможно.

Sentence-T5 и другие преобразователи предложений можно использовать для определения аспектов и тем в наборе предложений, абзацев или коротких документов. Отличный учебник см. в разделе Тематическое моделирование с помощью BERT, а также в репозиториях Top2Vec и BERTopic.

Чтобы максимизировать надежность отзывов в каждом кластере, я установил порог вероятности 85% в HDBSCAN, что означает, что если обзор имеет вероятность менее 85% принадлежности к прогнозируемому кластеру, он будет помечен как выброс. Результаты приведены ниже:

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

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

I.4 Многоклассовая классификация:

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

Поскольку наши кластеры несбалансированы, мы должны соответствующим образом скорректировать нашу модель. Можно было бы использовать множество подходов, таких как избыточная и недостаточная выборка данных, но я бы предпочел оставить данные нетронутыми и скорректировать модель, чтобы сильно взвесить небольшие кластеры. В результате модель будет «больше фокусироваться» на отзывах из недостаточно представленных кластеров.
Чтобы рассчитать вес каждого кластера, используйте следующую формулу:

Где:
- размер кластераколичество отзывов в кластере.
- общее количество отзывов — общее количество отзывов в нашем обучающем наборе.
nclusters — количество кластеров, которые у нас есть (23).

# Scaling by totalreviews/nclusters helps keep the loss to a similar magnitude.
# The sum of the weights of all examples stays the same.
weight_for_0 = (1 / cluster0_size) * (totalreviews / 23)
weight_for_1 = (1 / cluster1_size) * (totalreviews/ 23)
...
weight_for_22 = (1 / cluster22_size) * (totalreviews/ 23)

cluster_weights = {0: weight_for_0, 
                   1: weight_for_1,
                   ...
                   22: weight_for_22}

Теперь вы можете легко передать веса для каждого класса через параметр tensorflow.keras:

model.fit([train_input_ids,train_attention_masks], y_train, 
          validation_data=([val_input_ids,val_attention_masks], y_valid),
          callbacks=my_callbacks,
          epochs=100, batch_size=32,
          # The cluster weights go below:
          class_weight=cluster_weights)

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

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

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

I.5. Создание представления:

Последним шагом в моделировании является систематическое извлечение текстового представления для каждого кластера на основе обзоров кластера.
Для этого я реализую TF-IDF на основе классов и настраиваемую функцию для удаления повторяющихся слов. Maarten Grootendorst предоставляет отличное руководство Создание TF-IDF на основе классов с помощью Scikit-Learn. В следующей таблице показаны окончательные результаты:

II. Выводы:

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

II.1. Удаление ненужных тем:

Темы 0, 1 и 12 представляют обзоры без информации. На них приходится более 7500 отзывов из 35197. Мы рассмотрим несколько обзоров, чтобы увидеть, что мы можем с ними сделать:

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

Во-вторых, мы точно знаем, что все 35 тысяч отзывов имеют рейтинг 2 или ниже. Что делает довольно интересным, что почти 2 тысячи пользователей (из No Info Positive›) так низко оценили приложение и при этом написали положительные тексты.

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

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

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

II.2. Анализ тем:

II.2.1. Контент Netflix.
Третья тема посвящена жалобам на контент Netflix. В таблице ниже случайная выборка отзывов из 3-й темы:

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

II.2.2. Контент Netflix в виде временных рядов:

Чтобы дополнительно изучить взаимосвязь между темами контента Netflix, мы построили график их частоты в зависимости от времени:

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

II.2.3. Подтемы содержимого Netflix:
После создания подтем из 3-й темы мы получаем следующие результаты:

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

Мы можем ясно видеть, что подтема, относящаяся к мусульманскому сообществу, была в первую очередь ответственна за внезапный скачок частоты основной темы. Быстрый поиск в Google совершенно ясно показал, что сериал Netflix «Академия Амбрелла» является основной причиной роста жалоб среди мусульманского сообщества в тот период времени.

III. Заключительное заявление:

На данный момент мы продемонстрировали продвинутый подход на основе искусственного интеллекта к анализу отзывов клиентов и извлекли полезную информацию из отрицательных отзывов.

Хотя может показаться, что мы проделали долгий путь в нашем анализе, мы проанализировали данные только по одной теме, что составляет менее 8% негативных отзывов или менее 2% от общего числа отзывов.

ВАЖНОЕ ПРИМЕЧАНИЕ ДЛЯ БУДУЩИХ АНАЛИТИКОВ:
При анализе отзывов клиентов или подобных данных легко строить предположения и делать ложные предположения. Например, наличие большого количества жалоб на один аспект не означает, что нужно предпринимать какие-либо действия. Конкретный аспект, на который жалуются потребители, может иметь еще большее число клиентов, которые его ценят.

Если вы нашли эту статью полезной, поставьте лайк, поделитесь или оставьте комментарий, рекомендуя, следует ли продолжить анализ Netflix в другой статье или мне следует проанализировать другую компанию.

Спасибо за чтение !

По любым вопросам обращайтесь через LinkedIn