اذهب إلى المحتوى

يتساءل العديد من مستخدمي منصة تيكتوك عن كيف يمكن لهذه المنصة أن تقدم لنا محتوى يبدو وكأنه مصمم خصيصًا لنا، حتى قبل أن نبحث عنه؟ لا بد أن هذا السؤال قد تبادر إلى ذهن الكثيرين ممن لاحظوا الدقة اللافتة في الاقتراحات التي تظهر لهم، والتي أثبتت أنها تعتمد بقوة على الخوارزميات في جذب انتباه المستخدمين.

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

سنتعمق في آلية عمل هذه الخوارزميات عمليًا بهذا المقال، وسنقدم شرحًا تطبيقيًا مبسطًا يوضح كيف تعمل أنظمة التوصية في تيكتوك، مما يسهم في تسهيل فهم هذه التكنولوجيا واستكشاف تطبيقاتها المتنوعة.

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

آلية عمل خوارزمية التوصية في منصة تيكتوك

تقوم خوارزميات التوصية التي تعتمدها منصة تيكتوك باقتراح محتوى مخصص يتحسن بمرور الوقت مع استمرار المستخدم في قضاء الوقت على المنصة، ولأجل ذلك يتم العمل على:

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

تهيئة بيئة العمل لبناء نظام توصية شبيه بنظام توصية تيكتوك

تعتمد خوارزميات تيكتوك كثيرًا على لغة البرمجة بايثون Python، خاصةً في تقنيات الذكاء الاصطناعي والتعلم الآلي لتطوير خوارزمياتها، بالإضافة إلى لغات برمجية أخرى مثل ++C و Java و Go.

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

نثبت المكتبات وأطر العمل التي نحتاجها على النحو الآتي:

pip install pandas scikit-learn

قراءة و تحليل البيانات الضخمة لفهم سلوك المستخدمين

سنطلب الآن قراءة البيانات وتحميلها من قاعدة البيانات المستخدمة وطباعة أول خمس صفوف منها باستخدام مكتبة Pandas.

    import pandas as pd  #DataFrames للتعامل مع البيانات وتحليلها باستخدام

    رابط ملف البيانات لتيكتوك بصيغة خام (raw) من GitHub #
    ratings_url = "https://raw.githubusercontent.com/Peter-Lankton/tik-tok-data/main/tik_tok_analytics.csv"
    ratings = pd.read_csv(ratings_url)
   عرض أول خمس صفوف من البيانات للتحقق من التحميل بنجاح #
    print(ratings.head())

وكما نلاحظ تتم قراءة خمس صفوف من قاعدة البيانات على النحو الآتي:

003 نظام التوصية

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

ستظهر لنا التعليمة التالية عدد الأعمدة و عدد الصفوف، بالاضافة الى نوع كل عمود و عدد القيم غير الفارغة:

ratings.info()

وستكون النتتيجة على النحو التالي:

    <class 'pandas.core.frame.DataFrame'>
    RangeIndex: 102 entries, 0 to 101
    Data columns (total 17 columns):
    #   Column        Non-Null Count  Dtype  
    ---  ------        --------------  -----  
    0   Video_Name    102 non-null    object 
    1   Tech          101 non-null    float64
    2   Upload_time   102 non-null    int64  
    3   Day           102 non-null    int64  
    4   Q_and_A       102 non-null    int64  
    5   has_captions  102 non-null    int64  
    6   Views         102 non-null    int64  
    7   Shares        101 non-null    float64
    8   Comments      102 non-null    int64  
    9   Likes         102 non-null    int64  
    10  Hashtags      83 non-null     object 
    11  Cover         102 non-null    int64  
    12  Length        102 non-null    int64  
    13  avg_watch     102 non-null    int64  
    14  Location      101 non-null    float64
    15  Humor         101 non-null    float64
    16  Hat           100 non-null    float64
    dtypes: float64(5), int64(10), object(2)
    memory usage: 13.7+ KB

معالجة البيانات

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

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

# حساب عدد القيم المكررة في العمود
ratings.duplicated(subset='Video_Name').sum() # 11

# إزالة التكرار
df = ratings.drop_duplicates(subset='Video_Name')

# التأكد من إزالة التكرار
df.duplicated(subset='Video_Name').sum() # 0

أخذ عينات عشوائية

بعد التأكد من إزالة التكرارات، سنعمل على حل المشاكل التي قد تقع بها الذاكرة، وسنعمل على أخذ عينات عشوائية على النحو التالي:

sample_size = 91  # عدد البيانات في الصفوف
# أخذ العينة
df = df.sample(n=sample_size, replace=False, random_state=80)

# إعادة ضبط الفهرس
df = df.reset_index()

