بناء نظام توصيات بسيط باستخدام Python: مقدمة خوارزميات Recommendation

بناء نظام توصيات بسيط باستخدام Python: مقدمة خوارزميات Recommendation

أنظمة التوصية Recommendation Systems أصبحت جزءاً أساسياً من أي منتج تقني تقريباً: من اقتراح الفيديوهات في يوتيوب، إلى المنتجات في أمازون، إلى الأغاني في منصات الموسيقى. في هذا المقال من افهم صح سنشرح أساسيات أنظمة التوصية، ثم نبني خطوة بخطوة Recommendation System Python بسيط باستخدام بايثون فقط، مع كود عملي يمكنك نسخه وتجربته مباشرة.

إذا كنت مهتماً بمجال الذكاء الاصطناعي عموماً، يمكنك أيضاً مراجعة:

ما هو نظام التوصية Recommendation System؟

نظام التوصية هو خوارزمية تقوم بتحليل بيانات المستخدمين (سلوكهم، تقييماتهم، اهتماماتهم…) ثم تقترح عليهم عناصر (منتجات، أفلام، مقالات، دورات، إلخ) يُتوقَّع أن تعجبهم.

أهم الأهداف:

  • تحسين تجربة المستخدم (العثور على ما يهمه بسرعة).
  • زيادة التفاعل (مشاهدات، نقرات، وقت استخدام).
  • زيادة الأرباح في المتاجر الإلكترونية ومنصات المحتوى.

الأنواع الأساسية لأنظمة التوصية

هناك عدة طرق لبناء Recommendation System، لكن أشهر الأنواع:

1. التوصية المعتمدة على المحتوى Content-Based Filtering

في هذه الطريقة نحلّل خصائص العناصر نفسها (مثلاً: نوع الفيلم، الممثلين، المخرج، الكلمات المفتاحية، التصنيف…) ثم نقارنها بما أحبّه المستخدم سابقاً. إذا كان المستخدم يحب أفلام الأكشن، سيُقترَح له أفلام أخرى من نفس النوع.

أفكار مهمة:

  • تمثيل كل عنصر (فيلم، منتج، مقال) على شكل متجه Features Vector.
  • حساب التشابه بين العناصر باستخدام مقاييس مثل Cosine Similarity.
  • توصية العناصر الأكثر تشابهاً مع العناصر التي أعجب بها المستخدم.

2. التوصية التعاونية Collaborative Filtering

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

  • User-based: العثور على مستخدمين مشابهين للمستخدم الحالي.
  • Item-based: العثور على عناصر تشبه العناصر التي قيّمها المستخدم بشكل إيجابي.

3. التوصية الهجينة Hybrid Recommendation Systems

غالباً ما يتم دمج أكثر من طريقة (محتوى + تعاوني + قواعد مخصصة + خوارزميات تعلم عميق) للحصول على أداء أفضل وتغطية سيناريوهات أكثر تعقيداً.

ما الذي سنبنيه في هذا المقال؟

سنركز على بناء Content-Based Recommendation System باستخدام Python، لأنه:

  • أسهل في الفهم للمبتدئين.
  • لا يحتاج إلى كمية كبيرة من بيانات المستخدمين.
  • مناسب كمقدمة عملية لفهم فكرة أنظمة التوصية قبل الانتقال للأساليب المتقدمة.

سنستخدم مثال بسيط لنظام يوصي بأفلام مشابهة لفيلم معيّن، ويمكنك تعديل الكود لاحقاً ليتعامل مع: منتجات متجر إلكتروني، مقالات مدونة، دورات تعليمية، أو أي نوع من العناصر.

المتطلبات الأساسية

قبل أن تبدأ، يُفضّل أن يكون لديك أساسيات:

  • معرفة أساسية بلغة Python.
  • معرفة بسيطة بمكتبة pandas للتعامل مع البيانات الجدولية.
  • فهم عام لمفهوم المتجهات والتشابه (Cosine Similarity).

سنستخدم المكتبات التالية في بايثون:

  • pandas: لتحميل البيانات وإدارتها.
  • scikit-learn: لتحويل النصوص إلى متجهات وحساب التشابه.

يمكن تثبيتها عبر:

pip install pandas scikit-learn

فكرة نظام التوصية الذي سنبنيه

سننشئ Recommendation System Python بسيط يعتمد على:

  1. مجموعة صغيرة من الأفلام، لكل فيلم:
    • عنوان الفيلم
    • الوصف (Description)
    • النوع (Genre)
  2. سنقوم بدمج الوصف + النوع في نص واحد لكل فيلم.
  3. نحوّل هذا النص إلى متجهات باستخدام TF-IDF Vectorizer.
  4. نحسب درجة التشابه بين كل فيلم وآخر باستخدام Cosine Similarity.
  5. نكتب دالة تقوم بـ:
    • استقبال اسم فيلم
    • إخراج قائمة بأكثر الأفلام المشابهة له.

الخطوة 1: إعداد بيانات بسيطة للأفلام

في مشروع حقيقي ستكون البيانات موجودة في قاعدة بيانات أو ملف CSV. لكن لأغراض الشرح، سننشئ DataFrame صغير مباشرة داخل الكود.

import pandas as pd

# إنشاء بيانات بسيطة للأفلام
data = {
    'title': [
        'The Matrix',
        'John Wick',
        'Inception',
        'Interstellar',
        'The Dark Knight',
        'Toy Story',
        'Finding Nemo',
        'Avengers: Endgame',
        'Iron Man',
        'Shrek'
    ],
    'genre': [
        'Action Sci-Fi',
        'Action Thriller',
        'Sci-Fi Thriller',
        'Sci-Fi Drama',
        'Action Crime',
        'Animation Family',
        'Animation Family',
        'Action Sci-Fi',
        'Action Sci-Fi',
        'Animation Comedy'
    ],
    'description': [
        'A computer hacker learns about the true nature of reality.',
        'An ex-hitman comes out of retirement to track down gangsters.',
        'A thief who steals corporate secrets through dream-sharing technology.',
        'Explorers travel through a wormhole in space in an attempt to save humanity.',
        'Batman faces the Joker, a criminal mastermind, in Gotham City.',
        'Toys come to life when humans are not around.',
        'A clownfish searches for his missing son.',
        'Superheroes assemble to defeat a powerful enemy.',
        'A billionaire builds a powerful suit of armor to fight evil.',
        'An ogre and a talking donkey go on a quest to rescue a princess.'
    ]
}

movies_df = pd.DataFrame(data)
print(movies_df.head())

بهذا أصبح لدينا جدول صغير يحتوي على 10 أفلام مع العنوان، النوع، والوصف.

الخطوة 2: تجهيز النص للتوصية (Features Engineering بسيط)

نريد إنشاء عمود نصّي يدمج المعلومات المهمّة في وصف واحد، مثلاً: genre + description. هذا النص سيكون الأساس الذي نعتمد عليه لحساب التشابه بين الأفلام.

# إنشاء عمود نصّي يجمع النوع + الوصف
movies_df['content'] = movies_df['genre'] + ' ' + movies_df['description']

print(movies_df[['title', 'content']].head())

يمكنك لاحقاً إضافة معلومات أخرى (ممثلين، مخرج، كلمات مفتاحية...) إلى هذا العمود لتحسين جودة التوصيات.

الخطوة 3: تحويل النصوص إلى متجهات باستخدام TF-IDF

الآن سنحوّل عمود content إلى متجهات رقمية. سنستخدم:

  • TF-IDF (Term Frequency - Inverse Document Frequency): تقنية شائعة في معالجة اللغة الطبيعية لتمثيل النصوص كمتجهات، تعطي أهمية أكبر للكلمات المميّزة والأقل تكراراً في كل النصوص.
from sklearn.feature_extraction.text import TfidfVectorizer

# إنشاء كائن TF-IDF Vectorizer
tfidf = TfidfVectorizer(stop_words='english')

# تحويل عمود المحتوى إلى متجهات
tfidf_matrix = tfidf.fit_transform(movies_df['content'])

print(tfidf_matrix.shape)  # (عدد الأفلام, عدد الكلمات المميّزة)

النتيجة ستكون مصفوفة ذات أبعاد (عدد الأفلام × عدد الكلمات الفريدة)، تمثّل كل فيلم كمتجه في فضاء عالي الأبعاد.

الخطوة 4: حساب درجة التشابه بين الأفلام (Cosine Similarity)

لاحتساب مدى تشابه فيلمين، نستخدم Cosine Similarity بين المتجهين اللذين يمثّلان كل فيلم. القيم تتراوح بين:

  • 1: تطابق تام
  • 0: لا يوجد تشابه
  • -1: تشابه عكسي (غير مهم غالباً هنا لأن القيم عادة غير سالبة في TF-IDF)
from sklearn.metrics.pairwise import cosine_similarity

# حساب مصفوفة التشابه بين جميع الأفلام
cosine_sim = cosine_similarity(tfidf_matrix, tfidf_matrix)

print(cosine_sim.shape)  # (عدد الأفلام, عدد الأفلام)

الآن cosine_sim[i, j] تمثّل درجة التشابه بين الفيلم رقم i والفيلم رقم j.

الخطوة 5: إنشاء دالة للحصول على الأفلام المشابهة

سنكتب دالة get_recommendations تأخذ:

  • movie_title: عنوان الفيلم الذي نريد التوصية بناءً عليه.
  • num_recommendations: عدد الأفلام المقترحة (افتراضياً 5).

ثم تقوم الدالة بالخطوات التالية:

  1. العثور على فهرس الفيلم المطلوب في movies_df.
  2. قراءة صف التشابه الخاص به من cosine_sim.
  3. ترتيب الأفلام حسب أعلى درجة تشابه.
  4. تجاهل الفيلم نفسه (الذي ستكون درجة تشابهه 1 مع نفسه).
  5. إرجاع قائمة بعناوين الأفلام الأكثر تشابهاً.
import numpy as np

# إنشاء قاموس يساعدنا على الوصول للفهرس من خلال العنوان
indices = pd.Series(movies_df.index, index=movies_df['title']).drop_duplicates()

def get_recommendations(title, num_recommendations=5):
    # التحقق من وجود الفيلم
    if title not in indices:
        print(f"الفيلم '{title}' غير موجود في قاعدة البيانات.")
        return []
    
    # الحصول على فهرس الفيلم
    idx = indices[title]
    
    # الحصول على درجات التشابه مع جميع الأفلام الأخرى
    sim_scores = list(enumerate(cosine_sim[idx]))
    
    # ترتيب الأفلام حسب درجة التشابه من الأعلى إلى الأقل
    sim_scores = sorted(sim_scores, key=lambda x: x[1], reverse=True)
    
    # تجاهل الفيلم نفسه (العنصر الأول بعد الترتيب)
    sim_scores = sim_scores[1:num_recommendations+1]
    
    # الحصول على الفهارس للأفلام المشابهة
    movie_indices = [i[0] for i in sim_scores]
    
    # إرجاع عناوين الأفلام المشابهة
    return movies_df['title'].iloc[movie_indices].tolist()

الخطوة 6: تجربة نظام التوصية

الآن يمكننا اختبار نظام التوصية الذي بنيناه:

# تجربة النظام
movie_name = 'The Matrix'
recommended_movies = get_recommendations(movie_name, num_recommendations=5)

print(f"أفلام مشابهة لـ {movie_name}:")
for m in recommended_movies:
    print('-', m)

ستلاحظ أن النتائج ستكون غالباً أفلام أكشن/خيال علمي مشابهة على مستوى النوع والوصف. يمكنك تجربة أفلام أخرى مثل: John Wick أو Toy Story ورؤية الفرق في التوصيات.

تحسين وتطوير Recommendation System Python

النظام الذي بنيناه بسيط جداً، لكنه يوضّح الفكرة الأساسية بوضوح. في التطبيقات الحقيقية يتم تطويره بعدة طرق:

1. إضافة المزيد من الخصائص (Features)

  • أسماء الممثلين، المخرج، سنة الإنتاج.
  • كلمات مفتاحية Keywords، وسوم Tags.
  • تصنيفات الجمهور (عائلي، للكبار فقط…).

يمكنك مثلاً إنشاء عمود content كالتالي:

movies_df['content'] = (
    movies_df['genre'] + ' ' +
    movies_df['description'] + ' ' +
    movies_df['director'] + ' ' +
    movies_df['actors']
)

ثم تعيد تطبيق نفس الخطوات (TF-IDF → Cosine Similarity).

2. التعامل مع اللغة العربية أو لغات متعددة

إذا أردت بناء نظام توصية لمحتوى عربي:

  • استخدم stop words عربية (كلمات التوقف مثل: من، في، على...).
  • يمكنك استخدام أدوات مثل scikit-learn مع إعدادات خاصة باللغة أو مكتبات خارجية لمعالجة النصوص العربية.

3. استخدام Collaborative Filtering مع بيانات المستخدمين

النظام الحالي يعتمد فقط على محتوى الفيلم. لكن في الواقع، التوصية تكون أقوى عند استخدام بيانات التفاعل:

  • تقييمات (Ratings) المستخدمين للأفلام.
  • السلوك (ما يشاهده المستخدم، ماذا يتجاهل، مدة المشاهدة...).

هناك مكتبات متخصصة مثل:

  • Surprise: لبناء أنظمة توصية تعاونية.
  • أو الاعتماد على Matrix Factorization / نماذج تعلم عميق لنمذجة المستخدمين والعناصر.

4. نشر النظام في تطبيق حقيقي

بعد بناء نموذج التوصية في Python، يمكن دمجه داخل:

الفكرة: تبني خدمة API تستقبل ID المستخدم أو العنصر، وتعيد قائمة بالتوصيات.

نصائح عملية عند بناء Recommendation System Python في مشروع حقيقي

  • ابدأ بنموذج بسيط مثل النموذج الذي شرحناه، ثم أضف التعقيد تدريجياً.
  • راقب الأداء: سرعة الحساب، استهلاك الذاكرة، قابلية التوسع مع زيادة عدد العناصر.
  • تقييم جودة التوصيات:
    • استخدام مقاييس مثل Precision@K, Recall@K في حالة توفر بيانات تاريخية.
    • أو الاعتماد على تجارب A/B مع المستخدمين الفعليين.
  • احفظ مصفوفة التشابه أو المتجهات في التخزين المؤقت (Cache) بدلاً من إعادة حسابها في كل طلب.

خلاصة: لماذا هذا المثال مهم؟

ما بنيناه ليس نظاماً إنتاجياً جاهزاً لملايين المستخدمين، لكنه:

  • يشرح بوضوح فكرة Content-Based Recommendation.
  • يعرّفك على استخدام TF-IDF وCosine Similarity في بايثون.
  • يعتبر نقطة انطلاق ممتازة للتعمق في أنظمة التوصية المعقدة والحديثة.

يمكنك الآن:

  • تغيير نوع البيانات (من أفلام إلى منتجات أو مقالات).
  • إضافة المزيد من الأعمدة وتحسين عمود content.
  • تجربة خوارزميات أخرى لتمثيل النصوص (مثل Word2Vec أو BERT) في مراحل متقدمة.

إذا كنت ترغب في توسيع فهمك للذكاء الاصطناعي وتطبيقاته العملية في مجالات أخرى (مثل الأمن السيبراني أو رؤية الحاسوب)، فأنصحك بقراءة:

في مقالات قادمة على افهم صح يمكن أن ننتقل إلى أمثلة أكثر تقدماً، مثل: نظام توصية تعاوني باستخدام بيانات التقييمات، أو نظام توصية يعتمد على نماذج تعلم عميق (Deep Learning) وتضمينات (Embeddings). ابق متابعاً.

حول المحتوى:

شرح أساسيات أنظمة التوصية مع مثال عملي باستخدام Python لبناء نظام توصية بسيط.

هل كان هذا مفيدًا لك؟

أضف تعليقك