***** После завершения этого проекта не забудьте погуглить ***********

Согласно Артуру Сэмюэлю (1959): - Машинное обучение - это область
исследования, которая дает компьютерам возможность учиться без явного программирования
. I попробуйте объяснить все основы и классификации машинного обучения на простом примере из реальной жизни…
Вот ссылка ниже: -
https://medium.com/@143jshubham/machine-learning-and- его-влияние-на-наше-поколение-4c0dbc201c1a

Вы когда-нибудь задумывались, как Google рекомендовал фильм, похожий на те, что вам нравятся? Поверьте, после прочтения этого поста вы сможете понять логику этого, а также сможете построить одну такую ​​систему рекомендаций для пользователей.

Не существует определенного типа системы рекомендаций. Люди находят три или четыре различных способа создания системы рекомендаций:

  1. Система рекомендаций на основе контента.
  2. Механизм рекомендаций на основе совместной фильтрации.
  3. Система рекомендаций на основе популярности.
  4. Гибридный механизм рекомендаций для совместной работы с контентом.

Теперь у вас в голове вопрос, как мы собираемся их идентифицировать. Позвольте мне помочь вам ...

Система рекомендаций на основе содержания: -

В этом типе механизма рекомендаций сначала мы собираемся ввести фильм от пользователя. Затем он проанализирует содержимое внутри него. Предположим, что мы собираемся создать систему рекомендаций по фильмам. Затем мы анализируем контент, например - (Storyline: Жанр: В ролях: Режиссер) всего фильма со всеми другими фильмами аналогичного содержания. Затем ранжируйте их по степени схожести и порекомендуйте пользователю наиболее похожий фильм.

Система рекомендаций на основе совместной фильтрации: -

