Файл: Курсовая работа по курсу Программная инженерия.docx

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 04.05.2024

Просмотров: 21

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ

ФГБОУ ВО «АЛТАЙСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ»

Институт математики и информационных технологий

Кафедра математического анализа

ДЛИННОЕ И СЛОЖНОЕ НАЗВАНИЕ КУРСОВОЙ РАБОТЫ (Курсовая работа по курсу «Программная инженерия»)

Выполнил:

студент 405 группы,

Гришанов Ярослав Иванович

_______________________

(подпись)
Научные руководители:

к.ф.-м.н., доцент Оскорбин Д.Н.,

доцент кафедры математического анализа Пономарев И. В.

_______________________

(подписи)


Работа защищена:

«___»_______________ 2022 г.
Оценка:_________________

Барнаул 2022

СОДЕРЖАНИЕ



ВВЕДЕНИЕ


Всем коммерческим организациям важно максимизировать выручку со своей деятельности. Сделать это можно многими способами и один из них: сделать потенциального покупателя реальным. С подобными задачами справляются рекомендательные системы. Многие крупные компании активно используют их. Так, например, у зарубежной компании Netflix 80% стримингового времени достигнуто благодаря персональным рекомендациям, а компании Amazon и Alibaba ориентировочно повысили свою выручку на 35% только благодаря системе рекомендаций.

На протяжении нескольких последних лет количество информации - - - -

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

Логика рекомендательных систем


Рекомендательные системы можно разделить на 3 вида:

Основанные на контенте (content-based)


В content-based подходе рекомендации основаны на данных, собранных о конкретном товаре. К примеру, это может быть жанр фильма или музыки. Пользователю рекомендуются объекты, наиболее похожи на те, которыми он ранее интересовался.

Коллаборативные (collaborative)


Коллаборативные системы предполагают наличие матрицы оценок пользователь-объект. Идея заключается в том, что для каждого пользователя необходимо найти наиболее «похожих» соседей и заполнить пропуски в оценках для каждого пользователя. (картинка)

Аналогичным образом можно оценивать схожесть объектов, считая, что похожие нравятся схожим пользователям.

Гибридные (hybrid)


Они основаны на комбинировании контентных и коллаборативных методов. Такой подход позволяет избежать большинства недостатков, свойственных каждой системе.

Проблемы моделей



Проблема «холодного старта»


Когда у системы есть объемное количество данных, то это лучшие условия для её корректной работы, однако, на практике часто бывает иначе. Данная проблема появляется тогда, когда мы ничего, или мало знаем о пользователе, и, следовательно, не ясно что в таком случае ему рекомендовать.

Интерпретация данных


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

Последовательность действий


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

Метрики, способ и описать все шаги, ещё что-нибудь

ПОДГОТОВКА ДАННЫХ



Критерии


Как и говорилось ранее, процесс создания модели рекомендательной системы начинается со сбора данных об объекте рекомендаций и о пользователях, с которыми данная модель будет работать. Согласно названию работы, модель будет ориентирована на пользователей социальной сети VK, именно для них проект и разрабатывается. В качестве объектов рекомендаций были выбраны сообщества из той же социальной сети. Таким образом система рекомендаций будет направлена на то, чтобы предложить пользователям наиболее релевантные сообщества, основываясь на их действиях.

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

Первым, и более важным критерием будет отметка «Мне нравится» на записи сообщества. Этот выбор можно обосновать тем, что данная отметка изначально создана для того, чтобы показать положительное отношение пользователя к объекту (записи). Однако здесь стоит учесть то, что пользователи могут быть разными. Некоторые ставят отметку «Мне нравится» часто, иные наоборот – редко. Подобных пользователей нельзя считать одинаковыми, так как значимость каждой отдельной отметки «Мне нравится» для них разная. Один из вариантов решения – это рассматривать не само количество отметок, а процент от их общего количества. Таким образом можно будет выявить степень различий между пользователями и учитывать их в дальнейшем при построении модели.

Вторым, по значимости, критерием является «репост» записи. Репост также, как и Мне нравится является показателем положительного отношения пользователя к объекту, однако у них есть отличия. Репост позволяет сохранить понравившийся объект у себя в профиле, из которых, в последствии получается коллекция. Но почему же тогда значимость репоста ниже, чем значимость отметки «Мне нравится»? Все дело в том, что за последние несколько лет наблюдается тренд по сокращению общего количества репостов пользователями во всей социальной сети VK, то есть это все ещё мощный критерий, но несколько устаревший в наше время.

Сбор данных


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

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

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

  • https://oauth.vk.com/authorize? – адрес для авторизации ключа доступа

  • client_id – параметр, необходимый для идентификации того, кто отправляет запрос, здесь можно использовать идентификатор приложение, которое было зарегистрировано ранее.

  • display – параметр, отвечающий за способ отображения страницы авторизации

  • redirect_uri – адрес, на который будет передан ключ доступа

  • response_type – вид, в котором сервер отправит ключ доступа

Теперь, когда ключ доступа получен, появилась возможность отправлять запросы на сервер. Ответы будут приходить в специальном формате – JSON. Этот формат очень похож на словарь – структура данных, реализованная на языке программирования Python, поэтому его удобно использовать для хранения данных.

