В тази поредица от 6 части ще обясня моя процес на използване на обработка на естествен език и машинно обучение за класифициране на жанровете на сценариите.

За повече информация вижте моето репо.

Част 1: Бизнес цел

Част 2: Събиране на данни

Част 3: „Разбор на данни“

Част 4: Проучвателен анализ на данни (вие сте тук)

Част 5: Изграждане на модел (все още не е публикувано)

Част 6: Внедряване на модел (все още не е публикувано)

Добре дошли любители на науката за данните и филмите на Medium. Това е част 4 от моята поредица от 6 части, в която използваме НЛП и машинно обучение, за да изградим класификационен модел с множество етикети, за да етикетираме жанровете на филмов сценарий.

Ако не сте проверили Части 1, 2 и 3 от поредицата, където обсъждам как да използвам BeautifulSoup за изчерпване на филмови сценарии и как да използвам API на базата данни за филми, за да етикетираме нашите данни, тогава връзките са по-горе.

Част 4: Проучвателен анализ на данни — Използване на пакета Word Cloud

В нашия набор от данни, състоящ се от филмови сценарии, има 18 жанра. Те са криминален, романтичен, анимационен, научна фантастика, фентъзи, история, екшън, драма, война, трилър, мистерия, документален филм, ужас, семеен, приключенски, музикален, комедиен и уестърн.

Всеки сценарий може да има различна комбинация от всеки жанр.

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

Стъпки, които ще предприемем:

  1. Импортиране на необходимите пакети
  2. Зареждане на данни
  3. Визуализиране на жанрове
  4. Визуализиране на жанрове с почистване на текст
  5. Визуализиране на жанрове с почистване и нормализиране на текст
  6. Визуализиране на жанрове с почистване на текста, нормализиране и оптимален списък със стоп думи

За този изходен код вижте EDA_pt1 и EDA_pt2 в моето хранилище.

  1. Импортиране на необходимите пакети

Класът TextPreprocessing може да бъде намерен тук за изтегляне. В тази статия обаче ще напиша функциите на класа.

Вижте тази статия за повече информация относно създаването на персонализирани трансформатори. Himanshu върши страхотна работа, като обяснява как и защо да създавате вашите класове за ML тръбопроводи.

2. Зареждане на данни

#loading in dataset
data = pd.read_csv("data/cleaned_data.csv", index_col=[0])

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

3. Визуализиране на жанрове

Когато използваме NLP и машинно обучение, същността на изграждането на страхотен модел произтича от нашите усилия за предварителна обработка на текст. Това включва почистване на нашия текст с помощта на регулярен израз, тестване на различни техники за нормализиране на текста, като корен и лематизация, и създаване на солиден списък със спиращи думи.

В този проект ще направим и трите, но преди да го направим, искам да ви покажа какво се случва, ако не го направим, като визуализираме жанр без предварителна обработка.

Първо, нека разделим нашите жанрове в различни рамки с данни.

#intializing empty dct to store dataframes
genre_df = {}
for genre in genre_lst:
   #creates a key and value of only that genre
   genre_df[genre] = data[data[genre] == 1]

Когато преминахме през нашия genre_lst, създадохме ключ за всеки жанр и съответните стойности са кадри с данни, където стойността на реда в колоната за жанр е равна на 1.

Например стойността за комедийния ключ ще бъде рамка от данни на pandas като тази:

Сега, за да използваме пакета wordcloud, първо ще обединим целия комедиен текст във всеки ред и ще го запазим в променлива.

comedy_text = " ".join(genre_df['Comedy']['text'])

Нека визуализираме първите 1000 елемента от нашата променлива тип низ.

print(comedy_text[:1000])

Сега нека да разгледаме размера на нашата променлива:

print(len(comedy_text))
84708731

Стартирайте този код:

Изход:

Както ясно е показано, няма индикация, че това са често срещани думи, използвани в комедийни филми.

4. Визуализиране на жанрове с чист текст

За да подобрим предишния облак от думи, ще изчистим нашия текст.

Функцията приема един параметър, който е текстът, който желаем да изчистим. Първият ред заменя „\\r“, „\\n“ и „\\“ с празни интервали и след това разделя текста, за да създаде списък. Вторият ред използва пакета regex, за да замени всички специални знаци във всяка дума в списъка с празни интервали. След това третият ред се присъединява отново към целия текст след проверка дали елементът не е число и дали е по-голям от 1 знак.