Этот алгоритм сначала пытается найти сходство между пользователями на основе их действий. Давайте предположим, что мы возьмем пример для лучшего понимания (предположим, что у нас есть данные о книге и пользователя, которые прочитали эту конкретную книгу. Пусть пользователь-A прочитал книгу-X, а пользователь-B также прочитал книгу-X Итак, есть некоторое сходство во вкусе как пользователя-A, так и пользователя-B. Итак, в будущем, если пользователь-A прочитает книгу-Y, но эта книга-Y не будет прочитана пользователем-B. Таким образом, мы можем рекомендовать эту книгу-Y для user-B.
Одно из типичных приложений этого алгоритма Amazon - платформа электронной коммерции.

Система рекомендаций на основе популярности: -

Это простейший, но эффективный алгоритм, который отслеживает самые популярные вещи в каждой области и рекомендует именно эти вещи. Список тенденций, который вы видите на YouTube или Netflix, основан на этом алгоритме. Он отслеживает количество просмотров для каждого фильма / видео, а затем перечисляет фильмы на основе просмотров в порядке убывания и рекомендует этот фильм или песню всем пользователям.

Механизм гибридных рекомендаций для совместной работы: -

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

В этой статье мы собираемся реализовать систему рекомендаций на основе контента с использованием библиотеки sikit-learn.

Итак, при внедрении системы рекомендаций на основе контента мы знаем, что нам интересно найти сходство между контентом. Логика очень проста. если у нас есть оценка подобия содержания.

Но подождите, как мы находим Сходство между двумя или более контентом и как мы узнаем, насколько этот контент-A похож на Контент-B?

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

Предположим, у нас есть два содержания: -
текст-A: - Индия, люблю Индию
текст-B: - Люблю, люблю Индию

Итак, у нас есть два текста. Как мы узнаем, насколько текст-A похож на текст-B?

Теперь, что произойдет, если мы попытаемся представить эти два текста в 2D-плоскости (с «Индией» на оси X и «Любовью» на оси Y)? Давай попробуем это сделать.

Это будет выглядеть так-

Здесь мы видим, что 1-я строка с вершиной (2,1) представляет Text-A, а вторая строка с вершиной (1,2) представляет Text-B.

Теперь мы графически изобразили эти два текста. Итак, теперь можем мы выяснить сходство между этими двумя текстами?

Эти два текста представлены в виде векторов. Таким образом, мы можем легко сказать, что два вектора подобны, если расстояние между ними мало или угол (θ) мал. Предположим, если угол между ними равен 0 ( ноль) это означает, что один и тот же вектор означает, что они на 100% похожи. Так что по мере увеличения угла между ними Сходство между ними уменьшается. Поскольку мы знаем, что само по себе θ не имеет смысла, но по мере того, как мы идем в машинное обучение, Cosθ имеет смысл, и мы знаем значение Cosθ в первом квадранте между 0 и 1.

Как мы знаем, как мы находим значение cos θ между двумя векторами в 2D

Но мы не собираемся вычислять cos θ для всего вектора, который мы представляем, потому что это невозможно сделать. У нас есть наш друг Scikit Learn, который рассчитывает это для нас:

Теперь наша первая цель - представить текст в виде вектора.
Для этого у нас есть класс CountVectorizer () для sklearn.feature_extraction.text
Нам нужно импортировать эту библиотеку, прежде чем мы сможем создать новый CountVectorizer() объект.

text = ['India Love India','Love Love India']

Сначала наша цель составляет список текста. Чтобы мы могли передать этот список объекту CountVectorizer (), чтобы получить разреженную матрицу позиционирования вектора для всех элементов (текст-A, текст-B) внутри массива.

from sklearn.feature_extraction.text import CountVectorizer
cvr = CountVectorizer()
counts_matrix = cvr.fit_transform(text)

Если мы собираемся распечатать его, это будет выглядеть так: -
print (count_matrix)
print (count_matrix.toarray ())

print(text)
print(count_matrix)

Выход :-

text = ['India Love India','Love Love India']
  (0, 0)   2 
  (0, 1)   1
  (1, 0)   1
  (1, 1)   2

Здесь имя функции - Индия и Любовь, а Матрица_счетов есть (0,0), (0,1) здесь эта темная часть представляет номер уникального слова в тексте-А, которое это «Индия» и «Любовь», где 2 означает, что слово «Индия» встречается дважды, а 1 означает, что слово «Любовь» встречается один раз в тексте-A. Для второго текста-B (1,0), (1,1) представляют номер уникального слова в тексте-B. Таким образом, есть также два уникальных слова, это Индия и Любовь, где 1 означает, что слово «Индия» появляется один раз. и 2 представляют, что слово «Любовь» встречается в тексте B 2 раза.

Теперь для лучшего понимания преобразовываем эту Count_matrix в Array.

print(cv.get_feature_names())
print(count_matrix.toarray())

Выход:-

['India','Love']
[[2 1]
 [1 2]]

Здесь каждая строка двухмерного массива также является массивом, который представляет один текст. Итак, здесь мы знаем, что у нас есть два текстовых текста - текст-А и текст-Б. Итак, есть два массива внутри внешнего двухмерного массива. этот конкретный единственный массив Dimension представляет количество уникальных слов, здесь мы видим, что в тексте A или в первой строке длина два означает, что в тексте A есть два уникальных слова, то есть «Индия» и «Любовь», и каждый элемент первый массив или текст-A, или первая строка двумерного массива представляют собой появление этого уникального слова в тексте-A. Итак, в конце концов, это означает, что в тексте А есть 2 уникальных слова, то есть «Индия» и «Любовь», и Индия появляется 2 раза, тогда как любовь встречается 1 раз в тексте-А.

Теперь мы преобразовали весь текст в вектор. Итак, теперь наша цель - найти Cos θ между всеми векторами ... это означает (нахождение Cos θ 1-го со всем остальным текстом, затем вторым со всеми остальными текстами…. аналогично для всех со всеми остальными). и мы видим в этом count_matrix.toarray () каждая строка является одним из векторов текста Position. где [21] - это текст-A vector, а [1,2] - вектор text-B.

Теперь наша цель - найти сходство между этими векторами, и для этого у нас есть функция cosine_similarity() из библиотеки sklearn.metrics.pairwise.

from sklearn.metrics.pairwise import cosine_similarity
similarity_scores = cosine_similarity(count_matrix)
print(similarity_scores)

Он дает нам результат, в котором есть оценка сходства всех векторов со всеми другими векторами, но в нашем случае есть два вектора. Таким образом, мы получаем две строки, в которых первая строка представляет оценку сходства первого текста (текст-A) с собственным Аналогично, вторая строка представляет оценку сходства второго текста (текст-B) с собственным и с другими.

[[1.  0.8]
 [0.8 1. ]]

Интерпретируя это, говорит, что Text-A похож на Text-A (сам) на 100% (позиция [0,0]), а Text-A похож на Text-B на 80% (позиция [0,1]). И, глядя на тип вывода, мы можем легко сказать, что это всегда будет выводить симметричную матрицу. Потому что, если Text-A похож на Text-B на 80%, тогда Text-B также будет похож на Text-A на 80%.

Сделаем некоторые вычисления: -

текст-A: - [2,1]
текст-B: - [1,2]

Найдите Cos θ 1-го с 1-м: -
Cos θ = вектор (текст-A). вектор (текст-B) / | вектор (текст-A) |. | вектор (текст-B) |
cosθ = (2i + j). (2i + j) / {(2 * 2 + 1 * 1) ** 1/2. (2 * 2 + 1 * 1) ** 1/2}
cosθ = 4 + 1/5
cosθ = 5/5
cosθ = 1

Найдите Cos θ 1-го с 2-м: -
Cos θ = вектор (текст-A). вектор (текст-B) / | вектор (текст-A) |. | вектор (текст-B) |
cosθ = (2i + j). (i + 2j) / {(2 * 2 + 1 * 1) ** 1/2. (1 * 1 + 2 * 2) ** 1/2}
cosθ = 2 + 2/5
cosθ = 4/5
cosθ = 0,8

Найдите Cos θ 2-го с 1-м: -
Cos θ = вектор (текст-A). вектор (текст-B) / | вектор (текст-A) |. | вектор (текст-B) |
cosθ = (2i + j). (i + 2j) / {(2 * 2 + 1 * 1) ** 1/2. (1 * 1 + 2 * 2) ** 1/2}
cosθ = 2 + 2/5
cosθ = 4/5
cosθ = 0,8

Найдите Cos θ 2-го с 2-м -
Cos θ = вектор (текст-A). вектор (текст-B) / | вектор (текст-A) |. | вектор (текст-B) |
cosθ = (i + 2j). (i + 2j) / {(1 * 1 + 2 * 2) ** 1/2. (1 * 1 + 2 * 2) ** 1/2}
cosθ = 1 + 4/5
cosθ = 5/5
cosθ = 1

Итак, эта форма Оценка подобия: -

[[1.  0.8]
 [0.8 1. ]]

Пришло время начать наш проект. Мы видели, как работает алгоритм: -

Сначала установите все пакеты и импортируйте все пакеты в файл python.

import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.metrics.pairwise import cosine_similarity

Теперь нам нужен набор данных фильма для этого проекта, поэтому мы загружаем его из Kaggle и читаем этот набор данных в этом конкретном файле.

data=pd.read_csv('movie_dataset_github.csv')

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

data.drop(columns=['budget','homepage','original_language','runtime','spoken_language'  ,'status'],inplace=True)

Если вы увидите набор данных, вы поймете, что в нем много дополнительной информации о фильме. Нам не нужны все они. Итак, мы выбираем столбцы "ключевые слова", "состав", "жанры", "режиссер", "слоган" для использования в качестве наших функций. Это так называемое «содержание» фильма).

