Рекомендательная система (проект)
Ментор | Симагин Денис |
Учебный семестр | Весна 2016 |
Учебный курс | 1-й курс |
Проект можно развивать на летней практике | |
Максимальное количество студентов, выбравших проект: 8 | |
Семинар проекта можно найти здесь.
Что это за проект?
Создание рекомендательной системы статей. Предметная область может варьироваться: новости, посты на хабре, твиты и т.п. (можно предложить свой вариант). Предполагается создание самодостаточной системы, которая делает следующее:
- Обходит ресурс и скачивает его статьи
- Предоставляет интерфейс прочтения статьи и ее оценивания
- Предлагает пользователю наиболее интересные статьи на основе его оценок
В качестве примера можно взять сервис Яндекс Zen.
Проект состоит из двух частей. Первая является обязательной и необходима для получения оценки 4 (зачет):
- Реализация crawler-а, собирающего статьи;
- Создание некоторой консольной утилиты, позволяющей: ставить оценки, обучать модель и смотреть рекомендации. Обучение проводится с помощью линейного классификатора на основе модели мешка слов. Для обучения предполагается использовать готовую библиотеку Scikit learn.
Хочется, чтобы проект был интересен как можно большему количеству человек. Поэтому следующая часть является вариативной. Она состоит из заданий на выбор, при этом выполнение каждого стоит какое-то количество баллов:
- Линейный классификатор на Python (2 + 1). На основе библиотеки SciPy необходимо написать собственный линейный классификатор. В качестве образца интерфейса можно взять реализацию из Scikit learn (2 балла). Дополнительные баллы можно получить, если реализован hashing trick (1 балл).
- Линейный классификатор на С++ и обертка для Python (3 + 1). Необходимо реализовать линейный классификатор на С++. Для задач линейной алгебры можно использовать сторонние библиотеки, к примеру boost::uBLAS. Для полученного класса необходимо сделать Python обертку. В этом вам может помочь библиотека boot::python (3 балла). Дополнительные баллы можно получить, если реализован hashing trick (1 балл).
- Семантическое ядро языка (1 + 1). Необходимо выделить семантическое ядро вашего ресурса и заново обучить модель, качество предсказание должно улучшиться (1 балл). За проведенный анализ различных подходов или анализ параметров применяемого подхода можно получить дополнительный баллы (1 балл).
- Свежесть статьи (2). Статьи имеют такое свойство, как устаревать. Нет смысла, к примеру, показывать новости годичной давности. Студенту предоставляется возможность предложить свой способ учета свежести в процессе рекомендации.
- Удаление дубликатов (2). Порой статьи того или иного ресурса дублируют себя, к примеру, много твитов может быть посвящено выходу нового эпизода "Звездных войн". Нет смысла показывать их все, даже если они очень интересны пользователю. Такие дубликаты необходимо объединять в группы и показывать только одного представителя. Алгоритмы поиска дубликатов есть разные, необходимо выбрать какой-то из них и реализовать.
- Exploitation + exploration (4). Предполагается, что пользователь просматривает статьи последовательно. Система должна соблюдать баланс между тем, чтобы предлагать пользователю наиболее интересные стать и тем, чтобы как можно лучше изучить его предпочтения. Для этого студенту предоставляется возможность разобраться в теме reinforcement learning и преложить свое решение.
- Распределенный crawler (4). Реализация распределенной версии crawler-а, которая предполагает наличие мастера, нескольких работающих блоков и очереди с заданиями.
- Простой web-сервер на Django (4). Необходимо реализовать простейший wеb-сервер на основе библиотеки Django. Сервис должен предоставлять собой одну страницу, на которой показана статья. Пользователь может оценить статью (нравится/не нравится) и попросить систему предложить ему новую. Загрузку статьи и постановку оценки необходимо реализовать через AJAX.
- Улучшение качества классификатора (6). Если у студента есть какие-то предложения по улучшению качества классификатора, то он может предложить и реализовать их. При этом качество должно значимо улучшиться (до 6 баллов).
Чему вы научитесь?
Вы точно пройдете все круги ада, от прототипирования интерфейсов до тестирования. А если серьезно, то вы точно:
- Будете работать с UNIX-подобной системой
- Пройдете систему ревью, тестирования, научитесь работать с Git
- Поработаете с сетью, получите опыт работы с большим объемом текстовых данных
- Получите базовые навыки по машинному обучению, познакомитесь с популярной библиотекой Scikit learn
В зависимости от выбранных заданий вы можете:
- Познакомиться с базами данных
- Узнаете интересные вещи о обработке текстов и машинном обучении
- Создадите самый настоящий web-сервис
- Научитесь делать обертку для Python
Какие начальные требования?
- Наличие машины с UNIX-подобной ОС.
- Базовые знания Python и желание интенсивно изучать этот язык.
Какие будут использоваться технологии?
Вы точно будете использовать:
- UNIX-подобную ОС + вашу любимую командную оболочку
- Python 3 + познакомиться с Scikit learn и SciPy.
- Поработаете с Git.
В зависимости от выбранных заданий вы можете изучить:
- Библиотеку Django + HTML + AJAX
- Одну из популярных баз данных
- Библиотеку boost::python
- Библиотеку boost::uBlas
Темы вводных занятий
- Обсуждение общих организационных вопросов
- Введение в Git
- Введение в машинное обучение. Линейный классификатор
- При необходимости можно провести несколько занятий по Python 3
В зависимости от состава группы и выбранных частей могут быть проведены дополнительные занятия, посвященный той или иной тематике.
Направления развития
- Развитие серверной части. Улучшение web-интерфейса и развитие функциональности ресурса. Ровняться можно опять же на Яндекс Zen.
- Улучшение качества рекомендаций. Тут работа просто безгранична. Можно применять новые модели, развивать систему, когда с ней работает несколько пользователей и т.д.
- Масштабирование. Можно работать в инженерном плане. Увеличивать отказоустойчивость системы, ускорять ее работу, устойчивость к нагрузкам.
Критерии оценки
Итог складывается из общей суммы заданий, которые выполнены успешно. Я твердый сторонник идеи, что кроме технических навыков человек должен обладать хорошими умениями общения и коммуникации, в том числе и искусством презентовать свою работу. Поэтому для получения 10 баллов необходимо хорошее выступление на защите проекта, иначе оценка будет не выше 9.
Ориентировочное расписание занятий
Если группа студентов согласиться проводить занятия в Яндексе то это будет любое удобное для них время во вторник, среду или четверг. В Вышке занятия я могу проводить только по средам. О времени договоримся.