0 nhận xét

Trong bài viết hôm nay mình sẽ hướng dẫn cho bạn làm hệ thống gợi ý sản phẩm. Đầu tiên mình giới thiệu về nó tên tiếng anh là recommender system. Nó dùng để thực hiện việc gợi ý các sản phẩm cùng loại hay các sản phẩm mà có khả năng người mua sẽ thích.

Các loại hệ thống gợi ý: dựa trên nội dung, dựa trên lọc cộng tác, và hybrid. Đây là 3 hệ thống cơ bản và thường áp dụng nhất. Sau đây mình sẽ hướng dẫn bạn thực hiện hệ thống lọc theo nôi dung (content-based filtering).

Nói sơ về hệ thống lọc theo nội dung một tí, hệ thống này sẽ dựa vào nội dung hiện có của sản phẩm tức là chúng ta không cần thu thập hay phân tích người dùng cái gì điều các làm là có sản phẩm là được. Sau đấy ta bóc ra mấy cái đặc trưng và từ các đặc trung này ta sẽ tìm kiếm các sản phẩm có đặc trưng tương tự là ổn. Đặc trưng ở đây là những gì có trên sản phẩm như mô tả ngắn, giá hay tác giả, xuất xứ….Để có thể được sử dụng.

Hướng dẫn làm chức năng gợi ý sản phẩm cho website

Bước 1: Viết chương trình gợi ý sản phẩm và build API trên visual code.

Trên visual code bạn tạo một tệp tên main.py và viết code như hình bên dưới.

Trong chương trình gợi ý sản phẩm content-based filtering này sẽ có 5 phần. Phần 1 là tạo dataframe từ cơ sở dữ liệu SQL sản phẩm của mình, phần 2 là xử lý văn bản cũng như chọn ra các đặc trưng mà mình cần, phần 3 dùng tf-idf để chuyển đổi văn bản thành các vector cho máy đọc hiểu được, phần 4 dùng phương thức cosine-similarity để mà tính độ tương đồng. Cuối cùng là build API trả về data json.

Trong ví dụ dưới đây mình dùng 2 đặc trưng của sản phẩm là mô tả ngắn và giá các bạn có thể chọn như vậy hoặc khác đi.

from flask import Flask, jsonify, request
import pyodbc
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
#————–
app = Flask(__name__)
# Thay đổi thông tin kết nối tùy theo cấu hình SQL Server của bạn
server = ‘DESKTOP-IETFO1H\THANH’
database = ‘WebsiteGiayMoi’
username = ”
password = ”
# Tạo chuỗi kết nối
connection_string = f’DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}’
# Kết nối đến SQL Server
try:
    conn = pyodbc.connect(connection_string)
    cursor = conn.cursor()
    # Thực hiện các thao tác SQL ở đây
    query = ‘SELECT * FROM Giays’
    # cursor.execute(query)
    # rows = cursor.fetchall()
    df_sanpham = pd.read_sql(query,conn)
    # df_sanpham = pd.DataFrame(rows, columns=[desc[0] for desc in cursor.description][:1])
    print(df_sanpham.head())
except pyodbc.Error as e:
    print(f”Error: {e}”)
finally:
    # Đóng kết nối
    if conn:
        conn.close()
#————-
# Select Features
features=[‘Description’,’Gia’]
# Create a column which will contain all these feat
def combineFeatures(row):
    return str(row[‘Gia’])+” “+str(row[‘Description’])
# this will create a seperate column of combined features
df_sanpham[“combinedFeatures”]=df_sanpham.apply(combineFeatures,axis=1)
print (df_sanpham[‘combinedFeatures’].head())
# use cosine similarity
tf = TfidfVectorizer()
tfMatrix=tf.fit_transform(df_sanpham[‘combinedFeatures’])
tfMatrix.toarray()
tfArray=tfMatrix.toarray()
print(tfArray)
similar=cosine_similarity(tfMatrix)
#số sản phẩm hiện ra
number = 4
@app.route(‘/api’, methods=[‘GET’])
def get_data():
    result_content_base = []
     # Lấy giá trị ‘id’ từ tham số truy vấn
    product_id = request.args.get(‘id’)
    # Kiểm tra xem ‘id’ có tồn tại và có phải là số không
    if product_id is None or not product_id.isdigit():
        return jsonify({‘error’: ‘Invalid or missing product ID’})
    # Chuyển ‘id’ thành kiểu int
    product_id = int(product_id)
    # Kiểm tra xem product_id có nằm trong danh sách sản phẩm không
    if product_id not in df_sanpham[“Id”].values:
        return jsonify({‘error’: ‘Invalid product ID’})
     # Lấy chỉ số index của product_id trong dataframe
    index_of_product_id = df_sanpham[df_sanpham[“Id”] == product_id].index[0]
    # print(index_of_product_id)
     # Sử dụng index_of_product_id để lấy danh sách sản phẩm tương đồng
    similarGiay = list(enumerate(similar[index_of_product_id]))
# similarGiay=list(enumerate(similar[0]))
# Sort the entries acc to similarity scores
    sortedSimilarGiay=sorted(similarGiay,key=lambda x:x[1], reverse=True)
# Now print the most similar 4 giay based on features
    def get_title_from_index(index):
        return (df_sanpham[df_sanpham.index == index][“Name”].values[0])
    for i in range(1, number + 1):
        print(get_title_from_index(sortedSimilarGiay[i][0]))
        result_content_base.append(get_title_from_index(sortedSimilarGiay[i][0]))
    data = {‘san pham goi y’: result_content_base}
    return jsonify(data)
if __name__ == ‘__main__’:
    app.run(port=5000)

Kết quả trả về là các sản phẩm gợi ý.

Bước 2: Ta bắt đầu call API bên visual code quả bên website chính. Tại project website chính bạn tạo một thư mục DTO và trong thư mục tạo một lớp là ProductResponse.

Các bạn có trong lớp này một thuộc tính như hình dưới.

Sau đó qua bên nơi chứa view Detail của sản phẩm, và viết code phần như đánh dấu khung màu đỏ bên dưới để call API bằng HttpClient.

Khi bạn làm như bên dưới đây xong, bạn có thể đặt Debug để xem kết quả, cuối cùng sẽ cho ra kết quả là list các sản phẩm gợi ý.

Như vầy việc còn lại bạn chỉ việc dùng viewbag để lưu trữ và dùng nó edit thêm bên view để hiển thị ra trên view được như ý muốn là xong.

public async Task<ActionResult> Detail(int id)
{
List<string> sanphamgoiy = new List<string>();
using(var client = new HttpClient())
{
client.BaseAddress = new Uri(baseURL);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”));

HttpResponseMessage getData = await client.GetAsync($”api?id={id}”);
if (getData.IsSuccessStatusCode)
{
string results = getData.Content.ReadAsStringAsync().Result;
var productResponse = JsonConvert.DeserializeObject<ProductResponse>(results);

sanphamgoiy = productResponse.SanPhamGoiY;
ViewBag.HienThiSanPhamGoiY = sanphamgoiy;

}
}
;
ViewBag.tatcasanpham = db.Giays.ToList();
Giay vitri = db.Giays.Include(o => o.Category).Include(o => o.Brand).ToList().Find(x => x.Id == id);

return View(vitri);
}

Và đây là kết quả cuối cùng.

Để lại nhận xét

Địa chỉ email của bạn sẽ không được công bố.