# إزالة عمود 'index' الناتج من reset_index()
df = df.drop('index', axis=1)

تنظيف البيانات

ستحتاج البيانات الموجودة بقاعدة البيانات المستخدمة في هذه المرحلة الى التنظيف، ويكون ذلك من خلال ازالة المسافات البيضاء من عمود Video_Name لتجنب حدوث الأخطاء، إذ لو اعتمدنا التسمية العادية دون تنظيف، فقد يتسبب هذا بالحصول على نظام أقل دقة وصحة؛ فقد يعد الفيديو ?strong math for ml مثلًا و الفيديو strong opinion متشابهين.

توضح الصورة التوضيحية التالية مثالًا عن ازالة المسافات البيضاء من أسماء الفيديوهات:

005 نظام التوصية

وسنتتبع هنا كل مرحلة من مراحل تنظيف قاعدة البيانات، لتشمل كل أسماء الفيديوهات كما هو موضح في الكود كالتالي:

def clean_Video_Name(Video_Name):
  result = str(Video_Name).lower() # تحويل النص إلى حروف صغيرة (lowercase)
  return(result.replace(' ','')) # إزالة المسافات من النص

  df['Video_Name'] = df['Video_Name'].apply(clean_Video_Name) # يتم تطبيق التنظيف على كل قيمة في العمود باستخدام الدالة "clean_Video_Name"
  df.head()

وستكون النتيجة على النحو:

004 نظام التوصية

نحوّل الآن بيانات اسم الفيديو والوسوم إلى أحرف صغيرة:

# تحويل جميع القيم في عمود "Video_Name" إلى حروف صغيرة (lowercase)
df['Video_Name'] = df['Video_Name'].str.lower()

# تحويل جميع القيم في عمود "Hashtags" إلى حروف صغيرة (lowercase)
df['Hashtags'] = df['Hashtags'].str.lower()

# عرض أول خمس صفوف من DataFrame للتحقق من التغييرات
df.head()

بعد ذلك ندمج الأعمدة المستخدمة في نظام التوصية، بحيث يتم تكوين نص واحد لكل صف يتكون من جميع القيم النصية التي كانت موجودة في الأعمدة.

# حذف الأعمدة غير المطلوبة
df2 = df.drop(['Tech', 'Upload_time', 'Day', 'Q_and_A', 'has_captions', 
            'Views', 'Shares', 'Comments', 'Likes', 'Cover', 'Length', 
            'avg_watch', 'Location', 'Humor', 'Hat'], axis=1)

# تحقق من الأعمدة المتبقية
print(df2.columns)
print(df2.head())

# دمج النصوص في الأعمدة المتبقية
df2['Data'] = df2[df2.columns[1:]].apply(
    lambda x: ' '.join(x.dropna().astype(str)),
    axis=1
)

# عرض النتيجة
    print(df2['Data'].head())

وستكون النتيجة كالتالي:

006 نظام التوصية

تحويل أطر البيانات Dataframe إلى تمثيلات عددية

من أجل تحويل النصوص إلى تمثيلات عددية تعبر عن تكرار الكلمات في مجموعة النصوص من أجل تسهيل فهم النصوص وتحليلها بدقة من طرف النموذج، سوف نستخدم دالة ()CountVectorizer من مكتبة Scikit-Learn كالتالي:

# استيراد CountVectorizer من مكتبة sklearn لتحويل النصوص إلى تمثيل عددي
from sklearn.feature_extraction.text import CountVectorizer

# إنشاء كائن CountVectorizer لتحويل النصوص إلى متجهات تمثل تكرار الكلمات
vectorizer = CountVectorizer()

# تطبيق fit_transform على عمود 'Data' في DataFrame df2  لتحويل النصوص إلى تمثيل عددي
# fit_transform تقوم بتدريب CountVectorizer على البيانات وتحويل النصوص إلى مصفوفة من التكرارات
vectorized = vectorizer.fit_transform(df2['Data'])

حساب تشابه الفيديوهات لبناء نظام التوصية

في أنظمة التوصية، الهدف الأساسي هو اقتراح محتوى يتناسب مع اهتمامات المستخدم. يعتمد ذلك على إيجاد تشابه بين المحتوى المعروض والمحتوى الذي سبق أن تفاعل معه المستخدم؛ إذ لو اعتمدنا فقط على التطابق الحرفي بين أسماء الفيديوهات أو الوسوم، فقد نفقد العديد من العلاقات المهمة بين المحتوى، فقد يحدث تشابه بالكلمات أحيانًا رغم وجود اختلاف تام بالمحتوى، بالتالي اقتراح الفيديو بناءً على الكلمات المستخدمة وحدها، لن يكون كافي، ولهذا السبب سنحول أسماء الفيديوهات والوسوم إلى متجهات عددية باستخدام دالة ()CountVectorizer، ثم نحسب درجة التشابه بين هذه المتجهات باستخدام دالة cosine_similarity من مكتبة sklearn.

