Система за препоръчване на филми — филтриране по съдържание

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

Общ преглед на внедряването

Много специална NLP библиотека, известна като RAKE (алгоритъм за бързо автоматично извличане на ключови думи), е използвана за работа с колоната „key_words“, която съдържа всички необходими ключови думи в .csv, който най-накрая имаме. Това основно е извличане на ключови думи чрез определяне на честотата на думите и появата. Следващото най-добро учене беше наличието на векторни представяния с инструмент за векторизиране на броя, осигурен от scikit-learn (ML библиотека), който преобразува думите в съответните им векторни форми въз основа на честотното броене на думата. Следователно, след като имаме окончателна матрица на всички преброявания на думи, ние прилагаме косинусово сходство, за да имаме матрицата на сходство. За частта с резултатите идеята беше да се покаже въведеното заглавие от потребител по най-добрия начин и по-късно да се предоставят някои други препоръки. И така, извличам N+1 препоръки, където първата препоръка е най-добрият резултат или въведеното от потребителя заглавие (показва се по-силно) и следователно предоставям други N оставащи имена на препоръки.

Намерете уебсайта с връзката по-долу:

https://recommendmee.herokuapp.com/.

Събиране на данни

Наборът от данни за филми е взет от kaggle и може да бъде намерен по-долу:

https://www.kaggle.com/tmdb/tmdb-movie-metadata.

Наборът от данни има два csv файла:

  1. tmdb_5000_credits.csv
  2. tmdb_5000_movies.csv

Предварителна обработка на данни

Ще обработя предварително набора от данни в Jupyter-Notebook.

Прочетете и двата набора от данни с помощта на pandas:

Обединете двата csv файла в колоните id и movie_id и наименувайте комбинирания csv файл като df. След сливането ще има голям брой колони.

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

Първа колона на df рамка с данни

Много колони в този набор от данни, като жанрове, ключови думи и т.н., са във формат Json, така че трябва да ги декодираме и да извлечем полезно съдържание от тях.

Сега наборът от данни ще изглежда по следния начин:

Проверете дали има нулева стойност в набора от данни или не, ако да, изчистете набора от данни. Дотук има 4803 реда и 10 колони.

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

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

Колоните „общ преглед, слоган, ключови думи“ на набора от данни съдържат неполезни елементи като числа и стоп думи и за да се справя с това, попаднах на много полезен и важен алгоритъм, който извлича важни думи от текста, алгоритъмът е Бързо автоматично извличане на ключови думи (RAKE)алгоритъм.

Ще приложа алгоритъма RAKE към колони от набора от данни.

Комбинирайте всички колони с изключение на original_title и movie_id, защото в системата за препоръчване на филми, базирана на съдържание, не се използва movie_id и about original_title, това е името на филмите, което трябва да бъде в отделна колона.

Сега премахвам всички ненужни колони, като запазвам само колоните original_title и combination_features.

И наборът от данни ще изглежда по следния начин:

Тъй като потребителят може да търси във филм във всеки формат, например, нека разгледаме филма „батман срещу супермен: зората на справедливостта“, потребителят може да търси като „батман срещу супермен“, „батман супермен“, „батман зората на справедливостта“ и т.н. Така че ще премахна всички неполезни знаци и ще комбинирам всички думи от колоната original_title, а също и от въведеното от потребителя.

И накрая преобразувайте този формат на набора от данни в нов csv файл.

Можете да намерите файла на jupyter-notebook, съдържащ всички кодове, като щракнете върху тази връзка, https://github.com/techopus/Recommend-Me.

Тук завърших стъпките за предварителна обработка на данни и създадох окончателен csv файл за по-нататъшна употреба.

Създаване на Flask приложение

В този python файл ще използвам csv файла, който създадох по-рано.

Използвам метода Nearest Neighbors, за да намеря най-сродните филми въз основа на въведеното от потребителя.

Първо ще импортирам набора от данни и след това основната стъпка, която ще изпълня, е, че ще създам count_matrix с помощта на CountVectorizer. Можете също да използвате TfidfVectorizer в случай.

CountVectorizer ще преброи броя на присъстващите думи в текст.

CountVectorizer работи както следва за всеки текст.

Сега ще създам матрица за оценка на сходството, която е квадратна матрица и съдържа стойности между 0 и 1, защото тук използвам косинусово сходство и стойността на cos е между 1 и 0 >.

Ако два филма са силно свързани, тогава ъгълът между тях е близо до нула и оценката за сходство е близо до 1.

Сега ще взема въведеното от потребителя, използвайки HTML страницата, която създадох, връзката към целия код (html, css и т.н.) е предоставена в края на блога.

Ще премахна всички нежелани знаци от въведеното от потребителя.

Ако заглавието, същото като въведеното от потребителя, присъства в колоната „title“ на набора от данни, тогава намерете индекса по избор на потребителя и използвайки този индекс, можем да намерим индексите и разстоянията на свързаните филми, използвайки NearestNeighbors.kneighbors().

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

Кодът наколбата във файла на python изглежда така,

Тук main_page.html е уеб страницата, където потребителят въвежда името на филма. movie_list.html е уеб страницата, където се показва списък с препоръчани филми.

За да внедрим модела в Heroku, имаме нужда от още два файла,

  1. Профил
  2. изисквания.txt
  3. runtime.txt (Вие може да изисквате или не това - трябваше да създам този файл, за да предоставя изрично версията на Python за четене за heroku)

Flask търси в HTML файловете в папката “templates” и CSS файловете в папката “static/styles”, така че никога не забравяйте да поставите файловете си на правилната дестинация, в противен случай няма да работа.

Качете всички файлове и папка в github.

Отворете Heroku и създайте акаунт или влезте.

Кликнете върху Ново/Създаване на ново приложение.

Въведете името на приложението и щракнете върху Създаване на приложение.

Кликнете върху GitHubи потърсете в хранилището си.

Кликнете върху Свързване.

След това щракнете върху Deploy Branch.

Ако всичко върви добре, ще започне да инсталира пакети, изброени във файла requirements.txt и накрая ще даде URL адрес, завършващ с herokuapp.com.

Заключение

И така изграждаме базирана на съдържание система за препоръчване на филми с много ограничено количество данни! Това очевидно може да се подобри много чрез добавяне на различни функции за подобряване на частта от потребителския интерфейс и бих искал да прегледам и обединя вашите подобрения на функциите и да се занимавам с всякакви проблеми в моя Github! Ако измислите подобрения на този проект, не се колебайте да отворите проблем и да допринесете. Бих искал да прегледам и обединя вашите подобрения на функциите и да се погрижа за всякакви проблеми в моя Github!

Можете да се свържете с мен с всякакви въпроси относно това на моя gmail: [email protected] и аз ще се радвам да им отговоря. Благодаря ти ;)