مقالات میهمان

فیلم گردی با فیلیمو – بخش اول: تحلیل گراف بازیگران

مقاله میهمان

این مقاله توسط جناب آقای پوریا گنجی در وب سایت ویرگول منتشر شده است که مهندسی داده با هدف جمع‌آوری مطالب مفید حوزه پردازش داده، آنرا با کسب اجازه از نویسنده محترم،‌باز نشر داده‌ است.

پیش نوشت: شاید عنوان پست بیشتر مناسب بخش دوم باشه که به خوشه بندی فیلم ها بر اساس متن معرفی فیلم ها میپردازیم. این بخش بیشتر به تحلیل اطلاعات بازیگران فیلم ها اختصاص داره.

چند سال اخیر شاهد کاهش قدرت تلویزیون و رشد مصرف محتوای ویدیویی بر بستر اینترنت بودیم. یکی از رقبای تلویزیون در این مورد، VOD ها هستن که در ازای پرداخت حق اشتراک مشخصی به ما امکان میدن در هر ساعتی از روز برنامه دلخواه خودمون رو تماشا کنیم. فیلیمو معروف ترین سرویس دهنده تو این حوزه به شمار میره. یکی از قابلیت هایی که فیلیمو برای کاربران فراهم کرده و دسترسی به محتوا رو راحت تر میکنه، دسته بندی بر اساس ژانر و زمان ساخت فیلمه. در ادامه با هم به دسته فیلم های دهه ۹۰ شمسی که شامل حدود ۳۶۰ فیلم میشه میپردازیم.

داده های سایت فیلیمو شامل اسم فیلم، معرفی فیلم، ژانر، بازیگران و سایر عوامل فیلم میشه. با استفاده از اطلاعات بازیگران، روابط بین اونها رو در یک شبکه مدلسازی میکنیم و نگاهی به مهم ترین بازیگران و همکاری هایی که ممکنه اتفاق بیفته، داریم.

مدلسازی رو بر اساس مفهوم گراف انجام میدیم. گراف ساختاری شامل اشیای به هم پیوسته هست. در ساده ترین حالت، رابطه دوستی میتونه یک گراف باشه. مثلا من تعدادی دوست دارم و دوستانم به همین ترتیب تعدادی دوست دارن. دوستان دوست من ممکن هست دوست من هم باشن یا نباشن. مشابه رابطه دوستی در شکل زیر. (گرافی که معرفی کردیم دسته گراف غیر جهت دار هست دسته های دیگری از گراف ها هم وجود دارن مثل گراف جهت دار که علاوه بر وجود رابطه، جهت رابطه هم معنی دار هست مثل رابطه پدر و فرزندی).

هر شخص در اینجا یک راس (node) حساب میشه و رابطه دوستی، یال (edge) گفته میشه. همین طور تعداد روابط مربوط به هر راس درجه (degree) هر راس محسوب میشه. گراف ها کابردهای متنوعی دارن. نحوه انتشار اخبار در توییتر و شناسایی جریان اطلاعات و کاربران تاثیرگزار در انتشار اطلاعات، شبکه حمل و نقل و شناسایی نقاط مهم و طراحی شبکه به گونه ای که شبکه در حالت کلی پایدار بمونه و با حذف برخی از راس ها مختل نشه و امکان ادامه فعالیت داشته باشه. شبکه های احتماعی و طراحی پیش نهاد دهنده (recommender) بر اساس دوستان مشترک بخشی از کاربردهای تحلیل گراف هست. در مورد داده های فیلیمو ما مجموعه بازیگران رو به عنوان راس، رابطه همبازی بودن به عنوان یال و تعداد همبازی های هر بازیگر رو درجه بازیگر در نظر میگیریم. برای مصورسازی روابط و تحلیل هایی که میتونیم در یک گراف انجام بدیم از نرم افزار Gephi استفاده کردم. Gephi رابط کاربری نسبتا ساده ای داره و میتونیم انواع داده ها با فرمت های مخالف رو به عنوان ورودی به نرم افزار بدیم، داده ها رو براساس معیارهای مختلف filter کنیم و انواع تحلیل ها رو به راحتی روی داده ها انجام بدیم. هسته نرم افزار به کمک زبان جاوا نوشته شده و امکان افزودن امکاناتی که توسط سایر کاربران توسعه داده شده با نصب plugin ها وجود داره. اطلاعات مورد استفاده ما شامل دو فایل جداگانه برای اطلاعات راس ها (بازیگران) و یال ها (رابطه همبازی بودن) هستن و در دو مرحله داده ها رو import میکنیم (مطابق راهنمای github نرم افزار).

اطلاعات راس ها (بازیگران)
اطلاعات راس ها (بازیگران)

ستون id : شناسه منحصر به فرد هر بازیگر

ستون actor : نام بازیگر

ستون weight : تعداد فیلم هایی که هر بازیگر بازی کرده

اطلاعات همبازی بودن
اطلاعات همبازی بودن

