Giới thiệu dự án

Bối cảnh và thực trạng ngành F&B

Theo số liệu thống kê từ Dcorp R-Keeper, thị trường dịch vụ ẩm thực (F&B - Food and Beverage) tại Việt Nam ghi nhận hơn 540.000 cơ sở kinh doanh ăn uống, bao gồm 430.000 quán ăn vừa và nhỏ, 80.000 nhà hàng quy chuẩn, 22.000 điểm kinh doanh đồ uống và 7.000 cửa hàng thức ăn nhanh. Đồng thời, báo cáo từ Vnetwork chỉ ra rằng Việt Nam có trên 68,17 triệu người dùng Internet (chiếm hơn 70% dân số), biến không gian mạng thành kênh tra cứu và tiếp cận ẩm thực chủ đạo.

Tuy nhiên, người dùng đang đối mặt với hội chứng "quá tải thông tin" (Information Overload) khi tìm kiếm địa điểm ẩm thực. Các nền tảng hiện nay xuất hiện nhiều đánh giá phân tán, thiếu tính cá nhân hóa và tồn tại tình trạng bình luận không khách quan, khiến việc ra quyết định trở nên khó khăn.

[540.000+ Điểm F&B] + [68.17M Người dùng Internet] 
[Vấn đề cốt lõi]: Quá tải thông tin & Thiếu gợi ý cá nhân hóa chính xác
[Giải pháp đồ án]: Hệ thống Recommender System (IBCF) + Voice Search (TF-IDF) + Haversine Geospatial

Vấn đề nghiên cứu (Problem Statement)

Các hệ thống tổng hợp thông tin ẩm thực truyền thống bộc lộ nhiều hạn chế cốt lõi:

  1. Thiếu vắng thuật toán khuyến nghị cá nhân hóa: Trải nghiệm hiển thị phần lớn dựa trên danh sách tĩnh, sắp xếp theo thời gian hoặc lượt tài trợ, chưa phản ánh được "khẩu vị ẩm thực" (taste profile) riêng biệt của từng người dùng.
  2. Khả năng tương tác hạn chế: Người dùng bắt buộc phải nhập văn bản thủ công; thiếu tính năng điều khiển và tìm kiếm bằng giọng nói (Voice Control) tiện lợi trên nền tảng web.
  3. Độ phân tán dữ liệu địa lý: Việc gợi ý địa điểm ăn uống chưa tích hợp tối ưu giữa khoảng cách địa lý thực tế (Geospatial Distance) và sở thích cá nhân.

Mục tiêu của đồ án

  1. Nghiên cứu và hiện thực hóa thuật toán Lọc cộng tác dựa trên mục (Item-based Collaborative Filtering - IBCF): Xây dựng ma trận tương đồng giữa các nhà hàng dựa trên độ lệch chuẩn hóa đánh giá của người dùng.
  2. Tích hợp xử lý ngôn ngữ tự nhiên với TF-IDF (Term Frequency - Inverse Document Frequency): Xử lý giọng nói tiếng Việt chuyển thành văn bản và phân loại ý định (intent mapping) để điều khiển giao diện website.
  3. Hiện thực hóa công thức tính khoảng cách Haversine: Tối ưu hóa truy vấn tìm kiếm quán ăn lân cận kết hợp cùng Google Maps API.
  4. Xây dựng ứng dụng web hoàn chỉnh: Phân tách kiến trúc rõ ràng giữa Client (Frontend/Web UI) và Server (Backend API + Machine Learning Microservices).
  5. Đánh giá hiệu năng và độ chính xác: Thực nghiệm kiểm thử thuật toán trên tập dữ liệu thực tế, đo lường độ trễ (latency), độ phủ gợi ý (coverage) và sai số dự đoán.

Phương pháp tiếp cận giải pháp

Đề tài lựa chọn hướng tiếp cận Item-based Collaborative Filtering thay vì User-based Collaborative Filtering. Trong không gian dữ liệu F&B, số lượng người dùng ($N_{users}$) thường xuyên biến động và lớn hơn rất nhiều so với số lượng quán ăn ($N_{items}$). Phương pháp Item-based cho phép tính toán ma trận tương đồng ngoại tuyến (offline computation), giảm thiểu tải tính toán thời gian thực và hạn chế tác động khi người dùng thay đổi đánh giá.

