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

فیلم گردی با فیلیمو- بخش دوم: متن کاوی و دسته بندی فیلم ها

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

مقاله میهمان

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

قسمت اول

برای دسترسی به داشبورد کلیک کنید

داشبوردی که برای جستجو در داده ها استفاده میکنیم با کمک ابزار محبوب من 🙂 یعنی Power BI تهیه شده. جدول پایین داشبورد اطلاعات جامعی از فیلم ها از قبیل کارگردان، لینک دسترسی به فیلم روی سایت فیلیمو ،بازیگران، سال ساخت، معرفی فیلم در اختیارتون قرار میده و دو تا شکل بالای داشبورد به عنوان فیلتر عمل میکنن. نمودار میله ای سمت چپ به کارگردان های مختلف روی محور افقی و تعداد کارهای اونها اشاره داره. به عنوان نمونه منوچهر هادی و هاتف علیمردانی که پرکارترین کارگردان ها هم هستن، هر کدوم ۶ فیلم در مجموعه داده ها دارن. با کلیک روی هر کدوم از اونها میتونیم اطلاعات رو بر اساس همون کارگردان فیلتر کنیم.

شکل زیر نشون میده چطور با کلیک روی لینک فیلم به صفحه فیلم روی سایت فیلیمو هدایت میشین

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

جستجو بر اساس فیلم های شهاب حسینی

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

قسمت دوم

این بخش به مراحل مختلف اجرای یک مدل دسته بندی برای پیش بینی ژانر فیلم ها بر اساس متن معرفی فیلم اختصاص داره. هرچند توضیحات قسمت معرفی فیلم، خیلی مختصر نوشته شدن و تنوع فیلم در بیشتر ژانرها برای آموزش مدل کافی نیست. ولی همین مراحل در سایر مسائل قابل پیاده سازی هست. به همین دلیل برای ارزیابی فرایند، تمام مراحل رو بر روی مورد مشابهی از سایت دیوار تکرار میکنیم.

دسته بندی (classification) نوعی روش یادگیری ماشین هست که جزیی از روش های با نظارت (supervised learning) محسوب میشه.در روش های با نظارت داده ها دارای برچسب (label) هستن و هدف، رسیدن به الگوی مناسب (توسط داده های پیشین و برچسب هر کدام) برای پیش یبنی برچسب داده های جدید هست.

مساله مورد نظر رو به این صورت طرح میکینم: قصد داریم با در نظر گرفتن متن معرفی فیلم ها به عنوان متغیر ورودی (feature)، ژانر فیلم رو به عنوان متغیر خروجی (target) تشخیص بدیم.

Python

ابتدا پراکندگی ژانرها رو برررسی میکنیم

Python

بیشترین فروانی مربوط به ژانر خانوادگی اجتماعی هست که به تنهایی تقریبا نیمی از داده ها رو شامل میشه (تعداد فیلم ها= ۳۶۰).

برای اینکه بتونیم از داده های متنی به صورت متغیرهای ورودی ( feature ) استفاده کنیم باید به طریقی از فرمت متنی به فرمت عددی تبدیل کنیم. برای این کار تکنیک های زیادی وجود داره مثل:

bag of words

word vectors

tfidf

صندوقچه کلمات (bag of words) تکنینکی هست که در این پست استفاده میکنیم. در این روش هر کلمه ای که در مجموعه داده ها قرار داره به عنوان متغیر ورودی ( feature ) در نظر گرفته میشه. مفهوم صندوقچه کلمات به مجموعه متغیرهای ورودی اشاره داره. به این صورت که هر نمونه ( sample ) در مجموعه که در اینجا متن معرفی فیلم هست، به کلمات سازنده تجزیه میشه و کلماتی که قبلا در صندوقچه کلمات وجود نداشتن (غیر تکراری) به مجموعه اضافه میشن. در نهایت مجوعه ای از تمام کلمات موجود در داده ها به عنوان متغیرهای ورودی خواهیم داشت.