بمعنى آخر، يمكننا استخدام تشابه جيب التمام لقياس مدى تشابه الفيديوهات من خلال مقارنة تمثيل البيانات. اسم الفيديو والوسم.

# استيراد cosine_similarity من مكتبة sklearn  لحساب التشابه بين المتجهات باستخدام مقياس جيب التمام
from sklearn.metrics.pairwise import cosine_similarity

# حساب التشابه بين المتجهات التي تم إنشاؤها باستخدام CountVectorizer
# سيتم حساب تشابه جيب التمام بين كل زوج من المتجهات
similarities = cosine_similarity(vectorized)

# طباعة مصفوفة التشابه بين الفيديوهات أو النصوص
print(similarities)

نلاحظ النتيجة كالتالي :

002 نظام التوصية

وكما هو واضح، تتراوح نتائج نسبة التشابه بين 0 و1، و يمثل كل متجه تشابه فيديو بالنسبة إلى فيديو آخر؛ لكن نظرًا لعدم ذكر عناوين الفيديوهات هنا، سنحتاج مجددًا لتعيين هذا المتجه إلى إطار البيانات السابق.

ملاحظة : متجه التشابه هو تمثيل عددي يعبّر عن مدى التشابه بين كل فيديو وآخر. يتم حسابه باستخدام دالة Cosine Similarity، بحيث تكون كل قيمة في المتجه مؤشرًا على درجة القرب بين الفيديوهات بناءً على اسم الفيديو والوسم.

# تحويل مصفوفة التشابه إلى DataFrame باستخدام pandas
# نقوم بتحديد الأعمدة على أنها أسماء الفيديوهات (من العمود 'Video_Name')، والصفوف على أنها الوسوم (من العمود #'Hashtags')
df = pd.DataFrame(similarities, columns=df['Video_Name'], index=df['Hashtags']).reset_index()

# عرض أول 5 صفوف من DataFrame لتفقد النتيجة
df.head()

001 نظام التوصية

في هذه المرحلة حولنا متجه التشابه إلى إطار بيانات يحتوي على أسماء الفيديوهات المدرجة رأسيًا وأفقيًا. تمثل قيم إطار البيانات تشابه جيب التمام بين الفيديوهات المختلفة.

نلاحظ أيضًا أن الخط القطري يساوي دائمًا 1.000، وهو يعرض تشابه كل فيديو مع نفسه.

عرض التوصية للمستخدم

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

# إذا كانت لديك مصفوفة التشابه 'similarities' وبيانات الفيديو 'df2'
similarities_df = pd.DataFrame(
    similarities, 
    index=df2['Video_Name'], 
    columns=df2['Video_Name']
)

# دالة للحصول على التوصيات بناءً على الفيديو المدخل
def get_recommendations(video_name, top_n=5):
    if video_name in similarities_df.columns:
        recommendations = (
            similarities_df[video_name]
            .nlargest(top_n + 1)   # الحصول على أفضل N+1 (بما في ذلك الفيديو نفسه)
            .iloc[1:]   # إرجاع أسماء الفيديوهات الموصى بها
        )
        return recommendations.index.tolist()  
    else:
        return f"'{video_name}' not found in the video list."

# مثال للاستخدام
input_video = 'strongopinionk8s' # نستبدله بالفيديو الذي نرغب في الحصول على التوصيات بناءً عليه
recommended_videos = get_recommendations(input_video, top_n=5)

print("Recommended videos:")
print(recommended_videos)

وهنا سنلاحظ النتيجة المتمثلة في أحسن خمس فيديوهات مقترحة:

Recommended videos:
['housefoundation', 'showinghowresucanworks', 'recommendeddatacourses', 'softwareengineering?', 'firstdataanalyticshw']

الخاتمة

يمكن القول أن خوارزميات أنظمة التوصية هي جوهر التجربة الرقمية المخصصة التي تقدمها منصات التواصل الاجتماعي؛ فمن خلال تحليل سلوك المستخدمين وتفاعلهم مع المحتوى، يمكن لهذه الخوارزميات أن تقدم توصيات دقيقة تتناسب مع اهتماماتهم الشخصية.

باستخدام تقنيات مثل التعلم الآلي وتحليل البيانات الضخمة، تستمر هذه الأنظمة في تحسين دقة التوصيات مع مرور الوقت، مما يعزز تجربة المستخدم بشكل كبير.

المصادر

اقرأ أيضًا


تفاعل الأعضاء

أفضل التعليقات

لا توجد أية تعليقات بعد



انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أضف تعليق

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • أضف...