Введение.

Сегодня больше, чем когда-либо, мы связаны со всем миром благодаря Интернету, а это означает, что контент, к которому у нас есть доступ, огромен, и среди всего этого контента может быть трудно найти конкретный контент. Именно здесь вступают в действие рекомендатели — алгоритмы, отвечающие за знание ваших вкусов посредством входных данных (таких как лайки или звезды) или посредством взаимодействий (например, времени, которое вы тратите на просмотр некоторого контента).

Вы можете получить дополнительную информацию о рекомендательных системах в следующей статье на среднем уровне: 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 и выполняем развертывание. Посетите нашего рекомендателя по ссылке ниже!