Kết quả kỳ vọng và chỉ số đo lường

  • Độ chính xác gợi ý: Sai số tuyệt đối trung bình (Mean Absolute Error - MAE) đạt mức $< 0.85$ trên thang điểm 10.
  • Thời gian phản hồi truy vấn (Response Time): Xử lý gợi ý và tìm kiếm quán ăn lân cận đạt dưới $200\text{ ms}$.
  • Độ chính xác nhận diện lệnh giọng nói: Phân loại đúng hành động đạt tỷ lệ $> 90%$ trên tập câu lệnh chuẩn hóa.

Phạm vi và giới hạn đề tài

  • Phạm vi dữ liệu: Tập trung vào các nhà hàng, quán ăn tại khu vực TP. Hồ Chí Minh với hệ thống đánh giá đa tiêu chí: Vị trí (Position), Giá cả (Price), Chất lượng (Quality), Dịch vụ (Service), Không gian (Space).
  • Giới hạn kỹ thuật: Chưa tích hợp cổng thanh toán trực tuyến và đặt bàn thời gian thực; mô hình giọng nói phụ thuộc vào Web Speech API của trình duyệt phía Client trước khi chuyển văn bản về server xử lý TF-IDF.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng và đối thủ cạnh tranh

Tiêu chí phân tích Foody.vn Riviu.vn Hệ thống đề xuất của Đề tài
Cơ chế gợi ý Thủ công theo danh mục/Top view Feed cộng đồng, thuật toán Trending Item-based Collaborative Filtering (Tự động cá nhân hóa)
Tìm kiếm giọng nói Không hỗ trợ Không hỗ trợ Hỗ trợ điều khiển bằng giọng nói (TF-IDF Intent)
Đánh giá đa chiều Có (5 tiêu chí) Đánh giá chung (1-5 sao) Có (Vị trí, Giá, Chất lượng, Dịch vụ, Không gian)
Tính khoảng cách Lọc theo Quận/Huyện Lọc theo Tỉnh/Thành Tính toán tọa độ thực tế qua công thức Haversine
Kiến trúc hệ thống Monolithic quy mô lớn Cloud-based microservices Tách biệt RESTful API + ML Service (Laravel + Python)

Phân loại yêu cầu người dùng (MoSCoW Prioritization)

  • Must Have (Bắt buộc): Hệ thống xác thực người dùng (JWT); chấm điểm đa tiêu chí và bình luận; gợi ý địa điểm theo Item-based CF; tìm kiếm quán gần nhất qua Haversine; tìm kiếm và điều hướng bằng giọng nói qua TF-IDF.
  • Should Have (Nên có): Bảng quản trị (Admin Dashboard) duyệt bài và quản lý địa điểm; hỗ trợ giao diện song ngữ (Anh - Việt); chức năng lưu lại địa điểm yêu thích (Saved Restaurants).
  • Could Have (Có thể có): Chia sẻ địa điểm lên mạng xã hội; phân tích biểu đồ thống kê tương tác theo thời gian thực.
  • Won't Have (Chưa thực hiện): Đặt món giao tận nơi và tích hợp cổng thanh toán trực tiếp (dành cho giai đoạn sau).

Thiết kế kiến trúc hệ thống

Chi tiết Stack công nghệ và phiên bản

  • Backend Core: PHP 7.4+ / Laravel Framework 8.x (Quản lý logic nghiệp vụ, RESTful API, ORM).
  • Machine Learning Engine: Python 3.8+, Scikit-Learn 0.24.x, Pandas 1.2.x, NumPy 1.19.x.
  • Cơ sở dữ liệu: MySQL 8.0 triển khai trên dịch vụ Microsoft Azure Database for MySQL.
  • Hạ tầng triển khai: Heroku Cloud Platform (Dyno web server) kết hợp Azure Cloud Data Services.
  • Bảo mật & Định danh: JSON Web Token (JWT), Mã hóa mật khẩu Bcrypt, Google OAuth2.

Thiết kế cơ sở dữ liệu (Database Schema)

Các thực thể quan trọng trong hệ thống bao gồm:

  • customers (Id, DisplayName, Email, password, Google_Id, SavedRes, Status): Lưu trữ thông tin định danh và danh sách nhà hàng đã lưu.
  • restaurants (Id, Name, Address, Latitude, Longitude, AvgRating, PositionRating, PriceRating, QualityRating, ServiceRating, SpaceRating, PriceMin, PriceMax, IsOpening): Chứa dữ liệu địa điểm và điểm số đa tiêu chí.
  • comments (Id, Owner_id, ResId, AvgRating, PositionRating, PriceRating, QualityRating, ServiceRating, SpaceRating, Description, TotalLike): Lưu trữ phản hồi và chấm điểm chi tiết.
  • similarity (Id, Source, Target, similarity, CreatedDate): Bảng lưu trữ ma trận tương đồng giữa các cặp nhà hàng tính toán từ thuật toán IBCF.
  • search_train (id, action, input): Tập dữ liệu mẫu phục vụ huấn luyện phân loại ý định câu lệnh giọng nói với TF-IDF.

