Как я сделала систему рекомендаций по схемам вязания

Некоторое время назад я опубликовал серию статей о том, как начать и закончить проект (их можно найти здесь, здесь и здесь). Проект, о котором я говорил в этих статьях, доступен здесь. На этом веб-сайте вы можете ввести URL-адрес шаблона с Ravelry (обычно используемый веб-сайт для вязания), и он создаст URL-адрес поиска, который генерирует похожие шаблоны. Однако это было всего лишь ответвлением моего более крупного проекта: создание программы, которая генерирует персонализированные рекомендации по шаблону. На прошлой неделе я закончил бэкенд этого проекта, и теперь я собираюсь объяснить шаги, которые я использовал для создания этой системы рекомендаций по шаблонам.

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

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

Возвращаясь к своему личному проекту, я решил, что, вероятно, будет проще создать рекомендателя на основе контента (по крайней мере, на данный момент). Оттуда я исследовал рекомендателей на основе контента. Это исследование привело меня к этой статье, на которой я основывал свою рекомендацию.

Есть два основных компонента, которые вам нужны для любого рекомендателя на основе контента: информация о пользователе и пул элементов. Информация о пользователе может быть либо в форме профиля пользователя, в котором записано все, что вам нравится или не нравится, либо в форме того, на что вы смотрите в данный момент. Пул элементов — это, по сути, группа элементов, которые могут быть рекомендованы пользователю. Подобный поиск паттернов, который был моим первым проектом, ссылка на который приведена выше, по сути является рекомендателем, который просто принимает во внимание то, на что вы смотрите, пул элементов — это все на Ravelry, а рекомендации — это результаты поиска, отображаемые в сгенерированном URL. Тем не менее, проект, который я только что завершил, создает профиль пользователя, и это помогает в создании рекомендаций по шаблону.

По сути, этот рекомендатель состоит из 3 шагов:

  1. Создать профиль пользователя
  2. Создание пула шаблонов
  3. Определите, какие шаблоны лучше всего соответствуют интересам пользователя

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

Создать профиль пользователя

В этом случае, когда я говорю о профиле пользователя, я имею в виду словарь атрибутов элемента и оценку, которая показывает, насколько пользователю нравится данный атрибут. Погружаясь немного глубже, в данном случае атрибуты элемента означают атрибуты данного шаблона. Атрибуты, которые я использую в этом рекомендательном документе, — это категория узора (аксессуар или предмет одежды, шапка или шарф), атрибут узора (конструкция снизу вверх или сверху вниз, многослойная цветная вышивка или интарсия) и вес пряжи (объемная ткань или кружево и т. д.). ). Теперь самое интересное: как я определил, насколько пользователю нравится данный атрибут:

Если вы посмотрите на профиль пользователя на Ravelry (не путать с профилем пользователя, созданным моей программой), вы увидите это в правом верхнем углу:

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

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

Как вы понимаете, в моих любимых паттернах намного больше шаблонов, чем в моих проектах, и я думаю, что могу с уверенностью сказать, что это верно для многих пользователей Ravelry. Наличие шаблона в ваших избранных — это все равно, что сказать: «Да, мы обязательно должны когда-нибудь выпить кофе», а наличие шаблона в ваших проектах на самом деле означает получение кофе. Очевидно, что человек, с которым вы пьете кофе, имеет более высокий приоритет, чем человек, с которым вы теоретически хотели бы выпить кофе. Поэтому в моей колонке пользовательских данных каждому паттерну присваивалась либо единица, если он был у них в избранном, либо тройка, если он был в их проектах и ​​не оценивался (вы можете оценить, насколько вы довольны своим проектом по шкале от 1 до 5, но это необязательно), и саму оценку, если проект был оценен.

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

Вернемся к нашей таблице, где каждая строка является шаблоном, а каждый столбец — атрибутом шаблона. Теперь у нас есть этот новый столбец, пользовательские данные. Чтобы создать наш профиль пользователя, мы берем точечный продукт каждого столбца в таблице и столбца данных пользователя. Это оставляет нас с новой строкой, профилем пользователя, где каждое число является скалярным произведением столбца данных пользователя и столбца атрибутов шаблона.

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

Создайте пул шаблонов

(Я обещаю, что это не так сложно, как последний шаг)

Теперь, когда у нас есть профиль, нам нужно сгенерировать кандидатов на выбор. Если пользователь не имеет в виду ничего особенного, пулом будет просто то, что появляется в последнем популярном поиске. Однако, если у них есть что-то на уме, например шаблон, который им уже нравится, они могут указать URL-адрес этого шаблона, и пул шаблонов будет шаблонами, которые будут сгенерированы при поиске аналогичного шаблона.

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

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

Определите, какие шаблоны лучше всего соответствуют интересам пользователя

У нас есть наш пул и наш профиль, а это значит, что у нас есть вся информация, необходимая для подбора матчей.

Итак, помните, как мы взяли скалярное произведение каждого столбца и столбца данных пользователя, чтобы создать этот профиль пользователя? По сути, мы собираемся сделать то же самое, но на этот раз со строками вместо столбцов. Очевидно, прежде чем мы это сделаем, мы убеждаемся, что все выровнено, добавляя фиктивные значения в профиль пользователя, если в таблице есть атрибут, которого нет в профиле, и добавляя фиктивный столбец в пул, если он есть только в профиле пользователя. Эти точечные произведения создают новый столбец, который показывает, насколько данный шаблон соответствует интересам пользователя. Например, вот скриншот паттернов, которые моя программа рекомендовала мне после того, как я попросил паттерны, похожие на этот:

Пользовательский интерфейс для этой программы скоро появится, так что следите за обновлениями, когда вы тоже сможете его использовать!

Ниже представлен репозиторий этого проекта: