Използване на NLTK, Gensim, Spacy и pyLDAvis за разкриване на показателни модели на реч сред действащите герои.

Екшън/приключенските филми радват публиката от години. От вълнуващото автомобилно преследване в „Bullit“ (1968) до бурната битка в John Wick 3 (2019), любителите на киното се тълпят в киното отново и отново, за да получат своя адреналин.

Макар че наистина има много удоволствие от жанра, има някои доста ясни проблеми, които също бях любопитен да разгледам. От една страна, по-голямата част от екшън/приключенските филми включват „бял, мъжки главен герой“. Второ, споменатите герои често третират жените и поддържащите герои като обекти, които трябва да бъдат завладени. Това веднага става очевидно, да речем, във франчайза за Джеймс Бонд, но ще позволя този цитат от франчайза XXX с участието на Вин Дизел да го обобщи:

„Позволете ми да го опростя за вас. Разбийте малко задника, вземете момичето и се опитайте да изглеждате наркомани, докато го правите.

Имайки предвид всичко това, не се стремях непременно да разкрия това, което в крайна сметка разкрих в този проект. Всъщност, първоначално се заех с опит да дестилирам личността чрез диалог, опитвайки се да картографирам големите пет черти на изречената дума, използвайки намаляване на размерността. Въпреки че не успях да хвърля светлина върху личностните черти с помощта на техниките по-долу, успях да намеря ясни токсични модели на реч в няколко теми. Така че… нека се потопим!

Данните

За този проект използвах „мащабен филмов корпус“ от Калифорнийския университет Санта Круз. Корпусът е разбит по жанр и съдържа 960 филмови сценария, където диалогът във филма е отделен от описанията на сцените. Тук избрах да разгледам специално екшън/приключенския жанр, който включва 143 филма, вариращи от Рамбо до Умирай трудно.

Наскоро завърших проект за „отпечатване на личностния профил на всеки филмов герой“ в корпуса, в който навлизам в повече подробности за предварителната обработка на текста, така че ще се съсредоточа върху някои от по-подробните НЛП техники и моделирането на темата в този пост.

Достатъчно е да кажа, че след първоначалната ми предварителна обработка имах рамка от данни на pandas с две колони (характер и диалог) за всеки протагонист в корпуса и всеки ред от техния диалог като отделни редове за общо 127K изказвания в приблизително 150 знака.

Обработка на естествения език

С данните, готови за работа, сега беше време да внедрим набора от инструменти за естествен език и да подготвим корпуса за моделиране на теми.

Забавната част за NLP (обработка на естествен език) е, че няма твърдо определени правила по отношение на процеси или инструменти. Обикновено след предварителна обработка/нормализиране идва токенизация, произтичане/леминг, векторизация, намаляване на размерността и визуализация. Стъпките и нюансите обаче варират значително в зависимост от контекста. Например, в една ситуация може да има смисъл да се използват биграми с векторизатор на броя и LSA, докато в друга има смисъл да се използват триграми с TFIDF и NMF. Можете да мислите за това като да сте художник в студио, да експериментирате с модели и да скулптурирате, докато получите нещо красиво.

За целите на тази публикация няма да минавам през многото повторения (и неуспехи) в този проект, а вместо това ще премина през стъпките и модела, които дадоха най-добри резултати.

Първо токенизирах всяко изречение в списък с думи, като премахнах препинателните знаци и ненужните знаци, използвайки функцията simple_preprocess() на Gensim, както се вижда в кода по-долу:

След това дефинирах биграми и триграми. По същество това улавя две думи една до друга и гарантира, че думите, които трябва да бъдат заедно, като например „Сан Франциско“, остават като едно цяло. Казано по друг начин: Биграмите са две думи, които често се срещат заедно в документа. Триграмите са 3 думи, които се срещат често.

Моделът Phrases на Gensim може да създава и прилага биграми, триграми, квадраграми и други. Двата важни аргумента за Phrases са min_count и threshold. Колкото по-високи са стойностите на тези параметри, толкова по-трудно е думите да се комбинират в биграми. Кодът за това също е по-долу:

След това дефинирах някои функции. А именно аз лематизирах думите и премахнах стоп думите, Лематизацията не е нищо друго освен преобразуване на дума в нейната коренна дума. Например: лемата на думата „дървета“ е „дърво“. По същия начин „говорене“ –› „говорене“, „гъски“ –› „гъска“ и т.н. Стоп думите са по същество много често срещани думи в английския език, които не искаме да включваме в нашия анализ. Думи като „the“ „and“ „for“ и т.н. За кода по-долу импортирах стоп думи и лематизация с помощта на Spacy.

От думи към речник/корпус до LDA

Сега, когато се доближавах до възможността да дестилирам тези многомерни данни в теми, след това преобразувах моя списък с думи както в речник, използвайки id2word, така и в корпус. Причината за това е, че двата основни входа към тематичния модел на LDA са (познахте!) речникът (id2word) и корпусът:

Това ме доближи до готовност за моделиране! Последното парче от пъзела беше да определя колко теми бих искал да проуча. Тук има редица техники, включително „метод на силуета“, но аз избрах да генерирам това, което се нарича elbow plot: по същество евристика, която да ви помогне да намерите подходящия брой клъстери, върху които да стартирате модел. Този метод разглежда процента на дисперсията, обяснен като функция от броя на клъстерите: човек трябва да избере определен брой клъстери, така че добавянето на друг клъстер да не дава много по-добро моделиране на данните. На сюжета това обикновено е точката, която прилича на лакът.

В този случай нямах силен „лакът“, който да визуализирам. Може би на 3 или 4, но нищо твърде окончателно. Това трябваше да е друг случай, в който опитах няколко неща и интерпретирах качеството на резултата.

Добре, най-накрая към модела! След това поставих както речника, така и корпуса в моя LDA модел заедно с броя на темите, които исках да изследвам. Намерих най-разбираемите резултати с 4 теми. Освен броя на темите, alpha и eta са хиперпараметри, които влияят на рядкостта на темите. Според документите на Gensim, и двете по подразбиране са 1.0/num_topics преди.

chunksize е броят на документите, които трябва да се използват във всяка тренировъчна част. update_everyопределя колко често трябва да се актуализират параметрите на модела и passes е общият брой преминавания на обучение. Ето кода на модела:

Страхотен. Сега да визуализирам някои резултати. Въпреки че е валидно просто да отпечатате темите на модела, има много по-визуален и интерактивен начин за показване на констатациите: pyLDAvis. Всяко балонче в графиката от лявата страна представлява тема. Колкото по-голям е балонът, толкова по-разпространена е тази тема. С 4 теми успях да получа доста диференцирани (неприпокриващи се) балончета със значими резултати, както е показано по-долу:

Констатации + Заключителни мисли

И в четирите теми в корпуса видях доказателства за заповедни и женомразки думи. От по-„питомната“ страна имаше думи за действие като „отиди“, „вземи“, „искам“, „вземи“ до това, което може да се опише само като „по-малко опитомени“ думи като „майната“, „бебе“ „убий“ и т.н.

Разбира се, има много филми, в които главният герой трябва просто...

… но многократно думи като „получаване“ изглежда предполагат притежание и насилствено командване на другите, а не просто нужда да стигнете някъде. Като оставим хумора настрана, тази визуализация показва, че има истински проблем с писането на екшън протагонисти от 60-те години до настоящето и ако трябва да назова темите в моя горен визуален образ, бих казал, че те се свеждат до:

  • Команди и насилствени искания
  • заплахи
  • Жените като обекти
  • Въоръжение

Надяваме се, че тази тенденция ще се промени занапред и ще видим не само по-разнообразно представяне на водещи мъже и жени в екшън жанра, но и повече съпричастност в техните думи и дела.

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

Приложение

Github, LinkedIn, Портфолио