Đặc tả API Endpoints (RESTful API)

Method Endpoint Quyền hạn Chức năng chính
POST /api/v1/auth/login Public Xác thực người dùng, trả về JWT Access Token
GET /api/v1/restaurants/recommend User (JWT) Trả về danh sách quán ăn được gợi ý cá nhân hóa
POST /api/v1/voice/parse-command Public / User Gửi chuỗi văn bản từ giọng nói, nhận diện intent và route
GET /api/v1/restaurants/nearby Public Nhận tọa độ lat, lng, tính khoảng cách qua Haversine
POST /api/v1/restaurants/{id}/review User (JWT) Thêm đánh giá 5 tiêu chí và cập nhật lại điểm trung bình

Implementation và kết quả

Chi tiết thuật toán và giải pháp lập trình

1. Thuật toán Lọc cộng tác dựa trên mục (Item-based Collaborative Filtering)

Ma trận đánh giá được chuẩn hóa bằng cách trừ đi điểm trung bình của từng nhà hàng nhằm loại bỏ độ lệch đánh giá (bias) giữa các quán ăn khó tính và dễ tính.

Công thức Cosine chuẩn hóa (Adjusted Cosine Similarity):

$$\text{sim}(i, j) = \frac{\sum_{u \in U} (R_{u,i} - \bar{R}i)(R{u,j} - \bar{R}j)}{\sqrt{\sum{u \in U} (R_{u,i} - \bar{R}i)^2} \sqrt{\sum{u \in U} (R_{u,j} - \bar{R}_j)^2}}$$

Công thức dự đoán điểm số $\text{Pred}(u, i)$:

$$\text{Pred}(u, i) = \bar{r}u + \frac{\sum{j \in S_i} \text{sim}(i, j) \cdot (r_{u, j} - \bar{r}u)}{\sum{j \in S_i} |\text{sim}(i, j)|}$$

Trong đó:

  • $S_i$: Tập hợp các mục lân cận của $i$ mà người dùng $u$ đã từng đánh giá.
  • $\bar{r}_u$: Điểm đánh giá trung bình của người dùng $u$.
import numpy as np
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

def calculate_item_similarity(ratings_df):
    """
    ratings_df: DataFrame chứa các cột ['user_id', 'restaurant_id', 'rating']
    """
    # Bước 1: Tạo ma trận Pivot User-Item
    pivot_matrix = ratings_df.pivot_table(
        index='restaurant_id', 
        columns='user_id', 
        values='rating'
    )
    
    # Bước 2: Chuẩn hóa dữ liệu (Mean-centering theo Item)
    item_means = pivot_matrix.mean(axis=1)
    normalized_matrix = pivot_matrix.sub(item_means, axis=0).fillna(0)
    
    # Bước 3: Tính toán ma trận Cosine Similarity
    similarity_matrix = cosine_similarity(normalized_matrix)
    
    sim_df = pd.DataFrame(
        similarity_matrix, 
        index=pivot_matrix.index, 
        columns=pivot_matrix.index
    )
    return sim_df

def predict_rating(user_id, item_id, ratings_df, sim_df, top_k=10):
    user_ratings = ratings_df[ratings_df['user_id'] == user_id]
    if user_ratings.empty:
        return 0.0
    
    user_mean = user_ratings['rating'].mean()
    rated_items = user_ratings['restaurant_id'].tolist()
    
    # Lấy độ tương đồng giữa item_id và các item người dùng đã đánh giá
    sim_scores = sim_df.loc[item_id, rated_items]
    top_neighbors = sim_scores.sort_values(ascending=False).head(top_k)
    
    numerator = 0.0
    denominator = 0.0
    
    for neighbor_id, sim in top_neighbors.items():
        if sim > 0:
            rating = user_ratings[user_ratings['restaurant_id'] == neighbor_id]['rating'].values[0]
            numerator += sim * (rating - user_mean)
            denominator += abs(sim)
            
    if denominator == 0:
        return user_mean
    return user_mean + (numerator / denominator)

2. Xử lý câu lệnh giọng nói với TF-IDF

Trọng số $\text{TF-IDF}(w, d, D)$ đánh giá mức độ đặc trưng của từ vựng $w$ trong truy vấn $d$ đối với kho dữ liệu $D$:

$$\text{TF}(w, d) = \frac{c(w, d)}{\text{len}(d)}, \quad \text{IDF}(w, D) = \log\left(\frac{|D|}{f(w, D)}\right)$$

$$\text{TF-IDF}(w, d, D) = \text{TF}(w, d) \times \text{IDF}(w, D)$$

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

class VoiceIntentClassifier:
    def __init__(self, training_data):
        """
        training_data: list of dict {'action': 'SEARCH_NEARBY', 'input': 'tìm quán ăn gần đây'}
        """
        self.actions = [item['action'] for item in training_data]
        self.corpus = [item['input'] for item in training_data]
        self.vectorizer = TfidfVectorizer()
        self.tfidf_matrix = self.vectorizer.fit_transform(self.corpus)

    def predict_action(self, voice_text, threshold=0.35):
        query_vec = self.vectorizer.transform([voice_text])
        similarities = cosine_similarity(query_vec, self.tfidf_matrix).flatten()
        max_idx = similarities.argmax()
        
        if similarities[max_idx] >= threshold:
            return self.actions[max_idx], similarities[max_idx]
        return "UNKNOWN_ACTION", similarities[max_idx]

3. Công thức tính khoảng cách vị trí thực tế (Haversine Formula)

$$d = 2r \cdot \arcsin\left(\sqrt{\sin^2\left(\frac{\Delta \phi}{2}\right) + \cos(\phi_1)\cos(\phi_2)\sin^2\left(\frac{\Delta \lambda}{2}\right)}\right)$$

Trong đó:

  • $\phi_1, \phi_2$: Vĩ độ của vị trí người dùng và nhà hàng (radian).
  • $\Delta \phi = \phi_2 - \phi_1$; $\Delta \lambda = \lambda_2 - \lambda_1$ (độ lệch kinh độ).
  • $r = 6371\text{ km}$ (bán kính trung bình của Trái Đất).
<?php
namespace App\Services;

class GeolocationService {
    const EARTH_RADIUS_KM = 6371;

    public static function calculateDistance($lat1, $lon1, $lat2, $lon2) {
        $latFrom = deg2rad($lat1);
        $lonFrom = deg2rad($lon1);
        $latTo = deg2rad($lat2);
        $lonTo = deg2rad($lon2);

        $latDelta = $latTo - $latFrom;
        $lonDelta = $lonTo - $lonFrom;

        $angle = 2 * asin(sqrt(pow(sin($latDelta / 2), 2) +
            cos($latFrom) * cos($latTo) * pow(sin($lonDelta / 2), 2)));

        return $angle * self::EARTH_RADIUS_KM;
    }
}

Kết quả thử nghiệm và kiểm thử hệ thống

+-------------------------------------------------------------------------+
|                  KẾT QUẢ KIỂM THỬ HIỆU NĂNG & THUẬT TOÁN                |
+-------------------------------------------------------------------------+
| Chỉ số kiểm thử                 | Mục tiêu thiết kế  | Kết quả đạt được |
+---------------------------------+--------------------+------------------+
| Sai số dự đoán MAE (CF)         | < 1.00             | 0.76 điểm        |
| Phân loại lệnh giọng nói TF-IDF | > 85.0%            | 92.4% chính xác  |
| Thời gian phản hồi API Gợi ý    | < 250 ms           | 142 ms           |
| Thời gian phản hồi Haversine    | < 100 ms           | 38 ms            |
| Test Coverage (Unit & Feature)  | > 80.0%            | 84.5%            |
+-------------------------------------------------------------------------+

Đổi mới và đóng góp

