В этой статье мы рассмотрим, как реализовать систему рекомендаций статей на вашем сайте, основываясь на пользовательских реакциях. Эта функциональность поможет пользователям находить статьи, которые могут быть для них интересны, на основе их предпочтений.
1. Постановка реакций на статьи
Для начала нам нужно реализовать функционал, позволяющий пользователям ставить оценки статьям. Это можно сделать с помощью модели, которая будет хранить оценки:
class UsefulWikiPages(models.Model):
id = models.AutoField(primary_key=True)
useful_or_not = models.CharField(max_length=20, choices=useful_or_not, default='useful')
account = models.ForeignKey(Account, on_delete=models.CASCADE)
wiki_page = models.ForeignKey(WikiPages, on_delete=models.CASCADE)
created_at = models.DateTimeField(auto_now_add=True)
2. Ввод оценок в интерфейсе
На странице каждой статьи необходимо добавить кнопки для оценки:
<div class="like">
<button class="like_button" data-like="useful">Понравилась</button>
<button class="like_button" data-like="not_useful">Не понравилась</button>
</div>
Эти кнопки отправляют POST-запросы для записи оценок в базу данных. Не забудьте настроить обработку этих запросов в вашем представлении:
class RateWikiPageView(View):
def post(self, request, pk):
wiki_page = get_object_or_404(WikiPages, pk=pk)
useful_or_not = request.POST.get('useful_or_not')
if request.user.is_authenticated:
UsefulWikiPages.objects.update_or_create(
account=request.user.account,
wiki_page=wiki_page,
defaults={'useful_or_not': useful_or_not}
)
return redirect('wikipages', pk=pk)
3. Получение оценок пользователя
Теперь, когда пользователь оценил статью, нам нужно получить его оценки для формирования рекомендаций. В представлении PersonalListWikiPagesView мы можем это сделать следующим образом:
class PersonalListWikiPagesView(View):
def get(self, request):
wiki_pages = WikiPages.objects.all()
recommended = []
if request.user.is_authenticated:
user_post_rating = UsefulWikiPages.objects.filter(account=request.user.account)
liked_posts_ids = user_post_rating.filter(useful_or_not='useful').values_list('wiki_page_id', flat=True)
disliked_posts_ids = user_post_rating.filter(useful_or_not='not_useful').values_list('wiki_page_id', flat=True)
liked_posts = WikiPages.objects.filter(id__in=liked_posts_ids)
if liked_posts.exists():
categories = liked_posts.values_list('category', flat=True).distinct()
similar_posts = WikiPages.objects.filter(category__in=categories).exclude(id__in=liked_posts_ids).exclude(id__in=disliked_posts_ids)
if similar_posts.exists():
recommended = similar_posts[:5]
return render(request, 'wikipage/personal_list_wiki_pages.html', {
'wiki_pages': wiki_pages,
'recommended': recommended,
'show_empty_space': not recommended
})
4. Обработка логики рекомендаций
Теперь давайте разберем, как работает логика в представлении:
- Сбор оценок: Мы извлекаем оценки пользователя из модели UsefulWikiPages. Это позволяет нам получить идентификаторы постов, которые пользователь оценил положительно и отрицательно.
- Фильтрация постов: Мы извлекаем все посты, которые пользователь оценил положительно, а затем ищем похожие посты, основываясь на категориях оцененных статей.
- Исключение ненужных постов: Мы исключаем посты, которые пользователь уже оценил, как положительно, так и отрицательно.
- Формирование списка рекомендаций: Если найдены похожие посты, мы добавляем их в список рекомендаций.
5. Отображение рекомендаций
В шаблоне можно легко отобразить рекомендованные статьи:
{% if recommended %}
<ul>
{% for post in recommended %}
<li>
<a href="{% url 'wikipages' post.slug %}">{{ post.title }}</a>
</li>
{% endfor %}
</ul>
{% else %}
<p>Нет рекомендуемых статей.</p>
{% endif %}
6. Возможности для дальнейшего развития
Эта система рекомендаций может быть значительно расширена и усовершенствована. Вот несколько направлений, в которых можно двигаться дальше:
- Использование тегов: Добавление тегов к статьям позволит более точно сопоставлять интересы пользователей. Вы можете хранить теги в отдельной модели и связывать их с моделями статей, чтобы учитывать не только категории, но и конкретные темы.
- Анализ поведения пользователей: Включение анализа поведения пользователей, такого как время, проведенное на странице, или количество прочтений, может помочь в более точном прогнозировании интересов.
- Совпадение тегов и категорий: Вы можете улучшить алгоритм рекомендаций, учитывая совпадения между тегами и категориями понравившихся пользователю страниц. Это поможет находить статьи, которые могут быть интересны пользователю, даже если они не относятся к тем же категориям, что и оцененные им ранее статьи.
- Машинное обучение: Использование методов машинного обучения для анализа больших объемов данных о предпочтениях пользователей может привести к созданию более точных и персонализированных рекомендаций.
Заключение
Мы рассмотрели процесс создания системы рекомендаций статей на основе пользовательских реакций. С помощью простой модели, представления и шаблонов, вы можете предоставить своим пользователям более персонализированный опыт, который будет способствовать их вовлечению и удовлетворенности.
Эта система может быть дополнительно улучшена, например, за счет анализа поведения пользователя на сайте или использования машинного обучения для более точных рекомендаций. Важно помнить, что всегда следует тестировать вашу систему и собирать обратную связь от пользователей для её дальнейшего улучшения.