با توجه به شرایط مساله ما، حضور و یا عدم حضور کلمه در هر نمونه اهمیت داره اما تعداد تکرار کلمات اهمیت چندانی نداره. مثلا وجود یا عدم وجود کلمه پلیس، کافیه تا مشخص بشه ژانر فیلم پلیسیه و تعداد تکرار ملاک نیست. در این مواقع ساده ترین روش مشابه شکل بالا انتخاب حالت باینری برای متغیرهاست. حضور یا عدم حضور کلمه ( term ) در نمونه ( document ) مشخص کننده مقدار ۰ و۱ برای متغیرهاست.
نکته دیگه در مورد داده های متنی نرمال سازی ( normalization ) و لماتایز ( lemmatization ) کلمه هاست. نرمال سازی یعنی یکسان سازی کلمات از نظر نگارشهای مختلف. مثلا نگارش کلمه کتابها و کتاب ها نباید باعث بشه پردازش متفاوتی روی کلمات صورت بگیره و نباید این دو نوع نگارش باعث ایجاد دو متغیر در صندوقچه کلمات بشه. یکی از این دو نوع نگارش مبنا قرار میگیره و سایر نگارش ها یکسان سازی میشه. لماتایز مشابه نرمالسازی باعث یکسان سازی کلمات میشه با این تفاوت که کلمات هم ریشه یکسان سازی میشن. مثلا دو کلمه دستم و دستش، تنها در ضمیر متصل تفاوت دارن و معناهای متفاوتی ندارن و باید اونها رو یکسان سازی کنیم.

توضیح اضافه: اگه قبلا با مفهوم مشابهی به نام stemming (یکی دیگه از روش های ریشه یابی) آشنا باشید، میدونید که عبارت حاصل از عمل lemmatization معنی‌دار هست در صورتی که در مورد stemming الزما ابن طور نیست.

پردازش هایی که در مورد داده های متنی اشاره کردیم، برای زبان انگلیسی ابزارهای متنوعی دارن. معروف ترین اونها spacy و NLTKهستن. برای زبان فارسی در پایتون، هضم تنها ابزار موجوده که به صورت عمومی عرضه شده. هر چند ابزارهایی به صورت وب سرویس وجود دارن و در حال توسعه هستن (مثل واکاویک و text-mining).

به کمک هضم پردازشهای مورد نیاز رو انجام میدیم و ستون جدیدی ( processed ) برای داده های پردازش شده ایجاد میکنیم.

Python

مقایسه سطر اول داده ها، قبل از پردازش( desc ) و بعد از پردازش ( processed ):

Python
Plain Text

متغیرهای ورودی (X) و خروجی (y) رو انتخاب میکنیم و داده های آموزش و تست رو جدا میکنیم:

Python

داده های متنی رو به کمک تکنیک صندوقچه کلمات به فرمت عددی تبدیل میکنیم.

Python

نکته قابل اشاره در تکه کد بالا کلمات ایست (stop words) هستن. کلمات ایست، به کلماتی گفته میشه که بار معنایی خاصی در متن ندارن. کلماتی مثل(از ، در، با، برای و…). در مدلسازی این کلمات معمولا به عنوان متغیرهای زاید حذف میشن. این کلمات بسته به زمینه مطالعه و کاربرد ممکنه متفاوت باشن. اگه به دسته بندی فیلمها برگردیم، در متن معرفی فیلم ها کلماتی مثل بازیگر،فیلم و… وجود دارن که کمکی به تشخیص ژانر فیلم نمیکنن یا به عبارت دیگه نمیتونیم از روی این کلمات ژانر فیلم رو حدس بزنیم(کاری که مدل ما قراره انجام بده، دقیقا مشابه همینه). حذف این کلمات معمولا کارایی مدل رو افزایش میده.

بعد از پیش پردازش داده ها نوبت به آموزش و اجرای مدل میرسه. یکی از الگوریتم هایی که برای دسته بندی متن مناسبه Naive Bayes هست. این مدل بر اساس احتمالات شرطی ( conditional probability ) کار میکنه و بر اساس کلمات هر نمونه و دسته های مختلف (ژانرهای مختلف) دسته با بیشترین احتمال رو پیش بینی میکنه. بعد از انجام تمام مراحل پیش پردازش در نهایت مدلسازی رو انجام میدیم.

