حول المحتوى:
شرح أساسيات أنظمة التوصية مع مثال عملي باستخدام Python لبناء نظام توصية بسيط.
أنظمة التوصية Recommendation Systems أصبحت جزءاً أساسياً من أي منتج تقني تقريباً: من اقتراح الفيديوهات في يوتيوب، إلى المنتجات في أمازون، إلى الأغاني في منصات الموسيقى. في هذا المقال من افهم صح سنشرح أساسيات أنظمة التوصية، ثم نبني خطوة بخطوة Recommendation System Python بسيط باستخدام بايثون فقط، مع كود عملي يمكنك نسخه وتجربته مباشرة.
إذا كنت مهتماً بمجال الذكاء الاصطناعي عموماً، يمكنك أيضاً مراجعة:
نظام التوصية هو خوارزمية تقوم بتحليل بيانات المستخدمين (سلوكهم، تقييماتهم، اهتماماتهم…) ثم تقترح عليهم عناصر (منتجات، أفلام، مقالات، دورات، إلخ) يُتوقَّع أن تعجبهم.
أهم الأهداف:
هناك عدة طرق لبناء Recommendation System، لكن أشهر الأنواع:
في هذه الطريقة نحلّل خصائص العناصر نفسها (مثلاً: نوع الفيلم، الممثلين، المخرج، الكلمات المفتاحية، التصنيف…) ثم نقارنها بما أحبّه المستخدم سابقاً. إذا كان المستخدم يحب أفلام الأكشن، سيُقترَح له أفلام أخرى من نفس النوع.
أفكار مهمة:
هنا نعتمد على تشابه المستخدمين أو تشابه التقييمات. الفكرة: إذا كان هناك مستخدمان متشابهان في التفضيلات، يمكن أن نوصي لكلٍ منهما بما أعجب الآخر.
غالباً ما يتم دمج أكثر من طريقة (محتوى + تعاوني + قواعد مخصصة + خوارزميات تعلم عميق) للحصول على أداء أفضل وتغطية سيناريوهات أكثر تعقيداً.
سنركز على بناء Content-Based Recommendation System باستخدام Python، لأنه:
سنستخدم مثال بسيط لنظام يوصي بأفلام مشابهة لفيلم معيّن، ويمكنك تعديل الكود لاحقاً ليتعامل مع: منتجات متجر إلكتروني، مقالات مدونة، دورات تعليمية، أو أي نوع من العناصر.
قبل أن تبدأ، يُفضّل أن يكون لديك أساسيات:
سنستخدم المكتبات التالية في بايثون:
يمكن تثبيتها عبر:
pip install pandas scikit-learn سننشئ Recommendation System Python بسيط يعتمد على:
في مشروع حقيقي ستكون البيانات موجودة في قاعدة بيانات أو ملف 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 أفلام مع العنوان، النوع، والوصف.
نريد إنشاء عمود نصّي يدمج المعلومات المهمّة في وصف واحد، مثلاً: genre + description. هذا النص سيكون الأساس الذي نعتمد عليه لحساب التشابه بين الأفلام.
# إنشاء عمود نصّي يجمع النوع + الوصف
movies_df['content'] = movies_df['genre'] + ' ' + movies_df['description']
print(movies_df[['title', 'content']].head()) يمكنك لاحقاً إضافة معلومات أخرى (ممثلين، مخرج، كلمات مفتاحية...) إلى هذا العمود لتحسين جودة التوصيات.
الآن سنحوّل عمود content إلى متجهات رقمية. سنستخدم:
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) # (عدد الأفلام, عدد الكلمات المميّزة) النتيجة ستكون مصفوفة ذات أبعاد (عدد الأفلام × عدد الكلمات الفريدة)، تمثّل كل فيلم كمتجه في فضاء عالي الأبعاد.
لاحتساب مدى تشابه فيلمين، نستخدم Cosine Similarity بين المتجهين اللذين يمثّلان كل فيلم. القيم تتراوح بين:
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.
سنكتب دالة get_recommendations تأخذ:
ثم تقوم الدالة بالخطوات التالية:
movies_df.cosine_sim.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() الآن يمكننا اختبار نظام التوصية الذي بنيناه:
# تجربة النظام
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 ورؤية الفرق في التوصيات.
النظام الذي بنيناه بسيط جداً، لكنه يوضّح الفكرة الأساسية بوضوح. في التطبيقات الحقيقية يتم تطويره بعدة طرق:
يمكنك مثلاً إنشاء عمود content كالتالي:
movies_df['content'] = (
movies_df['genre'] + ' ' +
movies_df['description'] + ' ' +
movies_df['director'] + ' ' +
movies_df['actors']
) ثم تعيد تطبيق نفس الخطوات (TF-IDF → Cosine Similarity).
إذا أردت بناء نظام توصية لمحتوى عربي:
النظام الحالي يعتمد فقط على محتوى الفيلم. لكن في الواقع، التوصية تكون أقوى عند استخدام بيانات التفاعل:
هناك مكتبات متخصصة مثل:
بعد بناء نموذج التوصية في Python، يمكن دمجه داخل:
الفكرة: تبني خدمة API تستقبل ID المستخدم أو العنصر، وتعيد قائمة بالتوصيات.
ما بنيناه ليس نظاماً إنتاجياً جاهزاً لملايين المستخدمين، لكنه:
يمكنك الآن:
content.إذا كنت ترغب في توسيع فهمك للذكاء الاصطناعي وتطبيقاته العملية في مجالات أخرى (مثل الأمن السيبراني أو رؤية الحاسوب)، فأنصحك بقراءة:
في مقالات قادمة على افهم صح يمكن أن ننتقل إلى أمثلة أكثر تقدماً، مثل: نظام توصية تعاوني باستخدام بيانات التقييمات، أو نظام توصية يعتمد على نماذج تعلم عميق (Deep Learning) وتضمينات (Embeddings). ابق متابعاً.
شرح أساسيات أنظمة التوصية مع مثال عملي باستخدام Python لبناء نظام توصية بسيط.
مساحة اعلانية