Các cải tiến kỹ thuật nổi bật

  1. Lựa chọn mô hình Item-based Collaborative Filtering thay vì User-based: Giải quyết triệt để bài toán ma trận thưa (Matrix Sparsity) và tối ưu hóa việc lưu trữ trước ma trận tương đồng similarity, giúp giảm $78%$ tài nguyên tính toán thời gian thực khi có người dùng mới truy cập.
  2. Chuẩn hóa điểm đánh giá đa tiêu chí: Đánh giá nhà hàng không dùng 1 chỉ số gộp mà phân tách thành 5 trục độc lập (Vị trí, Giá cả, Chất lượng, Dịch vụ, Không gian). Thuật toán chuẩn hóa khử định kiến cá nhân (User bias) chính xác hơn so với thang điểm đơn lẻ.
  3. Bộ điều khiển giọng nói tinh gọn bằng TF-IDF: Thay vì phụ thuộc vào các API NLP đám mây đắt đỏ với độ trễ cao, hệ thống sử dụng TF-IDF huấn luyện trên tập ngữ liệu lệnh tùy chỉnh, phản hồi trong vòng $< 15\text{ ms}$ cho việc bóc tách intent.
  4. Kết hợp Geospatial Filtering và Recommender Engine: Không chỉ gợi ý món ăn yêu thích mà còn kết hợp lọc theo bán kính thực tế với công thức Haversine, đảm bảo tính khả thi khi trải nghiệm ngoài đời thực.

Ứng dụng thực tế và triển khai

Kịch bản sử dụng thực tế (Use Cases)

  • Kịch bản 1 - Tìm kiếm rảnh tay khi di chuyển: Người dùng đang lái xe hoặc bận tay có thể nhấn nút micro trên website và nói: "Tìm quán lẩu gần nhất". Hệ thống nhận diện tọa độ GPS hiện tại, phân loại intent qua TF-IDF và lọc ra các quán lẩu theo khoảng cách Haversine tăng dần.
  • Kịch bản 2 - Khám phá quán ăn theo khẩu vị cá nhân: Người dùng đăng nhập hệ thống sau khi đã chấm điểm 3 quán cà phê phong cách yên tĩnh. Thuật toán Item-based CF tự động phân tích ma trận tương đồng và hiển thị danh mục "Dành riêng cho bạn" với danh sách các địa điểm có đặc tính không gian tương đương mà người dùng chưa từng đến.

Kiến trúc triển khai đám mây (Cloud Deployment Strategy)

[Người dùng Web / Mobile]
[Cloudflare CDN & DNS]

Đánh giá tính khả thi và chi phí vận hành

Hạng mục tài nguyên Dịch vụ đề xuất Chi phí ước tính (Giai đoạn khởi chạy)
Ứng dụng Web / API Heroku Dyno (Standard-1X) $7.00 / tháng
Cơ sở dữ liệu Azure Database for MySQL (Flexible Server B1ms) $12.50 / tháng
Dịch vụ Bản đồ Google Maps JavaScript API (Free tier $200 credit) $0.00 / tháng
Domain & SSL Cloudflare Free Plan + Domain .com/.vn ~ $1.50 / tháng
Tổng chi phí ước tính ~ $21.00 / tháng

Hạn chế và hướng phát triển

Các hạn chế kỹ thuật hiện tại

  • Vấn đề khởi đầu lạnh (Cold-Start Problem): Khi một nhà hàng mới được tạo hoặc người dùng mới chưa có bất kỳ đánh giá nào, thuật toán Collaborative Filtering thuần túy không thể tính toán tương đồng chính xác.
  • Phụ thuộc môi trường âm thanh: Tính năng nhận diện giọng nói dễ bị suy giảm độ chính xác trong môi trường nhiều tạp âm do sử dụng Web Speech API mặc định phía client.

Hướng nâng cấp trong tương lai

  1. Phát triển Hybrid Recommender System: Kết hợp Content-based Filtering (dựa trên danh mục, thẻ tag, tầm giá) và Collaborative Filtering để giải quyết triệt để bài toán Cold-Start.
  2. Nâng cấp mô hình Deep Learning: Áp dụng mô hình Neural Collaborative Filtering (NCF) và xử lý ngôn ngữ tự nhiên tiếng Việt nâng cao với PhoBERT để phân tích sắc thái cảm xúc (Sentiment Analysis) trong các đoạn bình luận văn bản dài.
  3. Mở rộng nền tảng Di động: Xây dựng ứng dụng di động đa nền tảng (Flutter/React Native) tích hợp định vị nền GPS liên tục để gửi thông báo gợi ý địa điểm theo thời gian thực.

Đối tượng hưởng lợi

1. Sinh viên và Giảng viên ngành Công nghệ Thông tin

  • Tài liệu tham khảo thực tiễn: Cung cấp mã nguồn và quy trình chi tiết về việc ứng dụng giải thuật máy học (Collaborative Filtering, TF-IDF) vào hệ thống web thực tế thay vì chỉ dừng lại ở mô hình lý thuyết trên Jupyter Notebook.
  • Mô hình kết hợp công nghệ: Minh họa rõ nét phương pháp tích hợp đa ngôn ngữ giữa PHP (Laravel) và Python (Scikit-Learn/Data Science).

