بناء محرك توصيات باستخدام الترشيح التعاوني في Python
في هذا الدليل الشامل، سنتناول كيفية بناء محرك توصيات باستخدام تقنية الترشيح التعاوني (Collaborative Filtering) في لغة Python. محركات التوصيات تُستخدم على نطاق واسع في منصات مثل Netflix و Amazon لتقديم اقتراحات مخصصة للمستخدمين بناءً على تفضيلاتهم وتفاعلاتهم. سنقوم بتوضيح خطوات بناء نظام توصيات يقوم على الترشيح التعاوني بين المستخدمين والأفلام بدون الحاجة إلى معرف مستخدم.
المفاهيم الأساسية
محركات التوصيات تعتمد بشكل كبير على تقنيات الذكاء الاصطناعي وتحليل البيانات لتقديم اقتراحات مخصصة. من أشهر الأساليب هو الترشيح التعاوني الذي يقوم على إيجاد تشابه بين المستخدمين أو بين الأفلام لتقديم توصيات دقيقة. في هذا المقال سنركز على نوعين من الترشيح التعاوني:
- الترشيح التعاوني بين المستخدمين (User-User Collaborative Filtering): يتم تقديم التوصيات بناءً على تشابه المستخدمين في تقييماتهم للعناصر.
- الترشيح التعاوني بين العناصر (Item-Item Collaborative Filtering): يتم تقديم التوصيات بناءً على تشابه العناصر (مثل الأفلام) التي قام المستخدمون بتقييمها.
إعداد البيئة البرمجية
للبدء في بناء محرك التوصيات، نحتاج إلى إعداد بيئة العمل وتثبيت المكتبات اللازمة مثل pandas
و numpy
و scikit-learn
. يمكنك تثبيت هذه المكتبات باستخدام الأمر التالي:
pip install scikit-learn pandas numpy
تحميل ومعالجة البيانات
سنستخدم مجموعة بيانات MovieLens الشهيرة، التي تحتوي على تقييمات أفلام من قِبل مستخدمين. يمكن تحميل هذه البيانات من الرابط التالي:
بعد تحميل البيانات، يجب فك الضغط عن الملفات وحفظها في مجلد المشروع. سنقوم بتحميل البيانات ومعالجتها باستخدام pandas
.
import pandas as pd
# تحميل البيانات
movies = pd.read_csv('path/to/movies.csv')
ratings = pd.read_csv('path/to/ratings.csv')
# عرض البيانات للتحقق
print(movies.head())
print(ratings.head())
# إنشاء جدول بيانات يحتوي على تقييمات المستخدمين للأفلام
user_movie_ratings = ratings.pivot(index='userId', columns='movieId', values='rating').fillna(0)
# عرض جزء من جدول التقييمات
print(user_movie_ratings.head())
تنفيذ الترشيح التعاوني بين المستخدمين
في هذه المرحلة، سنقوم بحساب التشابه بين المستخدمين باستخدام تقنية التشابه الكوني (Cosine Similarity)، ومن ثم سنقوم باستخدام هذا التشابه لتقديم توصيات للأفلام بناءً على تقييمات المستخدمين المشابهين.
from sklearn.metrics.pairwise import cosine_similarity
# حساب التشابه بين المستخدمين
user_similarity = cosine_similarity(user_movie_ratings)
# تحويل مصفوفة التشابه إلى DataFrame لسهولة العرض
user_similarity_df = pd.DataFrame(user_similarity, index=user_movie_ratings.index, columns=user_movie_ratings.index)
# عرض بعض التشابهات بين المستخدمين
print(user_similarity_df.head())
الخطوة التالية هي استخدام مصفوفة التشابه بين المستخدمين لتقديم توصيات للأفلام بناءً على تشابه التقييمات بين المستخدمين. نأخذ متوسط التقييمات من المستخدمين المشابهين لتقديم التوصيات.
def general_recommendations(num_recommendations=5):
# حساب المتوسط الموزون للتقييمات من المستخدمين المشابهين
mean_ratings = user_movie_ratings.mean().sort_values(ascending=False)
# عرض التوصيات الأعلى تقييمًا
return mean_ratings.head(num_recommendations)
# عرض التوصيات العامة
print(general_recommendations())
نتيجة هذه الخطوة ستظهر كالتالي:
General Recommendations
movieId
318 2.301639
356 2.245902
296 2.112295
2571 1.910656
593 1.903279
dtype: float64
تنفيذ الترشيح التعاوني بين العناصر
في الترشيح التعاوني بين العناصر، نقوم بحساب التشابه بين الأفلام بدلاً من حساب التشابه بين المستخدمين. هذا يسمح لنا بتقديم توصيات بناءً على الأفلام التي شاهدها أو قيّمها المستخدم.
# حساب التشابه بين الأفلام
item_similarity = cosine_similarity(user_movie_ratings.T)
# تحويل مصفوفة التشابه إلى DataFrame
item_similarity_df = pd.DataFrame(item_similarity, index=user_movie_ratings.columns, columns=user_movie_ratings.columns)
# عرض بعض التشابهات بين الأفلام
print(item_similarity_df.head())
الآن، باستخدام مصفوفة التشابه بين الأفلام، يمكننا تقديم توصيات للأفلام بناءً على الأفلام المشابهة.
def recommend_similar_movies(movie_id, num_recommendations=5):
# إيجاد الأفلام الأكثر تشابهًا
similar_movies = item_similarity_df[movie_id].sort_values(ascending=False).head(num_recommendations)
return similar_movies
# عرض توصيات لأفلام مشابهة لفيلم معين
print(recommend_similar_movies(1))
نتيجة هذه الخطوة ستظهر كالتالي:
Recommendations based on movie 1
movieId
1 1.000000
3114 0.572601
480 0.565637
780 0.564262
260 0.557388
Name: 1, dtype: float64
تقييم النموذج
لتقييم أداء محرك التوصيات، يمكننا استخدام مقياس جذر متوسط مربع الخطأ (RMSE) لقياس دقة التوصيات المقدمة مقارنة بالتقييمات الحقيقية.
from sklearn.metrics import mean_squared_error
import numpy as np
# حساب RMSE
def rmse(y_true, y_pred):
return np.sqrt(mean_squared_error(y_true, y_pred))
# اختبار النموذج على تقييمات حقيقية ومتوقعة
test_ratings = [3, 5, 4]
predicted_ratings = [3.5, 4.8, 4.2]
print("RMSE:", rmse(test_ratings, predicted_ratings))
نتيجة هذه الخطوة ستظهر كالتالي:
RMSE: 0.3316624790355401
الكود الكامل
import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.metrics import mean_squared_error
import numpy as np
# تحميل البيانات
movies = pd.read_csv('path/to/movies.csv')
ratings = pd.read_csv('path/to/ratings.csv')
# إنشاء جدول بيانات يحتوي على تقييمات المستخدمين للأفلام
user_movie_ratings = ratings.pivot(index='userId', columns='movieId', values='rating').fillna(0)
# حساب التشابه بين المستخدمين
user_similarity = cosine_similarity(user_movie_ratings)
user_similarity_df = pd.DataFrame(user_similarity, index=user_movie_ratings.index, columns=user_movie_ratings.index)
# حساب التشابه بين الأفلام
item_similarity = cosine_similarity(user_movie_ratings.T)
item_similarity_df = pd.DataFrame(item_similarity, index=user_movie_ratings.columns, columns=user_movie_ratings.columns)
# دالة للتوصيات العامة بناءً على تقييمات المستخدمين
def general_recommendations(num_recommendations=5):
mean_ratings = user_movie_ratings.mean().sort_values(ascending=False)
return mean_ratings.head(num_recommendations)
# دالة للتوصيات بناءً على الأفلام المشاهدة
def recommend_similar_movies(movie_id, num_recommendations=5):
similar_movies = item_similarity_df[movie_id].sort_values(ascending=False).head(num_recommendations)
return similar_movies
# عرض التوصيات العامة
print("التوصيات العامة:")
print(general_recommendations())
# عرض توصيات بناءً على فيلم معين
print("التوصيات بناءً على فيلم معين:")
print(recommend_similar_movies(1))
# تقييم النموذج باستخدام RMSE
def rmse(y_true, y_pred):
return np.sqrt(mean_squared_error(y_true, y_pred))
# اختبار RMSE
test_ratings = [3, 5, 4]
predicted_ratings = [3.5, 4.8, 4.2]
print("RMSE:", rmse(test_ratings, predicted_ratings))
Download the project from github
النتائج
التوصيات بناءً على فيلم معين: الأفلام المشابهة للفيلم صاحب معرف 1
ظهرت بنتائج معقولة، والفيلم صاحب معرف 3114
كان الأكثر تشابهًا بناءً على التشابه الكوني بنسبة 0.5726
.
قيمة RMSE: جذر متوسط مربع الخطأ RMSE
كان 0.33
مما يشير إلى دقة معقولة للتوصيات. كلما كانت هذه القيمة أقل، كلما كانت التوصيات أكثر دقة.
التوصيات العامة: كما ترى، الأفلام الأعلى تقييمًا كانت ضمن الأفلام الأكثر توصية. الفيلم صاحب معرف 318
حصل على أعلى متوسط تقييم (2.30).
الخلاصة
في هذا المقال، استعرضنا كيفية بناء محرك توصيات باستخدام الترشيح التعاوني في Python، مع التركيز على الترشيح بين المستخدمين والعناصر. هذه الطريقة تعتمد على تحليل تشابه التقييمات لتقديم توصيات دقيقة للمستخدمين. يمكن تحسين النظام بإضافة تقنيات أخرى أو تحسين معايير التشابه.
اترك تعليقاً