Python

داده های تست (X_test_tf) رو باتوجه به صندوقچه کلمات آماده میکنیم. دقت مدل (نسبت پیش بینی های درست به کل پیش بینی ها) به این صورت به دست میاد.

Python

برای سنجش مدل نیاز به شاخص هایی داریم. یکی از شاخص ها برای این کار، مقایسه با dummy classifier هست. در این روش مدلی بر اساس ویژگی های داده ها به دست میاد که بر اساس فرض های ساده به وجود اومده. با استفاده از تکه کد زیر مدلی میسازیم که بر اساس پرتکرارترین ژانر کار میکنه (به پارامتر strategy=”most_frequent” دقت کنید). قبلا دیدیم که ژانر خانوادگی، اجتماعی بیشترین فراوانی رو در بین سایر ژانرها داره. مدل زیر بر مبنای همین فرض کار میکنه و برچسب تمام داده های تست رو (خانوادگی، اجتماعی) در نظر میگیره (بدون اینکه طبق متغیرهای ورودی آموزش ببینه). اما نکته جالب اینجاست که دقیقا همون دقت مدل naive bayes رو به دست میاره.

Python
Python

پس مدل ما (naive bayes) از نظر فنی فاقد ارزشه. راه حلهای مختلفی برای بهبود مدل وجود داره. مثل انتخاب سایر الگوریتم های دسته بندی (که در این مورد خاص بهبود خاصی ایجاد نشد)، جمع آوری داده های بیشتر(در صورت امکان) و…

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

بد نیست همین مدل و فرایند رو در مورد مجموعه داده های بزرگتر (حدود یک میلیون آگهی) و احتمالا دقیق تر سایت دیوار بررسی کنیم.

داده های سایت دیوار شامل اطلاعات متنوعی هستن. ستون های مورد نظر ما، متن آگهی و دسته مورد نظر آگهی هاست.

Python
متن آگهی (desc) و دسته آگهی(cat1)
متن آگهی (desc) و دسته آگهی(cat1)

فراوانی دسته های مختلف:

Python

تمام مراحل پیش پردازش شامل حذف کلمات ایست، normalization ، lemmatization و صندوقچه کلمات دقیقا مشابه قبل انجام میشه. در نهایت مدلسازی با الگوریتم naive bayes انجام میشه و دقت مدل با dummy classifier مقایسه میشه.

Python

مقایسه با dummy classifier (مدلی که برای تمام نمونه ها پرتکرار ترین دسته ( for-the-home ) رو در نظر میگیره)

Python

همون طور که خروجی های بالا نشون میده مدلی که روی داده های سایت دیوار آموزش دیده دقت خوبی داره (دقت حدود ۸۵ درصد) و نسبت به dummy classisfier برتری داره (دقت حدود ۳۵ درصد). بررسی دو نمونه مختلف به خوبی نشون داد محدودیت های استفاده از مدل ها چطور نمود پیدا میکنن و در صورت عدم وجود داده های مناسب و به تعداد کافی نمیشه انتظار معجزه داشت.

دسته بندی متن یکی از حوزه های پرکاربرد تحلیل داده محسوب میشه. مسائلی مثل شناسایی اسپم ( spam detection )، تحلیل احساسات، اتوماسیون کارها و… میتونه بخشی از کابردهای این حوزه باشه. سپاس از وقتی که برای حوندن این پست صرف کردین. امیدوارم براتون مفید باشه.

ایمیل: pooryaganji1368@gmail.com

توییتر

لینکدین

اینستاگرام

مجتبی بنائی

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

۷ دیدگاه

  1. بسیار عالی است. امیدوارم ادامه دهید. موفق و موید باشید.

     

  2. سلام. ممنون بابت توضیحات خوبتون
    لینک سورس کد رو هم بزارید

  3. سلام بسیار عالی بود. میشه لینک دیتاست مربوطه رو درج کنید ؟

    1. لینک دیتاست توی مقاله اصلی که در سامانه ویرگول منتشر شده موجوده و می تونید از اون استفاده کنید. البته بخش اول مقاله را برای اینکار بررسی کنید .

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

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

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

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