پیشنهاد‌های جذاب و شخصی برای کاربر سایت‌شما

آیا سایت شما بین کاربران استقلالی و پرسپولیسی تفاوت قائل می‌شود؟ طرفداران ملوان انزلی را می‌شناسد؟ در اغلب موارد شاهد‌ هستیم سایت با همه مراجعین به یک شکل رفتار می‌کند. آتیم‌هایی که سایت به کاربران/مشتریان نمایش می‌دهیم، بدون هوشمندی، و تنها بر اساس مکانیزم‌های اتفاقی(Randomized)، یا انطباق تگ‌هاست. سایت به سلیقه مراجعین توجه نمی‌کند. در نهایت کاربر/مشتری، به محض کسب تجربه‌ای بهتر از سایت ما مهاجرت خواهد کرد. در بسیاری موارد کاربران از عدم وجود هوش کافی در مقایسه با سایت‌های بین‌المللی تعجب می‌کنند. چه باید کرد؟ چه کنیم تا سایت‌های ما رفتاری شایسته تر از خود نشان دهند؟ چه کنیم‌ تا سایت ما بین کاربران خود تفاوت قائل شده، و برای هر یک متناسب با سلیقه وی، به ارائه آیتم‌ها بپردازد؟

راه‌حل

متد پیشنهاد (recommend) دقیقا برای حل این مسئله طراحی و پیاده سازی شده است. برای پیشنهاد به کاربری که قبلا رد‌پایی از او در تعامل با آيتم‌های سایت بدست آورده‌ایم، این متد گزینه‌ای بسیار توانمند است. متد پیشنهاد هر آنچه کاربر قبلا دیده است، به یاد دارد. همچنین با استفاده از مکانیزم‌های پیش‌بینی(Prediction)، تعامل‌های بعدی کاربر را محاسبه نموده، و آیتم‌هایی که وی دوست دارد مشاهده کند، در اختیارش قرار می‌دهد. این متد به کاربری که لاگین نکرده است نیز خدمت می‌کند.
آگاهی از سلیقه کاربر، بدون پرسیدن حتی یک سوال، مزیتی ارزشمند محسوب می‌گردد. سایت‌های مجهز به recommender.ir قادر به تحلیل و شناسایی بلادرنگ سلیقه کاربر هستند. آنها این عمل را بدون پرسیدن هیچ سوالی از کاربر و تنها بر اساس رفتار کاربر انجام می‌دهند. تصاویر زیر نمونه‌هایی از کاربرد‌های متد پیشنهاد را نمایش می‌دهند.

تصویر زیر نمونه‌ای از کاربرد متد پیشنهاد در یک سایت ارائه فیلم و سریال را مشاهده می‌کنید‌(روی تصویر کلیک کنید):

recommend_sample_filimo

در اینجا نیز وبلاگی از متد‌پیشنهاد برای ارائه محتواها‌یی که کاربر به آنها علاقمند است، استفاده می‌کند(روی تصویر کلیک کنید):

 

recommend_hexican

توضیحات فنی

برای ارائه پیشنهاد به کاربر، از متد recommend استفاده کنید. این متد به کاربری که رفتار وی قبلاً مورد شناسایی قرار گرفته است، به تعداد n آیتم، پیشنهاد می‌دهد. محاسبه این مقادیر بر اساس آیتم‌هایی است که کاربر قبلاً مشاهده ننموده و با بیشترین احتمال، علاقمند به مشاهده آنهاست. این محاسبات بر اساس آخرین انتخاب‌های کاربر به روز شده و بلادرنگ از تغییرات داده‌ها اثر می‌گیرند. نتیجه بر اساس میزان علاقه مرتب شده است. این متد برای پیشنهاد به کاربرانی که قبلاً رفتارهای آن‌ها را جمع آوری نموده ایم مناسب است. مشتریان recommender.ir، از این متد استفاده فراوان می‌برند.
این متد قادر به تولید نتایج لرزان(Dither) نیز می‌باشد. هدف از تولید نتایج لزران، حفظ جذابیت نتایج برای کاربر است. برای تولید محاسبات به صورت لرزان از پارامتر dither استفاده کنید.
این متد را با درخواست GET فراخوانی کنید.

http://IP:Port/recommend[userID](?howMany=n)(?dither)