ستون source : مبدا یال

ستون target : مقصد یال

ستون title : نام فیلم

داده های ما در مجموع شامل اطلاعات ۱۰۱۴ بازیگر، ۷۷۳۰ رابطه همبازی بودن و ۳۶۰ فیلم هست. میانگین تعداد همبازی برای هر بازیگر ۱۵٫۲به دست امده یعنی هر بازیگر به طور متوسط با ۱۵ نفر همبازی بوده.
بعد از ورود داده ها، موقعیت راس ها روی صفحه به صورت تصادفی انتخاب میشه که میتونیم از طریق پنجره layout اون رو تغییر بدیم. مثلا اگر مایل باشیم رئوسی که از نظر وزن ( weight) و تعداد روابط (degree) شبیه هم هستن نزدیک هم قرار بگیرن میتونیم از openord استفاده کنیم. به این ترتیب رئوسی که خصوصیاتی مشابه دارن در یک محدوده قرار میگیرن. یا خیلی ساده میتونیم با انتخاب circular layout رئوس رو به ترتیب یک خصوصیت مثلا تعداد فیلم های هر بازیگر (weight) روی محیط یک دایره قرار بدیم.

circular layout
circular layout

در ادامه انواع layout و موارد استفاده هر کدوم اشاره شده

انواع layout
انواع layout
موارد استفاده انواع layout
موارد استفاده انواع layout

بصری سازی داده ها امکانات جالبی رو فراهم میکنه مثلا میتونیم اندازه هر راس رو معادل تعداد فیلم های هر بازیگر (weight) و تعداد افرادی که با اونها همبازی بوده (درجه – degree) رو به صورت شدت رنگ در نظر بگیریم به این صورت که هر قدر اندازه راس بزرگتر، تعداد فیلم های بیشتر و هرچقدر پررنگ تر تعداد همبازی ها بیشتر. با کلیک روی هر راس، راس های مجاور نمایش داده میشن و به این ترتیب برای هر بازیگر همبازی ها قابل تشخیص میشن.

همون طور که در تصویر مشخصه سه بازیگری که بیشترین فیلم رو در مجموعه داده های ما داشتن به ترتیب سحر قریشی، مهران رجبی و بابک حمیدیان بودن. هرکدوم به ترتیب در بیست ویک، نوزده و هفده فیلم حضور داشتن.

در ادامه به مرور تعدادی از اصطلاحات و روابط در گراف داده ها میپردازیم.

قطر شبکه (network diameter) به معنی حداکثر فاصله موجود بین دو نقطه در شبکه هست. در مجموعه داده های ما بیشترین فاصله بین بازیگران ۷ رابطه هست به این معنی که هر بازیگر حداکثر با ۷ واسطه با هر بازیگر دیگری ارتباط داره. مثلا بین صدرالدین حجازی و یاسمن نصرتی این حداکثر فاصله ۷ تایی وجود داره ( قطر شبکه ۷ است) و کوتاه ترین زنجیره بین این دو بازیگر به این صورته :

‘صدرالدین حجازی’>> ‘آزاده ریاضی’>> ‘زهره حمیدی’>> ‘سحر قریشی’>> ‘لیلا زارع’>> ‘نسیم ادبی’>> ‘عصمت رضاپور’>> ‘یاسمن نصرتی’

میانگین فاصله (average path length) بین تمام بازیگران در شبکه حدود ۳ هست یعنی به طور متوسط هر بازیگر با ۳ واسطه با بازیگر دیگه در ارتباطه.

در هر گرافی امکان داره راس هایی وجود داشته باشن که جدا از سایر راس های مجموعه باشن. به این ترتیب که فقط بین چند راس رابطه وجود داره و خودشون به تنهایی زیرگراف (connected components) تشکیل میدن. در مجموعه داده های ما در مجموع ۱۲ زیرگراف موجوده که در شکل زیر قابل مشاهده هست. حدود ۹۵ درصد از راس ها گراف اصلی رو تشکیل میدن (گراف سبز رنگ) و سایر گراف ها مربوط به بازیگرانی هستن که فقط در یک فیلم حضور داشتن و با همون مجموعه بازیگران همبازی بودن که در ادامه به همین دلیل از نتایج تحلیل کنار گذاشته میشن.

برای شناسایی راس های مهم در شبکه معیارهای مختلفی وجود داره مثلا در مورد شبکه حمل و نقل فرودگاهی بین المللی، شهر تهران، راس مهمیه، چون عمده پروازهای بین المللی مبدا و مقصدشون شهر تهرانه و در شبکه به عنوان hub محسوب میشه.

معیار closeness centrality یکی دیگه از شاخص ها برای شناسایی راس های مهم در شبکه هست و هر راس از نظر میانگین فاصله با سایر راس ها ارزیابی میشه و طبق این فرض کار میکنه که راس مهم کمترین فاصله رو با سایر راسها در شبکه داره.

در ادامه نتیجه ارزیابی بر اساس این شاخص رو مشاهده میکنین:

معیار closeness centrality
معیار closeness centrality

معیار دیگه برای ارزیابی راس های مهم betweenness centrality هست و راس ها از نظر میزان تکرار در مسیر سایر راس ها ارزیابی میشن. به این ترتیب راسی مهم هست که به عنوان واسطه ارتباط بین سایر راسها قرار میگیره و طبق معادله زیر به دست میاد.

مثلا برای محاسبه betweenness centrality مربوط به راس ۲۰ در شکل زیر به این صورت عمل میکنیم. برای نمونه دو راس ۲و ۳۴ رو انتخاب میکنیم. بین دو راس ۳۴ و ۲ سه مسیر (کوتاه ترین مسیر) وجود داره و یکی از این مسیرها از راس ۲۰ میگذره. پس یکی از معادلات برای محاسبه ۱/۳ هست. حالا باید تمام مسیرهای موجود برای هر جفت راس و تعداد تکرار راس ۲۰ در اونها در شبکه محاسبه بشن و با هم جمع بشن تا betweenness centrality برای راس ۲۰ رو داشته باشیم.

نتیجه شاخص betweenness centrality روی داده های فیلیمو:

معیار betweenness centrality
معیار betweenness centrality

طبق خروجی های دو جدول بالا، نتایج با هم شباهت هایی دارن و بیشتر بازیگران بر اساس دو معیار مشترک هستن. روش های دیگه ای برای سنجش راس های مهم در شبکه (مثل eigenvector centrality) وجود داره که براساس شرایط مساله و رفتار شبکه میتونیم از اونها استفاده کنیم.

یکی دیگه از سولات مهمی که میشه در مورد رفتار شبکه پرسید اینه که در آینده بین کدوم راس ها احتمال بیشتری وجود داره که اتصال برقرار بشه (link prediction) یا کدوم ترکیب از بازیگران مناسبه و میتونه در فیلم های آینده استفاده بشه.

ساده ترین روش اینه که کدوم بازیگران همبازی های مشترکی دارن اما هنوز با هم همبازی نبودن (common neighbours).

برای پاسخ به این پرسش ماژولی در gephi وجود نداره. بنابراین از ماژول networkx در زبان پایتون استفاده شده.

Python
Python

به این ترتیب ۱۰ تا از بازیگرانی که همچین شرایطی رو داشتن مشخص شدن. مثلا امین حیایی و بهنوش بختیاری ۱۹ همبازی مشترک داشتن در صورتی که هنوز با هم همبازی نبودن.

معیار دیگه برای پیش بینی مسیرهای آینده resource allocation هست. این معیار بر اساس میزانی از منابع که از راسی به راس دیگه و از طریق همسایگان مشترک، انتقال پیدا میکنه، محاسبه میشه.

برای درک بهتر نحوه محاسبه این شاخص راسهای A,C شکل زیر رو بررسی میکنیم

مثلا برای محاسبه resource allocation دو راس A و C در شکل بالا به این صورت عمل میکنیم. از A تا C دو راس BوD وجود داره. برای راس B یک سوم از مسیرها به C ختم میشه (از مجموع سه مسیر برای B یک مسیر به C میرسه) و همین طور برای راس D یک سوم از مسیرها به C ختم میشه (از مجموع سه مسیر برای D یک مسیر به C میرسه).


خروجی محاسبه شده برای شاخص resource allocation :

Python
Python

در مورد link prediction هم روش های زیادی وجود داره مثل:

Jaccard Coefficient

Adamic-Adar Index

Preferential Attachment Score

اگه تا این قسمت پست ادامه دادین از صبر و حوصلتون برای خوندن این پست نسبتا طولانی تشکر میکنم و امیدوارم براتون مفید باشه :). در بخش بعدی به خوشه بندی بر اساس متن معرفی فیلم ها میپردازیم.


ایمیل: pooryaganji1368@gmail.com

لینکداین: https://www.linkedin.com/in/poorya-ganji-a361a310b/

مجتبی بنائی

دانشجوی دکترای نرم‌افزار دانشگاه تهران (yun.ir/smbanaie)، مدرس دانشگاه و فعال در حوزه توسعه نرم‌افزار و مهندسی داده که تمرکز کاری خود را در چند سال اخیر بر روی مطالعه و تحقیق در حوزه کلان‌داده و زیرساخت‌های پردازش داده و تولید محتوای تخصصی و کاربردی به زبان فارسی و انتشار آنها در سایت مهندسی داده گذاشته است. مدیریت پروژه‌های نرم‌افزاری و طراحی سامانه‌های مقیاس‌پذیر اطلاعاتی از دیگر فعالیتهای صورت گرفته ایشان در چند سال گذشته است.

1 دیدگاه

  1. بسیار عالی بود. چنین مثال‌های کاربردی و با این بیان روان در کمتر جایی پیدا می‌شود.
    موفق و موید باشید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.

دکمه بازگشت به بالا