Рекомендательная система (проект) — различия между версиями

Материал из Wiki - Факультет компьютерных наук
Перейти к: навигация, поиск
(Рефакторинг критериев оценки)
(Поправил описание проекта в соотвествии с замечаниями)
Строка 11: Строка 11:
  
 
=== Что это за проект? ===
 
=== Что это за проект? ===
Создание [https://en.wikipedia.org/wiki/Recommender_system рекомендательной системы], которая собирает статьи c некоторого интернет-ресурса, обучается на основе оценок пользователя и предлагает ему для прочтения наиболее интересные. Это может быть рекомендательная система новостей, постов на Хабре, твитов и т.п. (можно предложить свой вариант). В ходе взаимодействия пользователь (а им будет сам студент ;) ) ставит отметку предложенной статье (нравится или не нравится) . Эта информация агрегируется, и на основе ее обучается [https://en.wikipedia.org/wiki/Linear_classifier линейный классификатор] поверх модели [https://en.wikipedia.org/wiki/Bag-of-words_model мешка слов].
+
Создание [https://en.wikipedia.org/wiki/Recommender_system рекомендательной системы] статей. Предметная область может варьироваться: новости, посты на хабре, твиты и т.п. (можно предложить свой вариант). Предполагается создание самодостаточной системы, которая делает следующее:
 +
# Обходит ресурс и скачивает его статьи
 +
# Предоставляет интерфейс прочтения статьи и ее оценивания
 +
# Предлагает пользователю наиболее интересные статьи на основе его оценок
 +
В качестве примера можно взять сервис [https://zen.yandex.ru Яндекс Zen].
  
Проект состоит из двух обязательных частей, которые нужно выполнить для оценки 4 (зачет):
+
Проект состоит из двух частей. Первая является обязательной и необходима для получения оценки 4 (зачет):
 
# Реализация [https://en.wikipedia.org/wiki/Web_crawler crawler-а], собирающего статьи;
 
# Реализация [https://en.wikipedia.org/wiki/Web_crawler crawler-а], собирающего статьи;
# Реализация линейнего классификатора и консольной утилиты, позволяющей читать и оценивать статьи.
+
# Создание некоторой консольной утилиты, позволяющей: ставить оценки, обучать модель и смотреть рекомендации. Обучение проводится  с помощью [https://en.wikipedia.org/wiki/Linear_classifier линейного классификатора] на основе модели [https://en.wikipedia.org/wiki/Bag-of-words_model мешка слов]. Для обучения предполагается использовать готовую библиотеку [http://scikit-learn.org/ Scikit learn].
  
Также есть части на выбор:
+
Хочется, чтобы проект был интересен как можно большему количеству человек. Поэтому следующая часть является вариативной. Она состоит из заданий на выбор, при этом выполнение каждого стоит какое-то количество баллов:
# Реализация web-интерфейса на основе библиотеки Django (4 балла);
+
# '''Линейный классификатор на Python (2 + 1).''' На основе библиотеки [http://www.scipy.org SciPy] необходимо написать собственный линейный классификатор. В качестве образца интерфейса можно взять реализацию из Scikit learn (2 балла). Дополнительные баллы можно получить, если реализован [https://en.wikipedia.org/wiki/Feature_hashing hashing trick] (1 балл).
# Поиск похожих документов по коллекции, удаление дубликатов (2 балла);
+
# '''Линейный классификатор на С++ и обертка для Python (3 + 1).''' Необходимо реализовать линейный классификатор на С++. Для задач линейной алгебры можно использовать сторонние библиотеки, к примеру [http://www.boost.org/doc/libs/1_59_0/libs/numeric/ublas/doc/index.html boost::uBLAS]. Для полученного класса необходимо сделать Python обертку. В этом вам может помочь библиотека [http://www.boost.org/doc/libs/1_59_0/libs/python/doc/index.html boot::python] (3 балла). Дополнительные баллы можно получить, если реализован [https://en.wikipedia.org/wiki/Feature_hashing hashing trick] (1 балл).
# Выделение семантического ядра языка (1 балл);
+
# '''Семантическое ядро языка (1 + 1).''' Необходимо выделить [https://ru.wikipedia.org/wiki/Семантическое_ядро семантическое ядро] вашего ресурса и заново обучить модель, качество предсказание должно улучшиться (1 балл).  За проведенный анализ различных подходов или анализ параметров применяемого подхода можно получить дополнительный баллы (1 балл).
# Реализация распределенного crawler-а (master + workers + queue) (3 балла );
+
# '''Свежесть статьи (2).''' Статьи имеют такое свойство, как устаревать. Нет смысла, к примеру, показывать новости годичной давности. Студенту предоставляется возможность предложить свой способ учета свежести в процессе рекомендации.
# Реализация линейнего классификатора в виде C/C++ модуля для Python 3 (3 балла);
+
# '''Удаление дубликатов (2).''' Порой статьи того или иного ресурса дублируют себя, к примеру, много твитов может быть посвящено выходу нового эпизода "Звездных войн". Нет смысла показывать их все, даже если они очень интересны пользователю. Такие дубликаты необходимо объединять в группы и показывать только одного представителя. Алгоритмы поиска дубликатов есть разные, необходимо выбрать какой-то из них и реализовать.
# Предложить алгоритм учета свежести статьи  в процессе рекомендации (2 балла);
+
# '''Exploitation + exploration (4).''' Предполагается, что пользователь просматривает статьи последовательно. Система должна соблюдать баланс между тем, чтобы предлагать пользователю наиболее интересные стать и тем, чтобы как можно лучше изучить его предпочтения. Для этого студенту предоставляется возможность разобраться в теме [https://en.wikipedia.org/wiki/Reinforcement_learning reinforcement learning] и преложить свое решение.
# Применить подход однорукого бандита для выбора следующей статьи для показа/обучения (3 балла);
+
# '''Простой web-сервер на  Django (4).''' Необходимо реализовать простейший wеb-сервер на основе библиотеки [https://www.djangoproject.com Django]. Сервис должен предоставлять собой одну страницу, на которой показана статья. Пользователь может оценить статью (нравится/не нравится) и попросить систему предложить ему новую. Загрузку статьи и постановку оценки необходимо реализовать через [https://en.wikipedia.org/wiki/Ajax_(programming) AJAX].
# Предложить и реализовать улучшение базового классификатора (до 6 баллов).
+
# '''Улучшение качества классификатора (6).''' Если у студента есть какие-то предложения по улучшению качества классификатора, то он может предложить и реализовать их. При этом качество должно значимо улучшиться (до 6 баллов).
  
 
=== Чему вы научитесь? ===
 
=== Чему вы научитесь? ===

Версия 14:06, 17 декабря 2015

Ментор Симагин Денис
Учебный семестр Весна 2016
Учебный курс 1-й курс
Проект можно развивать на летней практике
Максимальное количество студентов, выбравших проект: 8



Что это за проект?

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

  1. Обходит ресурс и скачивает его статьи
  2. Предоставляет интерфейс прочтения статьи и ее оценивания
  3. Предлагает пользователю наиболее интересные статьи на основе его оценок

В качестве примера можно взять сервис Яндекс Zen.

Проект состоит из двух частей. Первая является обязательной и необходима для получения оценки 4 (зачет):

  1. Реализация crawler-а, собирающего статьи;
  2. Создание некоторой консольной утилиты, позволяющей: ставить оценки, обучать модель и смотреть рекомендации. Обучение проводится с помощью линейного классификатора на основе модели мешка слов. Для обучения предполагается использовать готовую библиотеку Scikit learn.

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

  1. Линейный классификатор на Python (2 + 1). На основе библиотеки SciPy необходимо написать собственный линейный классификатор. В качестве образца интерфейса можно взять реализацию из Scikit learn (2 балла). Дополнительные баллы можно получить, если реализован hashing trick (1 балл).
  2. Линейный классификатор на С++ и обертка для Python (3 + 1). Необходимо реализовать линейный классификатор на С++. Для задач линейной алгебры можно использовать сторонние библиотеки, к примеру boost::uBLAS. Для полученного класса необходимо сделать Python обертку. В этом вам может помочь библиотека boot::python (3 балла). Дополнительные баллы можно получить, если реализован hashing trick (1 балл).
  3. Семантическое ядро языка (1 + 1). Необходимо выделить семантическое ядро вашего ресурса и заново обучить модель, качество предсказание должно улучшиться (1 балл). За проведенный анализ различных подходов или анализ параметров применяемого подхода можно получить дополнительный баллы (1 балл).
  4. Свежесть статьи (2). Статьи имеют такое свойство, как устаревать. Нет смысла, к примеру, показывать новости годичной давности. Студенту предоставляется возможность предложить свой способ учета свежести в процессе рекомендации.
  5. Удаление дубликатов (2). Порой статьи того или иного ресурса дублируют себя, к примеру, много твитов может быть посвящено выходу нового эпизода "Звездных войн". Нет смысла показывать их все, даже если они очень интересны пользователю. Такие дубликаты необходимо объединять в группы и показывать только одного представителя. Алгоритмы поиска дубликатов есть разные, необходимо выбрать какой-то из них и реализовать.
  6. Exploitation + exploration (4). Предполагается, что пользователь просматривает статьи последовательно. Система должна соблюдать баланс между тем, чтобы предлагать пользователю наиболее интересные стать и тем, чтобы как можно лучше изучить его предпочтения. Для этого студенту предоставляется возможность разобраться в теме reinforcement learning и преложить свое решение.
  7. Простой web-сервер на Django (4). Необходимо реализовать простейший wеb-сервер на основе библиотеки Django. Сервис должен предоставлять собой одну страницу, на которой показана статья. Пользователь может оценить статью (нравится/не нравится) и попросить систему предложить ему новую. Загрузку статьи и постановку оценки необходимо реализовать через AJAX.
  8. Улучшение качества классификатора (6). Если у студента есть какие-то предложения по улучшению качества классификатора, то он может предложить и реализовать их. При этом качество должно значимо улучшиться (до 6 баллов).

Чему вы научитесь?

Вы точно пройдете все круги ада, от прототипирования интерфейсов до тестирования.

В зависимости от выбранных заданий вы можете:

  • получить опыт написания кода на Python, создать собственный модуль для языка;
  • научиться работать с UNIX-подобной системой;
  • изучить одну из популярных баз данных;
  • узнать, что такое машинное обучение.

Какие начальные требования?

  • Наличие машины с UNIX-подобной ОС.
  • Базовые знания Python или желание интенсивно изучать этот язык.

Какие будут использоваться технологии?

Вы точно будете использовать:

  • UNIX-подобную ОС + вашу любимую командную оболочку;
  • Python 3;
  • Git.

В зависимости от выбранных заданий вы можете изучить:

  • Библиотеку Django;
  • Одну из популярных баз данных;
  • Библиотеку boost::python.

Темы вводных занятий

  • Обсуждение общих организационных вопросов.
  • Введение в Git.
  • Введение в машинное обучение. Линейный классификатор.

При необходимости можно провести несколько занятий по Python 3.

Направления развития

  • Cоздание красивого web-интерфейса.
  • Улучшение качества классификации.
  • Масштабирование.

Критерии оценки

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

Ориентировочное расписание занятий

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

  • ВТ 8:00-12:00
  • ЧТ 8:00-12:00