مثال:
دستور زیر برای کاربری با شناسه79047 ، ده پیشنهاد که بر اساس میزان علاقه وی مرتب شده است، باز‌می‌گرداند:

Request:
/recommend/79047

Response:
[[“YDI1N”,1.103431],[“VB4x3”,1.1000912],[“MEB83”,1.0796349],[“FC4iO”,1.0775955],[“kt0x1”,1.075396],[“UvHxQ”,1.0632982],[“yXpDA”,1.0557796],[“xuL1s”,1.0472054],[“tQ8c1”,1.0308288],[“53k6R”,1.026107]]

مثال:
مثال زیر برای کاربری با شناسه 3294 ، سه پیشنهاد لرزان محاسبه می‌کند. این متد عیناً چهار بار فراخوانی شده است. نتایج در شعاع معینی به صورتی انتخاب شده‌اند که ضمن نزدیکی با سلیقه کاربر 3294 برای وی جذاب بوده و تکراری نشوند:

Request
/recommend/3294?dither&howMany=3

Response
[[“BMW-820i”,0.08361415],[“RapidMiner”,0.099954925],[“Membase”,0.0659595]]

Request
/recommend/3294?dither&howMany=3

Response
[[“Magnet”,0.04127011],[“RapidMiner”,0.099954925],[“Membase”,0.0659595]]

Request
/recommend/3294?dither&howMany=3
Response
[[“BMW-820i”,0.08361415],[“Yamaha”,0.057780065],[“Magnet”,0.04127011]]

Request
/recommend/3294?dither&howMany=3
Response
[[“BMW-820i”,0.08361415],[“Ferrari”,0.104123645],[“Yamaha”,0.057780065]]

اجزای اصلی یک پیشنهاد‌دهنده بلادرنگ

در اینجا قطعات اصلی یک سامانه‌پیشنهاد‌دهنده(Recommender System) بلادرنگ را به زبان ساده معرفی کنیم. بدیهیست که در یک نمونه صنعتی، همچون ‌recommender.ir،  قطعات دیگری نیز برای افزایش کارایی، پایداری و پردازش محتوا به کار ‌می‌آیند که در اینجا از معرفی آنها صرف نظر نموده و تنها به مهمترین اجزای یک ساختار مبتنی بر فعالیتهای کاربر می‌پردازیم.

یک سامانه پیشنهاددهنده پیشرفته از پنج قطعه‌(Component)  تشکیل می‌شود. این قطعات از سمت واسط فراخوانی و ارسال داده(API) تا لایه‌های زیرین به ترتیب عبارتند از:

  • واسط فراخوانی و ارسال جریان داده (API)
  • پردازش ثانویه بلادرنگ
  • مدل
  • پردازش دسته‌ای
  • کتابخانه الگوریتم‌ها

حال به مرور مختصر هر قطعه می‌‌پردازیم:

قطعه ۱ – واسط فراخوانی و ارسال جریان داده (API)

متدهای یک سامانه‌ پیشنهاددهنده به طور مکرر فراخوانی می‌شوند. ابعاد فراخوانی ممکن است به چند هزار بار در ثانیه بیا‌نجامد. لذا طراحی و پیاده سازی ‌API باید با توجه به ملزومات فراخوانی‌های بسیار زیاد باشد. لایه‌های زیرین ‌API باید چندرشته‌ای(Multi-Threaded) توسعه یابند. این ماژولها باید به پاکسازی داده‌های دریافتی نیز بپردازند. چرا که ممکن است داده‌های غلط به سامانه ارسال شود. همچنین کنترل اثرات ناشی از حملات خود داری از خدمات((DoS Attack)) بر روی صفحات سایت اصلی، در این لایه باید انجام پذیرد. پس از آماده سازی نتایج، زیباسازی نتایج (Decoration) در این لایه انجام می‌گیرد.

قطعه ۲- پردازش ثانویه بلادرنگ

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