Movie_features = ['keywords','cast','genres','director','tagline']

Наша следующая цель - создать функцию для объединения значений этих столбцов в одну строку.

def combined_movie_features(row):
 return row['keywords']+" "+row['cast']+" "+row['genres']+" "+row['director']+" "+row['tagline']

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

for feature in Movie_features:
    data[feature] = data[feature].fillna('')
data['combined_movie_features'] = df.apply(combined_movie_features,axis=1)

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

Теперь пришло время подумать, что этот столбец функций представляет собой что-то вроде текстового списка , в котором на тот момент у нас было только два текста (т.е. текст-A и текст-B), но теперь у нас есть список, в котором у нас есть 1000 текста, и каждый текст является одним из movie_detail

Итак, теперь пора изменить этот текст на векторный с помощью объекта CountVectorizer ().

cvr = CountVectorizer()
count_matrix = cvr.fit_transform(df['combined_features'])

Теперь у нас есть count_matrix, в котором у нас есть вектор всего текста, который находится внутри столбца «Combined_features».

count_matrix=
[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]

Теперь нам интересно найти Сходство всего текста comb_features или всей строки count_matrix с самим собой и с другими. Для этого у нас есть функция cosine_similarity() из библиотеки sklearn.metrics.pairwise.

cosine_similarity = cosine_similarity(count_matrix)

Можете ли вы угадать размер косинусного сходства?

cosine_similarity =
[[1.         0.25692801 0.21021383 ... 0.2306328  0.25391836 0.13543224]
 [0.25692801 1.         0.15384615 ... 0.10127394 0.1672484  0.08920516]
 [0.21021383 0.15384615 1.         ... 0.10127394 0.13937367 0.0594701 ]
 ...
 [0.2306328  0.10127394 0.10127394 ... 1.         0.13762047 0.11744404]
 [0.25391836 0.1672484  0.13937367 ... 0.13762047 1.         0.09697623]
 [0.13543224 0.08920516 0.0594701  ... 0.11744404 0.09697623 1.        ]]

Форма cosine_sim - 1000 x 1000 означает, что есть 1000 строк и 1000 столбцов, потому что каждый фильм 1000 обнаруживает сходство с каждым фильмом 1000. Таким образом, каждая строка cosine_sim является показателем сходства этой строки со всеми остальными строками.

вы можете видеть, что в первой строке первый элемент cosine_sim равен 1, потому что он находит оценку сходства 1 с самим собой, затем 0,25692801, это означает оценку сходства 1 элемента со вторым, затем 0,21021383, это означает сходство 1-го с 3-м ……
Теперь вы видите, что первый элемент второй строки cosine_sim равен 0,25692801, он представляет собой оценку сходства 2-го с первым. Затем 1 он представляет собой оценку сходства 2-го со 2-м… подобным образом….

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

def get_title_from_index(index):
    return df[df['index'] == index]['title'].values[0]
def get_index_from_movie_title(title):
    return df[df['title'] == title ]['index'].values[0]
#Here index shows the  index .
# And title is the name of the movie title.

Теперь в этой ситуации у нас есть оценка подобия, теперь, если какой-либо пользователь вводит название фильма, то с помощью dataFrame мы собираемся найти идентификатор этого конкретного фильма, тогда, если мы передадим этот идентификатор в cosine_sim следующим образом cosine_sem [id], тогда мы получаем показатель схожести этого фильма со всеми другими фильмами, которые мы сохраняем в этом списке под одним действительным именем = "similar_movie". Затем мы присвоили идентификатор всем элементам этого списка с помощью Функция перечисления.После того, как мы используем функцию перечисления, этот список преобразуется в словарь, в котором ключ является индексом, а значение - оценкой сходства этого элемента с элементом, введенным пользователем. Если мы отсортируем этот словарь по значению в порядке убывания.

movie_user_likes="X-Men: Apocalypse" 
movie_index = get_index_from_movie_title(movie_user_likes)
similar_movies=list(enumerate(cosine_similarity[movie_index]))

Теперь у нас есть словарь Similar_movie, поэтому после этого мы собираемся сократить Similar_movie на основе значения, и мы сохраним все значения, кроме значения первого индекса, потому что это показатель сходства элемента с самим собой, который является максимальным сходством 1 .

sorted_similar_movies = sorted(similar_movies,key=lambda x:x[1],reverse=True)[1:]

Теперь у нас есть весь индекс и оценка подобия введенного пользователем фильма, теперь наша цель - получить этот индекс из sorted_similar_movie, и с помощью функции get_title_from_index (Rank) мы получаем имя и отображаем это имя пользователю.

i=0
print("Top 5 similar movies to "+ movie_user_likes)
for element in sorted_similar_movies:
    print(get_title_from_index(element[0]))
    i=i+1
    if i>4:
        break

Здесь мы запускаем цикл for 5 раз, чтобы получить 5 наиболее похожих фильмов.

Здесь мы печатаем аналогичный фильм в соответствии с пользовательским вводом: -

Top 5 similar movies to X-Men: Apocalypse
X-Men: Days of Future Past
X-Men: First Class
X-Men
X2
Ant-Man

Погуглите этот {фильм, похожий на "Люди Икс: Апокалипсис"}.
вы видите, что точность составляет от 80% до 82%. Четыре из них совпадают с рекомендациями Google….

Здесь ссылка на Github, если вы хотите увидеть полный код с нуля, вы можете посетить мое репозиторий Github.



Заключение:-

В этом посте вы сможете понять логику того, как Google рекомендовал фильм, похожий на те, которые вам нравятся. Итак, здесь важны данные. Вы можете создать любой механизм рекомендаций, для этого вам нужны данные. Не существует определенного способа построить или оценить механизм рекомендаций, хорошо это или плохо, важна точность. Может случиться так, что конкретный способ создания механизма рекомендаций хорош (например, точность 85%) для некоторых случаев, но может быть плохим (точность 40%) в некоторых случаях. Это базовый механизм рекомендаций, поэтому попробуйте чтобы обновить это, реализовав логику.