Введение.
Сегодня больше, чем когда-либо, мы связаны со всем миром благодаря Интернету, а это означает, что контент, к которому у нас есть доступ, огромен, и среди всего этого контента может быть трудно найти конкретный контент. Именно здесь вступают в действие рекомендатели — алгоритмы, отвечающие за знание ваших вкусов посредством входных данных (таких как лайки или звезды) или посредством взаимодействий (например, времени, которое вы тратите на просмотр некоторого контента).
Вы можете получить дополнительную информацию о рекомендательных системах в следующей статье на среднем уровне: https://towardsdatascience.com/introduction-to-recommender-systems-6c66cf15ada.
Сбор данных
Набор данных, который мы используем в этом проекте, следующий: Book Genome Dataset | ГруппЛенс.
Набор данных в формате .json, что неудобно при работе с данными. Поэтому нам придется извлечь данные и поместить их в .csv.
Теперь, имея CSV, мы импортируем их с фреймом данных, чтобы начать работать.
df_recipes = pd.read_csv("Book_P_Path.csv") moovieData = pd.read_csv("Movie_P_Path.csv") bookData = pd.read_csv("Book_P_Path.csv") bookDataParse = bookData["Tags"].values.astype('U')
Создание рекомендателя
Косинусное сходство
В этом проекте используется косинусное сходство, состоящее изизмерения, которое количественно определяет сходство между двумя или более векторами. Косинусное сходство — это косинус угла между векторами. Векторы обычно не равны нулю и находятся в пространстве внутреннего произведения.
TF-IDFVectorizer
Косинусное сходство принимает только числовые значения, а у нас есть только строки, то есть теги типа «Фэнтези» или «Романтика», поэтому мы должны преобразовать эти значения.
Мы используем векторизатор as для решения этой проблемы:
movies_tfidf = newTfidf.transform( moovieData[ moovieData["item_id"] == int(movieID)]["Tags"])
Здесь newTfid — предварительно вычисленные веса TDFID.
Теперь с нашими числовыми данными мы можем вычислить сходство косинусов следующим образом:
from sklearn.metrics.pairwise import cosine_similarity cos_sim = map(lambda x: cosine_similarity(movies_tfidf, x), tfidf_recipe)
Собираем все вместе
Мы можем создать функцию, которая принимает первые N рекомендаций.
def get_recommendations(N, scores ): # order the scores with and filter to get the highest N scores top = sorted(range(len(scores)), key= (lambda i: scores[i]), reverse=True) #sorted_indexes = np.argsort(scores[0])[::-1] # create dataframe to load in recommendations return json.dumps( df_recipes.iloc[top].values[:N].tolist())
Теперь функция, которая вызывает векторизатор и вычисляет косинусное сходство
def Recomendar(movieID): movies_tfidf = nweTfidf.transform( moovieData[ moovieData["item_id"] == int(movieID)]["Tags"]) cos_sim = map(lambda x: cosine_similarity(movies_tfidf, x), tfidf_recipe) scores = list(cos_sim) # In this case we want the top 5 recommendations return get_recommendations(5, scores)
Развертывание Heroku
Давайте импортируем необходимые инструменты для развертывания.
from flask import Flask, request, jsonify from flask_restful import Resource, Api from flask_cors import CORS import json
Давайте инициализируем приложение для развертывания
app = Flask(__name__) api = Api(app) CORS(app)
Давайте создадим два маршрута, один для информирования вас о статусе API, а другой для рекомендаций. Во-первых, нам нужно создать класс, который выводит статус
class status (Resource): def get(self): try: return {'data': 'Api is Running'} except: return {'data': 'An Error Occurred during fetching Api'}
Теперь давайте создадим класс, который вызывает рекомендателя.
class Recommender(Resource): def get(self): # This line create the new route "/recommender?books=", # in the next block of code you will see where "/recommender" came from books = request.args.get('books') return jsonify({'data': Recomendar(books)})
Создадим сами маршруты.
api.add_resource(status, '/') # here is where the route cam from! api.add_resource(Recommender, '/recommender')
И давайте создадим main для API
if __name__ == '__main__': app.run()
Итак, теперь мы создаем приложение heroku и выполняем развертывание. Посетите нашего рекомендателя по ссылке ниже!