این قطعه همچنین در تولید پیشنهاد برای کاربر تازه وارد، که هیچ ردپایی از وی نداریم یا برای تولید پیشنهادهای گروهی، داده‌های مدل را به صورت بلادرنگ و موضعی پردازش می‌کند. کنترل میزان پراکندگی و چگالی نتایج محاسبات نیز در این قطعه لحاظ می‌شود. از جمله محاسبات بلادرنگ می‌توان به کنترل ابعاد مدل و نظارت بر کیفیت تولید ‌نسل‌های داده اشاره کرد. همچنین آخرین فعالیت‌های کاربر حتی قبل از اعمال در مدل، در این قطعه به صورت موقت نگهداری می‌شود تا در صورت آماده نبودن داده‌های مدل در مورد آخرین فعالیتهای کاربر، قادر به تولید پیشنهاد‌های بلادرنگ و دقیق باشد. اغلب محاسبات هنگام دریافت داده‌ انجام می‌شود. یکی دیگر از وظایف قطعه پردازش ثانویه، لرزاندن(Dithering) جزئی نتایج محاسباتی است که از مدل حاصل آمده است. لرزاندن محاسبات راهکاری برای باز‌سازی مجدد نتایج با هدف حفظ جذابیت برای کاربر است. پس نتایج مدل را با افزودن کمی انحراف در محاسبات، به نتایجی جذاب بدل می‌کند. برای محاسبه میزان لرزش نتایج نیز، تکنیک‌های متنوعی وجود دارد.

سامانه‌های غیرصنعتی فاقد قطعه پردازش ثانویه بلادرنگ هستند.

قطعه۳ – مدل

مدل مهمترین قطعه است. این قطعه تمامی ماحصل پردازش داده‌ها، علایق کاربران و ویژگی‌های آیتم‌ها را نگهداری می‌کند. هر آنچه در نتیجه فراخوانی متدهای API مشاهده می‌شود در مدل محاسبه شده است. یک سامانه غیر صنعتی (تحقیقاتی یا دانشگاهی) ممکن است فاقد قطعه مدل باشد. داده‌های مدل به صورت‌پیوسته مورد ویرایش لایه‌های پردازشی ۲ و ۴ قرار دارند. با توجه به تنک بودن داده‌ها، در نگهداری داده‌ها بهتر است از گراف یا تکنیک‌های ‌فاکتور‌گیری ماتریس(Matrix Factorization)، یا تواما بهره جست.

قطعه ۴ – پردازش دسته‌ای

توابعی از قطعه ۵ را بر روی مدل اجرا می‌کند. داده‌های مدل به منظور تولید‌نسلهای داده و اعمال نمودن جزئیات تغییرات، در مقاطع معین زمانی به طور کلی پردازش‌ می‌شوند. در پایان پردازش‌دسته‌ای، مجموعه‌هایی مرتب شده و اندیس‌گذاری شده از داده‌ها مهیا می‌گردد. اعمال فاکتور مهم فراموشی (Forgetfulness) نیز توسط این قطعه انجام می‌شود. این قطعه باید میزان مصرف توان پردازشی را با بار فعلی ماشین، تنظیم کند. اولیویت پردازشی با فعالیت‌هایی است که در قطعه بلادرنگ، در حال انجام است. پس ساختن رشته‌های (Threads) جدید یا به کارگیری رشته‌های موجود در مخزن رشته‌ها(Thread Pool) در این لایه، متناسب با ظرفیتهای آزاد ماشین، رخ می‌دهد. در صورتی که این لایه قادر به اجرای کاهش-‌نگاشت(Map-Reduce) باشد، سامانه‌ قادر خواهد بود از زیست‌بوم هدوپ(Hadoop Ecosystem) به عنوان بستر محاسباتی و قیاس پذیری پردازش های دسته‌ای خود، بهره‌جوید.

قطعه ۵ – کتابخانه الگوریتم‌ها

الگوریتم‌هایی که در قطعات پردازشی بلادرنگ و دسته‌ای مورد استفاده ‌قرار‌ می‌گیرند در این قطعه گردآوری شده‌اند. پیاده‌سازی این قطعه باید به گونه‌ای انجام پذیرد، که افزودن و بکارگیری الگوریتمهای متاخر و جدید به سادگی انجام‌ پذیرد. در صورتی که فراخوانی الگوریتم‌ها و اجرای محاسبات به صورت تابعی‌(Functional) و بدون وضعیت(Stateless) انجام پذیرد، سامانه قادر به بهره‌گیری از تمام توان پردازشی ماشین خواهد بود. درواقع با بدون‌وضعیت ساختن متدها، قادر به تضمین کشسانی(Elasticity) راه‌حل خواهیم بود.