الذكاء الاصطناعي 2 دقائق للقراءة

دليل خطوة بخطوة لإعداد وتنفيذ نظام توصية باستخدام مكتبة Surprise لعشاق التعلم الآلي

PROFSCODE Ekibi 26 يوليو 2026
Paylaş:
بناء نظام توصية بسيط باستخدام التصفية التعاونية في بايثون

في عالمنا الرقمي اليوم، أحد مفاتيح تخصيص تجربة المستخدم هو أنظمة التوصية الفعالة. من اقتراحات الأفلام على Netflix إلى توصيات المنتجات على Amazon، تزيد العديد من المنصات من التفاعل من خلال تقديم محتوى جذاب وملائم لمستخدميها. في هذه المقالة، سنعلم مطوري البرامج وعشاق الذكاء الاصطناعي كيفية إعداد وتنفيذ نظام توصية بسيط يعتمد على التصفية التعاونية خطوة بخطوة باستخدام مكتبة Surprise القوية في بايثون.

ما هي التصفية التعاونية؟

التصفية التعاونية (Collaborative Filtering) هي طريقة لتقديم توصيات جديدة بناءً على السلوكيات والتفاعلات السابقة للمستخدمين أو العناصر. ولها في الأساس مقاربتان رئيسيتان:

  • التصفية التعاونية المستندة إلى المستخدم: تجد المستخدمين ذوي الأذواق المتشابهة وتقدم توصيات بافتراض أنه إذا أعجب مستخدم بشيء، فسيعجب به المستخدمون المشابهون أيضًا.
  • التصفية التعاونية المستندة إلى العنصر: تجد العناصر المشابهة لتلك التي أعجب بها المستخدم وتوصي بهذه العناصر المشابهة للمستخدم.

في هذه المقالة، سنركز على نهج أكثر حداثة يستخدم خوارزميات تحليل المصفوفة مثل SVD (Singular Value Decomposition)، والتي تتعامل داخليًا مع تشابهات المستخدم والعناصر.

مقدمة إلى مكتبة Surprise

Surprise هي مكتبة بايثون تبسط تطوير أنظمة التوصية في مجال التعلم الآلي. تتيح لك تطبيق خوارزميات مختلفة (SVD، NMF، k-NN، إلخ) بسهولة باستخدام بيانات تقييم المستخدمين وتقييم النماذج. التثبيت بسيط للغاية:

pip install scikit-surprise

إعداد البيانات

بالنسبة لأنظمة التوصية، نحتاج عادةً إلى مجموعة بيانات تتكون من أعمدة user_id و item_id و rating (أو التفاعل). في هذا المثال، سنحاكي جزءًا صغيرًا من مجموعة بيانات MovieLens 100k.

import pandas as pdfrom surprise import Dataset, Readerfrom surprise.model_selection import train_test_split, cross_validate# إنشاء بيانات عينة (في التطبيقات الحقيقية، تُقرأ من قاعدة بيانات أو ملف)data = {    'user_id': ['user1', 'user1', 'user2', 'user2', 'user3', 'user3', 'user1', 'user2', 'user3'],    'item_id': ['itemA', 'itemB', 'itemB', 'itemC', 'itemA', 'itemC', 'itemC', 'itemA', 'itemB'],    'rating': [4, 3, 5, 4, 3, 2, 5, 4, 3]}df = pd.DataFrame(data)# إنشاء كائن Reader تفهمه مكتبة Surprise. كائن Reader يحدد مقياس التقييمreader = Reader(rating_scale=(1, 5))# تحميل DataFrame إلى تنسيق 'Dataset' الخاص بمكتبة Surprise (باستخدام طريقة load_from_df)data_surprise = Dataset.load_from_df(df[['user_id', 'item_id', 'rating']], reader)print("تم تحميل مجموعة البيانات بنجاح.")

اختيار النموذج وتدريبه

تقدم مكتبة Surprise العديد من الخوارزميات. سنقوم بتدريب نموذجنا باستخدام خوارزمية SVD (Singular Value Decomposition) وهي واحدة من أكثر الخوارزميات شيوعًا وفعالية. تتعلم SVD العوامل الكامنة عن طريق تحليل مصفوفة التقييم إلى مصفوفتين أصغر.