За да видите разликата, която прави текстът за почистване, нека да разгледаме първите 1000 знака на Knocked Up преди почистване:

Сега след почистване:

Има голяма разлика, която ще помогне за представянето на нашия модел по пътя.

Имайте предвид, че почистването на текст не е толкова систематично, колкото други техники за наука за данни. Зависи с какъв набор от данни работите. Например, не бих използвал същата функция за почистване на текста на туитове или публикации във Facebook. Бих го модифицирал, за да работи с начина, по който са написани тези туитове или публикации.

За повече информация вижте тази статия. Kashish върши чудесна работа, обсъждайки различните подходи за почистване на текст в различни набори от данни.

Сега да визуализираме:

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

5. Визуализиране на жанрове с почистване на текст и нормализиране на текст

Нормализирането на текст е процесът на превод на дума от нейното флективно състояние в нейното основно състояние. Това ще ни помогне да съкратим нашия текст и да илюстрираме по-добър облак от думи.

Примери: Цветя (флексия) -› Цвете (основа), Бягане (флексия) -› Бягане (основа), Smarter (флексия) -› Интелигентно (базирано)

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

В НЛП и науката за данни ние използваме произтичане или лематизиране, за да извършим нормализиране на текст.

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

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

Стимулирането е изчислително по-бързо от лематизирането, но лематизирането дава по-голяма точност. В нашия проект ще използваме лематизация. Ако искате да научите повече за нормализирането на текст, неговата математика и т.н.: вижте тази статия. Диего се справя страхотно с обяснението на плюсовете, минусите, разликите и алгоритмите зад двете техники.

Намаляването на целия ви текст с малки букви е добра практика в НЛП. Това е така, защото Python не изчислява думите с различни главни букви като еднакви. Например, Python вярва, че „всички“ и „всички“ са различни стойности.

Освен това, ако забележите, използвахме основен списък със стоп думи от пакета NLTK. Това също е добра практика, защото думите, съставени от този списък, са общи думи като „аз“, „беше“, „ти“ и т.н. Нашата функция за модела е броят на думите във всеки жанр. Като елиминираме тези общи думи, ще имаме по-диференциран брой думи за нашите целеви класове.

Следващата стъпка е токенизиране на думите в нашия текст. Токенизирането помага на нашите модели да научат контекста и последователността от думи. След това извършваме лематизация на всеки токен в нашия корпус.

Wordcloud след нормализиране на текста:

Няма ясна разлика между думата облак преди лематизиране и след лематизиране. Въпреки това, ако погледнете облака от втора дума, има LOOK в центъра и LOOKING най-вдясно. Сега, ако погледнете третия облак, има само ГЛЕДНЕ в центъра и няма ГЛЕДНЕ вдясно. Това е така, защото нашите усилия за лематизация намалиха LOOKING до LOOK. Това в крайна сметка създава по-точен брой думи. Визуално е малка разлика, но повярвайте ми, ще доведе до по-добри резултати, когато създадем функцията за броене за нашия модел в следващия урок.

6. Визуализиране на жанрове с почистване на текст, нормализиране и оптимален списък със стоп думи

Вижте тези две графики:

Както виждате, първите 15 думи по брой в сценариите на комедии и криминални са много сходни. Безопасно е да се предположи, че вероятно е много сходен за всичките ни 18 жанра. Ето защо, за да елиминираме общите думи между всеки жанр, ще създадем списък със стоп думи с пресечната точка на 500-те най-често срещани думи във всеки жанр.

Ще използваме пакета FreqDist, за да създадем диктовка от думи по жанр.

В този код намираме броя на думите по жанр, като използваме класа FreqDist от пакета nltk. Ние съхраняваме броя на думите в речник на Python, където ключовете са жанровете, а стойностите са обектите FreqDist.

Сега нека намерим пресечната точка на всички честоти от 18 думи.

Тази функция извлича най-често срещаните думи в обекта FreqDist. В нашия случай ще направим първите 500 думи за всеки жанр.

Този код преминава през всички жанрове и извлича първите 500 думи. В променливата stops съхраняваме пресечната точка на най-добрите думи от всеки жанр.

Това е нашият списък със стоп думи:

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