Thiết kế hệ thống gợi ý nhà hàng với Django và thuật toán lọc cộng tác

Thuật toán lọc cộng tác (Collaborative Filtering) là một trong những phương pháp phổ biến nhất để xây dựng các hệ thống gợi ý. Bài viết này trình bày cách triển khai hệ thống gợi ý nhà hàng bằng Django và Python.

Cơ sở của thuật toán lọc cộng tác

Lọc cộng tác có hai dạng chính: dựa trên người dùng (User-Based CF) và dựa trên mục tiêu (Item-Based CF). Ý tưởng cốt lõi là sử dụng dữ liệu hành vi lịch sử của người dùng (như đánh giá hoặc nhấp chuột) để tính toán độ tương đồng và dự đoán sở thích đối với các mục chưa được đánh giá.

  • Tính toán độ tương đồng: Các chỉ số thường được sử dụng bao gồm độ tương đồng cosine và hệ số tương quan Pearson.
  • Dự đoán điểm số: Sử dụng trung bình có trọng số dựa trên độ tương đồng của người dùng hoặc mục tiêu.

Kiến trúc hệ thống Django

Hệ thống sử dụng mô hình MTV (Model-Template-View), với các mô-đun chính gồm quản lý người dùng, dữ liệu nhà hàng, ghi chép điểm số và động cơ gợi ý.


from django.db import models

class User(models.Model):
    username = models.CharField(max_length=100)
    # Các trường khác như vị trí địa lý, sở thích ăn uống

class Restaurant(models.Model):
    name = models.CharField(max_length=200)
    cuisine_type = models.CharField(max_length=100)
    # Các trường khác như điểm trung bình, khoảng giá

class Rating(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    restaurant = models.ForeignKey(Restaurant, on_delete=models.CASCADE)
    rating = models.FloatField()  # Điểm đánh giá từ 1 đến 5

Triển khai động cơ gợi ý

Sử dụng thư viện Python như pandas hoặc scikit-surprise để thực hiện lọc cộng tác.


import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

def recommend_restaurants(user_id, ratings_df):
    # Tạo ma trận đánh giá người dùng-nhà hàng
    user_restaurant_matrix = ratings_df.pivot(index='user_id', columns='restaurant_id', values='rating')
    similarity_matrix = cosine_similarity(user_restaurant_matrix.fillna(0))
    
    # Tìm người dùng tương tự
    target_user_index = user_restaurant_matrix.index.get_loc(user_id)
    similar_users = similarity_matrix[target_user_index].argsort()[-4:-1]  # Lấy 3 người dùng tương tự
    
    # Dự đoán điểm cho các nhà hàng chưa được đánh giá
    similar_ratings = user_restaurant_matrix.iloc[similar_users]
    predictions = similar_ratings.mean(axis=0)
    return predictions.sort_values(ascending=False).head(10)  # Trả về danh sách 10 gợi ý hàng đầu

Tối ưu hóa hiệu suất và xử lý vấn đề khởi động lạnh

  • Gói phân rã ma trận: Áp dụng SVD hoặc ALS để giảm độ phức tạp tính toán.
  • Gợi ý hỗn hợp: Kết hợp lọc nội dung (ví dụ: loại nhà hàng, giá cả) để giải quyết vấn đề khởi động lạnh.
  • Cập nhật thời gian thực: Huấn luyện lại mô hình định kỳ hoặc cập nhật tăng dần ma trận tương đồng.

Thiết kế API và tương tác giao diện trước

Sử dụng Django REST Framework để tạo API RESTful:


from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['GET'])
def fetch_recommendations(request, user_id):
    ratings_data = Rating.objects.all().values('user_id', 'restaurant_id', 'rating')
    df = pd.DataFrame(list(ratings_data))
    recommendations = recommend_restaurants(user_id, df)
    return Response(recommendations.to_dict())

Giao diện người dùng có thể gọi API thông qua Ajax và hiển thị kết quả bằng Vue.js hoặc React.

Đánh giá và triển khai

  • Chỉ số đánh giá: RMSE, Độ chính xác@K (Precision@K).
  • Triển khai: Container hóa bằng Docker, sử dụng Nginx+Gunicorn.

Thẻ: Django python collaborative-filtering

Đăng vào ngày 22 tháng 6 lúc 23:10