علاقه مند به تحلیل داده. لینکدین:https://www.linkedin.com/in/pooryaganji
فیلم گردی با فیلیمو (بخش اول: تحلیل گراف بازیگران)
پیش نوشت: شاید عنوان پست بیشتر مناسب بخش دوم باشه که به دسته بندی فیلم ها بر اساس متن معرفی فیلم ها میپردازیم. این بخش بیشتر به تحلیل اطلاعات بازیگران فیلم ها اختصاص داره.
چند سال اخیر شاهد کاهش قدرت تلویزیون و رشد مصرف محتوای ویدیویی بر بستر اینترنت بودیم. یکی از رقبای تلویزیون در این مورد، VOD ها هستن که در ازای پرداخت حق اشتراک مشخصی به ما امکان میدن در هر ساعتی از روز برنامه دلخواه خودمون رو تماشا کنیم. فیلیمو معروف ترین سرویس دهنده تو این حوزه به شمار میره. یکی از قابلیت هایی که فیلیمو برای کاربران فراهم کرده و دسترسی به محتوا رو راحت تر میکنه، دسته بندی بر اساس ژانر و زمان ساخت فیلمه. در ادامه با هم به دسته فیلم های دهه 90 شمسی که شامل حدود 360 فیلم میشه میپردازیم.
داده های سایت فیلیمو شامل اسم فیلم، معرفی فیلم، ژانر، بازیگران و سایر عوامل فیلم میشه. با استفاده از اطلاعات بازیگران، روابط بین اونها رو در یک شبکه مدلسازی میکنیم و نگاهی به مهم ترین بازیگران و همکاری هایی که ممکنه اتفاق بیفته، داریم.
مدلسازی رو بر اساس مفهوم گراف انجام میدیم. گراف ساختاری شامل اشیای به هم پیوسته هست. در ساده ترین حالت، رابطه دوستی میتونه یک گراف باشه. مثلا من تعدادی دوست دارم و دوستانم به همین ترتیب تعدادی دوست دارن. دوستان دوست من ممکن هست دوست من هم باشن یا نباشن. مشابه رابطه دوستی در شکل زیر. (گرافی که معرفی کردیم دسته گراف غیر جهت دار هست دسته های دیگری از گراف ها هم وجود دارن مثل گراف جهت دار که علاوه بر وجود رابطه، جهت رابطه هم معنی دار هست مثل رابطه پدر و فرزندی).
هر شخص در اینجا یک راس (node) حساب میشه و رابطه دوستی، یال (edge) گفته میشه. همین طور تعداد روابط مربوط به هر راس درجه (degree) هر راس محسوب میشه. گراف ها کابردهای متنوعی دارن. نحوه انتشار اخبار در توییتر و شناسایی جریان اطلاعات و کاربران تاثیرگزار در انتشار اطلاعات، شبکه حمل و نقل و شناسایی نقاط مهم و طراحی شبکه به گونه ای که شبکه در حالت کلی پایدار بمونه و با حذف برخی از راس ها مختل نشه و امکان ادامه فعالیت داشته باشه. شبکه های احتماعی و طراحی پیش نهاد دهنده (recommender) بر اساس دوستان مشترک بخشی از کاربردهای تحلیل گراف هست. در مورد داده های فیلیمو ما مجموعه بازیگران رو به عنوان راس، رابطه همبازی بودن به عنوان یال و تعداد همبازی های هر بازیگر رو درجه بازیگر در نظر میگیریم. برای مصورسازی روابط و تحلیل هایی که میتونیم در یک گراف انجام بدیم از نرم افزار Gephi استفاده کردم. Gephi رابط کاربری نسبتا ساده ای داره و میتونیم انواع داده ها با فرمت های مخالف رو به عنوان ورودی به نرم افزار بدیم، داده ها رو براساس معیارهای مختلف filter کنیم و انواع تحلیل ها رو به راحتی روی داده ها انجام بدیم. هسته نرم افزار به کمک زبان جاوا نوشته شده و امکان افزودن امکاناتی که توسط سایر کاربران توسعه داده شده با نصب plugin ها وجود داره. اطلاعات مورد استفاده ما شامل دو فایل جداگانه برای اطلاعات راس ها (بازیگران) و یال ها (رابطه همبازی بودن) هستن و در دو مرحله داده ها رو import میکنیم (مطابق راهنمای github نرم افزار).
ستون id: شناسه منحصر به فرد هر بازیگر
ستون actor: نام بازیگر
ستون weight: تعداد فیلم هایی که هر بازیگر بازی کرده
ستون source: مبدا یال
ستون target: مقصد یال
ستون title: نام فیلم
داده های ما در مجموع شامل اطلاعات 1014 بازیگر، 7730 رابطه همبازی بودن و 360 فیلم هست. میانگین تعداد همبازی برای هر بازیگر 15.2به دست امده یعنی هر بازیگر به طور متوسط با 15 نفر همبازی بوده.
بعد از ورود داده ها، موقعیت راس ها روی صفحه به صورت تصادفی انتخاب میشه که میتونیم از طریق پنجره layout اون رو تغییر بدیم. مثلا اگر مایل باشیم رئوسی که از نظر وزن ( weight) و تعداد روابط (degree) شبیه هم هستن نزدیک هم قرار بگیرن میتونیم از openord استفاده کنیم. به این ترتیب رئوسی که خصوصیاتی مشابه دارن در یک محدوده قرار میگیرن. یا خیلی ساده میتونیم با انتخاب circular layout رئوس رو به ترتیب یک خصوصیت مثلا تعداد فیلم های هر بازیگر (weight) روی محیط یک دایره قرار بدیم.
در ادامه انواع layout و موارد استفاده هر کدوم اشاره شده
بصری سازی داده ها امکانات جالبی رو فراهم میکنه مثلا میتونیم اندازه هر راس رو معادل تعداد فیلم های هر بازیگر (weight) و تعداد افرادی که با اونها همبازی بوده (درجه - degree) رو به صورت شدت رنگ در نظر بگیریم به این صورت که هر قدر اندازه راس بزرگتر، تعداد فیلم های بیشتر و هرچقدر پررنگ تر تعداد همبازی ها بیشتر. با کلیک روی هر راس، راس های مجاور نمایش داده میشن و به این ترتیب برای هر بازیگر همبازی ها قابل تشخیص میشن.
همون طور که در تصویر مشخصه سه بازیگری که بیشترین فیلم رو در مجموعه داده های ما داشتن به ترتیب سحر قریشی، مهران رجبی و بابک حمیدیان بودن. هرکدوم به ترتیب در بیست ویک، نوزده و هفده فیلم حضور داشتن.
در ادامه به مرور تعدادی از اصطلاحات و روابط در گراف داده ها میپردازیم.
قطر شبکه (network diameter) به معنی حداکثر فاصله موجود بین دو نقطه در شبکه هست. در مجموعه داده های ما بیشترین فاصله بین بازیگران 7 رابطه هست به این معنی که هر بازیگر حداکثر با 7 واسطه با هر بازیگر دیگری ارتباط داره. مثلا بین صدرالدین حجازی و یاسمن نصرتی این حداکثر فاصله 7 تایی وجود داره ( قطر شبکه 7 است) و کوتاه ترین زنجیره بین این دو بازیگر به این صورته :
'صدرالدین حجازی'>> 'آزاده ریاضی'>> 'زهره حمیدی'>> 'سحر قریشی'>> 'لیلا زارع'>> 'نسیم ادبی'>> 'عصمت رضاپور'>> 'یاسمن نصرتی'
میانگین فاصله (average path length) بین تمام بازیگران در شبکه حدود 3 هست یعنی به طور متوسط هر بازیگر با 3 واسطه با بازیگر دیگه در ارتباطه.
در هر گرافی امکان داره راس هایی وجود داشته باشن که جدا از سایر راس های مجموعه باشن. به این ترتیب که فقط بین چند راس رابطه وجود داره و خودشون به تنهایی زیرگراف (connected components) تشکیل میدن. در مجموعه داده های ما در مجموع 12 زیرگراف موجوده که در شکل زیر قابل مشاهده هست. حدود 95 درصد از راس ها گراف اصلی رو تشکیل میدن (گراف سبز رنگ) و سایر گراف ها مربوط به بازیگرانی هستن که فقط در یک فیلم حضور داشتن و با همون مجموعه بازیگران همبازی بودن که در ادامه به همین دلیل از نتایج تحلیل کنار گذاشته میشن.
برای شناسایی راس های مهم در شبکه معیارهای مختلفی وجود داره مثلا در مورد شبکه حمل و نقل فرودگاهی بین المللی، شهر تهران، راس مهمیه، چون عمده پروازهای بین المللی مبدا و مقصدشون شهر تهرانه و در شبکه به عنوان hub محسوب میشه.
معیار closeness centrality یکی دیگه از شاخص ها برای شناسایی راس های مهم در شبکه هست و هر راس از نظر میانگین فاصله با سایر راس ها ارزیابی میشه و طبق این فرض کار میکنه که راس مهم کمترین فاصله رو با سایر راسها در شبکه داره.
در ادامه نتیجه ارزیابی بر اساس این شاخص رو مشاهده میکنین:
معیار دیگه برای ارزیابی راس های مهم betweenness centrality هست و راس ها از نظر میزان تکرار در مسیر سایر راس ها ارزیابی میشن. به این ترتیب راسی مهم هست که به عنوان واسطه ارتباط بین سایر راسها قرار میگیره و طبق معادله زیر به دست میاد.
مثلا برای محاسبه betweenness centrality مربوط به راس 20 در شکل زیر به این صورت عمل میکنیم. برای نمونه دو راس 2و 34 رو انتخاب میکنیم. بین دو راس 34 و 2 سه مسیر (کوتاه ترین مسیر) وجود داره و یکی از این مسیرها از راس 20 میگذره. پس یکی از معادلات برای محاسبه 1/3 هست. حالا باید تمام مسیرهای موجود برای هر جفت راس و تعداد تکرار راس 20 در اونها در شبکه محاسبه بشن و با هم جمع بشن تا betweenness centrality برای راس 20 رو داشته باشیم.
نتیجه شاخص betweenness centrality روی داده های فیلیمو:
طبق خروجی های دو جدول بالا، نتایج با هم شباهت هایی دارن و بیشتر بازیگران بر اساس دو معیار مشترک هستن. روش های دیگه ای برای سنجش راس های مهم در شبکه (مثل eigenvector centrality) وجود داره که براساس شرایط مساله و رفتار شبکه میتونیم از اونها استفاده کنیم.
یکی دیگه از سولات مهمی که میشه در مورد رفتار شبکه پرسید اینه که در آینده بین کدوم راس ها احتمال بیشتری وجود داره که اتصال برقرار بشه (link prediction) یا کدوم ترکیب از بازیگران مناسبه و میتونه در فیلم های آینده استفاده بشه.
ساده ترین روش اینه که کدوم بازیگران همبازی های مشترکی دارن اما هنوز با هم همبازی نبودن (common neighbours).
برای پاسخ به این پرسش ماژولی در gephi وجود نداره. بنابراین از ماژول networkx در زبان پایتون استفاده شده.
common=[(e[0], e[1], len(list(nx.common_neighbors(G, e[0],e[1])))) for e in nx.non_edges(G)]
sorted_common = sorted(common, key=lambda x: x[2],reverse=True)
sorted_common[:10]
[('امین حیایی', 'بهنوش بختیاری', 19),
('امید روحانی', 'جواد عزتی', 18),
('بهنوش بختیاری', 'مهران احمدی', 18),
('مهران رجبی', 'علی صادقی', 17),
('امید روحانی', 'میلاد کی مرام', 17),
('بابک حمیدیان', 'میلاد کی مرام', 17),
('محمدرضا فروتن', 'میلاد کی مرام', 16),
('سحر قریشی', 'رضا رویگری', 16),
('امید روحانی', 'مهران احمدی', 16),
('شقایق فراهانی', 'باران کوثری', 15)]
به این ترتیب 10 تا از بازیگرانی که همچین شرایطی رو داشتن مشخص شدن. مثلا امین حیایی و بهنوش بختیاری 19 همبازی مشترک داشتن در صورتی که هنوز با هم همبازی نبودن.
معیار دیگه برای پیش بینی مسیرهای آینده resource allocation هست. این معیار بر اساس میزانی از منابع که از راسی به راس دیگه و از طریق همسایگان مشترک، انتقال پیدا میکنه، محاسبه میشه.
برای درک بهتر نحوه محاسبه این شاخص راسهای A,C شکل زیر رو بررسی میکنیم
مثلا برای محاسبه resource allocation دو راس A و C در شکل بالا به این صورت عمل میکنیم. از A تا C دو راس BوD وجود داره. برای راس B یک سوم از مسیرها به C ختم میشه (از مجموع سه مسیر برای B یک مسیر به C میرسه) و همین طور برای راس D یک سوم از مسیرها به C ختم میشه (از مجموع سه مسیر برای D یک مسیر به C میرسه).
خروجی محاسبه شده برای شاخص resource allocation :
L = list(nx.resource_allocation_index(G))
L.sort(key=operator.itemgetter(2), reverse = True)
L[:10]
[('مهران رجبی', 'علی صادقی', 0.5436580647280445),
('رضا رویگری', 'علی صادقی', 0.5341189130271286),
('سحر قریشی', 'کیمیا باباییان', 0.5334682225986573),
('سحر قریشی', 'یوسف صیادی', 0.49265883705242974),
('مهران رجبی', 'رضا عطاران', 0.488452442704746),
('امین حیایی', 'بهنوش بختیاری', 0.4703806775218503),
('سحر قریشی', 'رضا رویگری', 0.46925734604593355),
('علی صادقی', 'سیروس گرجستانی', 0.4602600480467179),
('ساعد سهیلی', 'بابک حمیدیان', 0.45217190509044225),
('بابک حمیدیان', 'میلاد کی مرام', 0.45055570910675874)]
در مورد link prediction هم روش های زیادی وجود داره مثل:
– Preferential Attachment Score
اگه تا این قسمت پست ادامه دادین از صبر و حوصلتون برای خوندن این پست نسبتا طولانی تشکر میکنم و امیدوارم براتون مفید باشه :). در بخش بعدی به دسته بندی بر اساس متن معرفی فیلم ها میپردازیم.
ایمیل: pooryaganji1368@gmail.com
لینکداین: https://www.linkedin.com/in/poorya-ganji-a361a310b/
مطلبی دیگر از این انتشارات
خدمات شهری هوشمند
مطلبی دیگر از این انتشارات
اینستاگرام و نگاه ِ داییجانناپلئونی به آن
مطلبی دیگر از این انتشارات
اتصال بین پایگاه داده اوراکل و R Language