Метод Groups.getMembers


Данный метод у объекта Groups используется для получения списка участников в сообществе. В рамках данной работы, в выборке будут учитываться участники официального сообщества ИМиИТ в VK.

Метод имеет следующие параметры:

  • access_token – ключ доступа. Он был получен и описан в предыдущем параграфе.

  • group_id – уникальный идентификатор сообщества, с его помощью метод получает конкретную ссылку.

Отправив запрос на сервер, передав данный метод, ответом придет JSON объект, необходимый список участников будет расположен в поле под названием items.

Метод Groups.get


Данный метод у объекта Groups позволяет получить список сообществ у конкретного пользователя.

Параметры метода:

  • access_token – ключ доступа.

  • user_id – уникальный идентификатор пользователя.

На данном этапе программно заполняется структура словаря. В качестве ключа выступает user_id, полученный с помощью метода .getMembers, в качестве значения – список идентификаторов сообществ, на которые пользователь подписан.

Метод .execute


Максимальное количество обращений к сервисным методам зависит от числа пользователей, которые установили зарегистрированное приложение. Для приложений, у которых участников меньше 10 000 это количество равно пяти. Однако, с помощью метода .execute можно увеличить количество запросов до 25. Более того скорость выполнения запросов, написанных на данном языке быстрее.

Параметры метода:

  • access_token – ключ доступа.

  • code – в этот параметр передается код, написанный на специальном языке от VK, который создан как раз для того чтобы работать с их API. Синтаксис языка похож на JavaScript. Обязательным условием является то, что код должен завершаться командой return %выражение%.

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

Метод Wall.get


Чтобы в будущем узнать стоит ли отметка «Мне нравится» или репост у пользователя на записи, для начала их требуется получить. Данный метод вернет полную информацию об определённом количестве записей, однако необходимым является только идентификатор записи.

Параметры метода:

  • access_token – ключ доступа.

  • owner_id – данный идентификатор указывает на то, откуда необходимо делать выборку постов, здесь передается идентификатор сообщества, который был получен методом Groups.get со знаком «-».

  • count – параметр, отвечающий за количество записей, которое вернет метод.


Метод Likes.isLiked


Теперь для каждой записи необходимо узнать поставил ли пользователь отметку «Мне нравится» или сделал ли он репост записи. При помощи данного метода можно узнать оба критерия сразу.

Параметры метода:

  • access_token – ключ доступа.

  • user_id – уникальный идентификатор пользователя, для которого необходимо узнать наличие Мне нравитсяа/репоста на объекте.

  • owner_id – уникальный идентификатор владельца Like-объекта.

  • type – тип объекта, в данном случае используется «post».

  • item_id – уникальный идентификатор записи.

Таким образом, в качестве ответа сервер вернет JSON объект, состоящий из двух полей:

liked – наличие отметки «Мне нравится» на объекте от текущего пользователя (0 – отсутствие отметки, 1 – её наличие).

copied – сделан ли репост текущим пользователем (0 –не сделан, 1 – сделан).

Выводы


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

Программная реализация



Библиотеки


Первым делом необходимо подключить следующие библиотеки. За работу с удаленным сервером отвечает библиотека requests, она обладает необходимым методом get, который позволит отправлять GET-запросы на удаленный сервер VK с компьютера. Также пригодится библиотека json. В ней присутствуют необходимые методы для десериализации JSON объектов.

import requests

import json

Авторизация


(жду разрешения от вк на автоматическую авторизацию)

Список пользователей


Создаем переменную user_list, это будет список всех участников официального сообщества ИМиИТ. С помощью метода .get у объекта requests отправляем GET-запрос на сервер VK. Указываем необходимые параметры. Ответом на запрос придет JSON файл, при помощи подключенной ранее библиотеки сразу же десериализуем его и вычленяем список участников, который находится в ключе items.
users_list = requests.get(

    "https://api.vk.com/method/groups.getMembers?",

    params={

        "access_token": user_token,

        "v": version_API,

        "group_id": domain,

    }

).json()["response"]["items"]
Далее создаём пустой словарь users, у него будет реализована следующая структура: Уникальный идентификатор пользователя будет выступать в роли ключа, а список групп, на которые подписан пользователь будут являться значением, доступным по ключу. После создания, пустой словарь итеративно заполняется. При этом, могут возникнуть трудности, к примеру, если у пользователя закрытый профиль, то при десериализации в JSON файле будет отсутствовать ключ items, и возникнет исключение. Чтобы предотвратить такой исход, используется конструкция try-except. Теперь, при возникновении подобной ситуации, исключение будет программно перехватываться, и программа продолжит работать, при этом удастся избежать пустой записи в словарь.
users = {}

for user in users_list:

    try:

        users.update(

            {

                user: requests.get(

                    "https://api.vk.com/method/groups.get?",

                    params={

                        "access_token": user_token,

                        "v": version_API,

                        "user_id": user,

                        "count" : 80

                    },

                ).json()["response"]["items"]

            }

        )

    except:

        pass