Целта на тази статия е да предостави насоки за по-добър анализ на отзивите на клиентите, както и да проучи резултатите, генерирани от нашите модели от отрицателните отзиви за приложението 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 г., въпреки че констатацията е интересна, тя няма полза, тъй като проблемът е решен. Освен това, изборът на неподходяща времева рамка ще подведе нашата AI система да се съсредоточи повече върху остарели проблеми, като същевременно придава по-малка тежест на относително по-малки по-нови проблеми. Освен това ще ни струва значително време и изчислителна мощност. В резултат на това времевата линия, избрана за този анализ, беше от януари 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)

Ако нямате рейтингова променлива във вашите данни, можете да използвате предварително обучен Transformer и да анотирате отзивите си директно с прогнозите на модела. Можете също така да използвате набор от данни за анализ на настроенията с отворен код, за да обучите вашия класификатор и да анотирате вашите рецензии.

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

И накрая, трябва да гарантираме, че нашите данни са подходящи за извличане на аспекти, базирани на настроението. Отзивите с неутрални настроения представляват предизвикателство, тъй като обикновено включват както положителни, така и отрицателни настроения.
Ако процентът на неутралните прегледи е нисък, можем да спестим много време и усилия, като просто ги премахнем. От друга страна, ако неутралната категория представлява голяма част от набора от данни, трябва да се извърши аспектно-базиран анализ на настроението (ABSA), преди да продължите. Прилагането на ABSA е предизвикателство само по себе си, но ако се изпълни правилно, значително ще подобри качеството на изводите.

В случая на Netflix неутралната категория представлява само 5,9 %.
Няма да повлияем на анализа, като го премахнем, и ще имаме по-добро разделяне на отрицателните и положителните аспекти за анализираните модели.

След като премахнем неутралната категория, можем да визуализираме положителните и отрицателните отзиви, за да видим как се променят с времето:

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

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

Sentence-T5-XL е предварително обучена променена версия на T5–3B (3 милиарда параметъра). Той е обучен да картографира изречения във векторно пространство по такъв начин, че семантично подобни изречения да са близки в пространството. След това можем да използваме показатели за сходство като косинусово сходство, за да определим дали две изречения са семантично свързани. Ако искате да научите повече за Sentence-T5,прочетете следната публикация: Sentence-T5: Мащабируеми енкодери на изречения от предварително обучени модели текст към текст.

Вгражданията на Sentence-T5 могат да се използват за групиране на голям или малък набор от прегледи по различни начини. Често използвам алгоритъма за клъстериране HDBSCAN, който означава „Йерархично базирано на плътност пространствено групиране на приложения с шум“. HDBSCAN е разработен от Campello, Moulavi и Sander. Той разширява DBSCAN, като го преобразува в йерархичен алгоритъм за клъстериране и след това извлича плоско клъстериране въз основа на стабилността на клъстера. За разлика от добре познатия алгоритъм за K-средни стойности, HDBSCAN може систематично да намира клъстери с различни форми, без да указва фиксиран брой клъстери за генериране, и има допълнителното предимство да идентифицира извънредни стойности, когато е възможно.

Изречение-T5и други преобразуватели на изречения могат да се използват за идентифициране на аспекти и теми в колекция от изречения, абзаци или кратки документи. За отличен урок вижте „Моделиране на теми с BERT“, както и хранилищата „Top2Vec“ и „BERTopic“.

За да увелича максимално надеждността на рецензиите във всеки клъстер, зададох праг на вероятност от 85% в HDBSCAN, което означава, че ако рецензията има вероятност от по-малко от 85% да принадлежи към прогнозиран клъстер, тя ще бъде обозначена като отклонение. Резултатите са както следва:

В предходната графика забелязваме две неща. Като начало, повече от 60% от рецензиите бяха означени като извънредни. Това е очакван резултат, тъй като зададохме много висок праг на вероятност за клъстериране. Второ, забелязваме, че са генерирани 23 небалансирани клъстера.

В този момент обикновено обучавам Transformer като многокласов класификатор над етикетираните клъстери и го използвам за етикетиране на останалите извънредни стойности.

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 „Umbrella Academy“ е основната причина за нарастването на оплакванията сред мюсюлманската общност през този период.

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

Досега демонстрирахме усъвършенстван базиран на AI подход за анализ на обратната връзка с клиентите и извлякохме полезна информация от отрицателните отзиви.

Въпреки че може да изглежда, че сме изминали дълъг път в нашия анализ, анализирахме данни само от една тема, което прави по-малко от %8 отрицателни отзиви или по-малко от 2% от общия брой отзиви.

ВАЖНА ЗАБЕЛЕЖКА ЗА БЪДЕЩИ АНАЛИЗАТОРИ:
Когато анализирате отзиви от клиенти или подобен тип данни, е лесно да се спекулира и да се правят неверни предположения. Например, свидетелството на голям брой оплаквания за един аспект не означава, че трябва да се предприемат действия. Конкретен аспект, от който се оплакват потребителите, може да има още по-голям брой клиенти, които го оценяват.

Ако сте намерили тази статия за полезна, харесайте, споделете или оставете коментар, препоръчвайки дали анализът на Netflix трябва да продължи в друга статия или трябва да анализирам друга компания.

Благодаря ви, че прочетохте!

За всякакви въпроси, свържете се с мен чрез LinkedIn