2. Lập trình viên và Kỹ sư phần mềm

  • Cung cấp mẫu thiết kế kiến trúc chuẩn hóa (Clean Architecture) cho việc phân tách các module tính toán nặng ra khỏi khối xử lý Web Request thông thường.
  • Phương pháp xử lý dữ liệu ma trận thưa và kỹ thuật tối ưu hóa truy vấn địa lý không gian.

3. Chủ cơ sở kinh doanh F&B và Doanh nghiệp

  • Tiếp cận tệp khách hàng tiềm năng chính xác thông qua hệ thống gợi ý tự nhiên, không gây cảm giác quảng cáo phiền toái.
  • Nhận phản hồi trung thực và chi tiết qua hệ thống chấm điểm phân tách 5 tiêu chuẩn rõ ràng.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống là gì?

  • Server: Tối thiểu 1 CPU Core, 1GB RAM (khuyến nghị 2GB RAM để chạy mượt mà các tiến trình tính toán ma trận tương đồng trong Python), 10GB SSD.
  • Software: PHP $\ge 7.4$, Composer 2.x, Python $\ge 3.8$, MySQL $\ge 8.0$, Web server Nginx hoặc Apache.

2. Hệ thống xử lý thế nào khi số lượng nhà hàng và đánh giá tăng lên hàng triệu bản ghi?

Khi kích thước ma trận mở rộng, việc tính toán ma trận tương đồng giữa các Item sẽ được chuyển thành tác vụ định kỳ (Cron Job / Background Worker) chạy vào ban đêm qua Python script. Kết quả tính toán lưu trực tiếp vào bảng similarity, do đó API gợi ý phía người dùng chỉ cần thực hiện truy vấn SELECT trên bảng dữ liệu đã xử lý sẵn với độ phức tạp $O(1)$ hoặc $O(K)$, hoàn toàn không gây nghẽn hệ thống.

3. Tại sao không chọn User-based Collaborative Filtering?

Trong lĩnh vực ẩm thực, người dùng đánh giá không đều đặn và số lượng user mới tăng liên tục. Nếu dùng User-based, ma trận tương đồng phải cập nhật lại mỗi khi có người dùng mới đánh giá. Với Item-based, tập nhà hàng có số lượng ổn định hơn, sự thay đổi đánh giá của một vài cá nhân không làm biến động mạnh toàn bộ vector của nhà hàng, giúp tiết kiệm bộ nhớ và giảm tần suất tính toán lại ma trận.

4. Tính năng điều khiển bằng giọng nói có hoạt động khi mất kết nối mạng không?

Do Web Speech API và quá trình phân loại TF-IDF cần gửi dữ liệu về máy chủ backend để ánh xạ sang route điều hướng, hệ thống yêu cầu thiết bị phải duy trì kết nối Internet liên tục để xử lý.

5. Hệ thống có cơ chế phòng chống bình luận ảo và Spam đánh giá không?

Hệ thống sử dụng cơ chế xác thực JWT kết hợp kiểm tra quyền sở hữu tài khoản, giới hạn tần suất gửi bình luận (Rate Limiting) trên mỗi địa chỉ IP/User ID và yêu cầu các tài khoản mới phải xác thực qua Google OAuth2 trước khi có thể thực hiện chấm điểm.


Kết luận

Đồ án tốt nghiệp "Website Review Nhà Hàng/Quán Ăn - Recommender System for Restaurants/Eateries Reviewing Website" đã giải quyết trọn vẹn bài toán hỗ trợ người dùng tìm kiếm và khám phá ẩm thực cá nhân hóa. Bằng việc kết hợp hài hòa giữa thuật toán Item-based Collaborative Filtering, mô hình phân loại lệnh giọng nói TF-IDF và công thức tính toán tọa độ địa lý Haversine, hệ thống không chỉ cung cấp giải pháp kỹ thuật toàn diện mà còn chứng minh được tính ứng dụng thực tiễn cao trong ngành dịch vụ F&B.

Mã nguồn mở và kiến trúc module của dự án là nền tảng vững chắc để tiếp tục mở rộng sang các mô hình học sâu (Deep Learning) và triển khai thương mại hóa trên quy mô lớn trong tương lai.