from surprise import SVD# تقسيم البيانات إلى مجموعات تدريب واختبار (على غرار طرق التعلم الآلي التقليدية)trainset, testset = train_test_split(data_surprise, test_size=0.25, random_state=42)# تهيئة وتدريب خوارزمية SVDalgo = SVD(random_state=42, n_epochs=20, lr_all=0.005, reg_all=0.02)algo.fit(trainset)print("تم تدريب النموذج بنجاح.")

تقييم النموذج

لتقييم مدى جودة تنبؤات نموذجنا المدرب، تُستخدم عادةً مقاييس مثل RMSE (الجذر التربيعي لمتوسط الخطأ المربع) و MAE (متوسط الخطأ المطلق). تشير القيم الأقل إلى أداء أفضل.

from surprise import accuracy# إجراء تنبؤات على مجموعة الاختبارpredictions = algo.test(testset)# حساب قيم RMSE و MAEaccuracy.rmse(predictions, verbose=True)accuracy.mae(predictions, verbose=True)

إجراء التنبؤات وتوليد التوصيات

نموذجنا جاهز الآن لإجراء تنبؤات جديدة. يمكننا التنبؤ بالتقييم الذي سيمنحه مستخدم معين لعنصر معين.

# التنبؤ بالتقييم الذي سيمنحه user1 للعنصر itemDprediction_user1_itemD = algo.predict('user1', 'itemD')print(f"التقييم المتوقع لـ user1 للعنصر itemD: {prediction_user1_itemD.est:.2f}")# التنبؤ بالتقييم الذي سيمنحه user3 للعنصر itemAprediction_user3_itemA = algo.predict('user3', 'itemA')print(f"التقييم المتوقع لـ user3 للعنصر itemA: {prediction_user3_itemA.est:.2f}")

الآن دعنا نرى كيفية تقديم أفضل 3 توصيات لمستخدم من بين العناصر التي لم يقم بتقييمها بعد:

def get_top_n_recommendations(predictions, user_id, n=3):    # تصفية جميع التنبؤات للمستخدم    user_predictions = [pred for pred in predictions if pred.uid == user_id]    # الفرز حسب التقييم المقدر    user_predictions.sort(key=lambda x: x.est, reverse=True)    # الحصول على أفضل n توصيات    top_n = user_predictions[:n]    return [(item.iid, item.est) for item in top_n]# لنقم بإنشاء تنبؤات لجميع المستخدمين والعناصر (بما في ذلك تلك التي ليست في مجموعة التدريب)all_predictions = []for uid in df['user_id'].unique():    for iid in df['item_id'].unique():        # التنبؤ فقط بالعناصر التي لم يقم المستخدم بتقييمها بعد        if not ((df['user_id'] == uid) & (df['item_id'] == iid)).any():            all_predictions.append(algo.predict(uid, iid))# الحصول على أفضل 3 توصيات لـ 'user1'top_3_for_user1 = get_top_n_recommendations(all_predictions, 'user1', n=3)print(f"أفضل 3 توصيات لـ user1: {top_3_for_user1}")# الحصول على أفضل 3 توصيات لـ 'user2'top_3_for_user2 = get_top_n_recommendations(all_predictions, 'user2', n=3)print(f"أفضل 3 توصيات لـ user2: {top_3_for_user2}")

الخاتمة

في هذه المقالة، تعلمت كيفية بناء نظام توصية بسيط وفعال باستخدام مبادئ التصفية التعاونية مع مكتبة Surprise في بايثون. لقد غطينا جميع الخطوات عمليًا، من إعداد مجموعة البيانات الخاصة بك وتدريب النموذج باستخدام خوارزمية SVD إلى تقييم الأداء وتقديم توصيات مخصصة للمستخدمين في النهاية. بالبناء على هذا الأساس، يمكنك تطوير نظامك بشكل أكبر باستخدام أنظمة التوصية الهجينة، أو حلول لمشاكل البداية الباردة، أو خوارزميات أكثر تقدمًا. استمر في استكشاف هذا التطبيق العملي للذكاء الاصطناعي!

العودة إلى المدونة

التعليقات (0)

لا توجد تعليقات بعد. كن أول من يعلق!

إرسال التعليق