حتما براتون پیش اومده تو سایتهای مختلف چیزی رو سرچ کنید ولی نتایج از زمین تا آسمون فرق داشته با اونی که تو ذهنتون بوده. واقعا چرا سرچ اکثر سایتها اینقدر بده؟
تو این رشتو نگاهی میکنیم به دیجیکالا و میبینیم چطور با یه کم جبرخطی میشه تجربه جستجوی محصولات رو کلا متحول کرد.
قضیه از اینجا شروع میشه که میخوای برای پارتنرت کادو بخری. دیجیکالا رو باز میکنی، تو نوار جستجو میزنی ماتیک (چون اون لحظه بجای کلمه رژ لب، ماتیک تو ذهنت بوده). اینتر میزنی و منتظری چند صفحه رژ لیست شه تا از بینشون انتخاب کنی؛ اما تنها چیزی که میاد بیلاخه.
بعد عصبانی میشی و شروع میکنی به عرق کردن. ای بابا دستمال کاغذی ندارین که تو خونه. سرچ میکنی کلینکس. جز یه دونه که اونم برندش تشابه اسمی داره هیچ نتیجهای نمیاد.
دیگه میگی آقا ولش کن خونسرد باش. یه ذره سر خودمو با فیلم و سریال گرم کنم بجای حرص خوردن. فیلم دیدن بدون چیزی خوردن مگه میشه؟ سرچ میکنی چس فیل. اما بازم جای دیگهای از فیل تو نتایج منتظرته. لیپتون؟ صفر کالای موجود از چای کیسهای.
این قضیه راجع به کلمات دیگه هم هست. میزنی سامسونت گوشی موبایل سامسونگ میاد، استند تلویزیون کلا دوتا میز تلویزیون موجود میاره، تلفن ثابت بجای رومیزی صفر نتیجه، چاپگر هم با اینکه خیلی کم تو روزمره بکار میره ولی بههرحال معادل فارسی رسمی پرینتره که اونم تو دیجیکالا صفر نتیجه داره.
شاید خود من هیچوقت ماتیک رو جای رژ و لیپتون رو جای چای کیسهای به کار نبرم ولی تا چه اندازه میشه مطمئن بود کل ایران با هر سن و سلیقه، یکسان سرچ میکنن؟ مطمئنا صدها محصول وجود داره که به چند اسم مختلف تو جوامع مختلف صدا میشه.
خیلی مثال دیگه علاوه بر اینها هست که نشون میده الگوریتم سرچ تو دستهبندی کلمات هممعنی و اجناس معادل، ضعف جدی داره.
چرا این اتفاق میوفته؟
راهکار کلیای که برای پیادهسازی سرچ تو اکثر شرکتها وجود داره استفاده از Elasticsearch هست.
الستیک یه موتور جستجوی اوپنسورس و خیل خفنه که برای نگهداری و تحلیل دیتا ازش استفاده میشه. وارد جزییات نمیشم اما اینو بدونین که از یه ساختار به اسم Inverted Index استفاده میکنه که داکیومنتهارو بر اساس «کلیدواژه» و فراوانی وزنی TF-IDF ذخیره و پردازش میکنه.
مشکل همینجاست که داریم از کلیدواژهها استفاده میکنیم و موتور جستجوی ما هیچ درکی از اینکه چاپگر و پرینتر در واقع یک چیزن نداره.
حالا راه حل چیه؟ اولین چیزی که به ذهن میرسه داشتن یه دیتابیس از کلمات هممعنیه. اما کار تمیزی نیست چون تعداد کالاها زیاده و دیتابیس باید آپدیت بمونه.
ما باید راهی پیدا کنیم که متوجه منظور و مفهوم اون کلمه یا عبارت بشیم تا بفهمیم واقعا کاربر دنبال چی داره میگرده. بریم سراغ ریاضی 😁
از زمان مدرسه یادمونه که جای یه نقطه در صفحه رو با مختصات [x,y] نشون میدادیم. به همین ترتیب یه نقطه در فضا [x,y,z]. حالا جای چند نقطه در صفحه چی؟
برای نمایش n نقطه در فضای ۲ بعدی به ماتریسی احتیاج داریم که هر ستون، نشانگر هر کدوم از نقاطمون باشن و سطر اول مقدار طول (x) و دوم عرض (y) اون نقاط. بعنوان قرارداد، هر نقطه رو هم به شکل فلش (بردار یا vector) ای که از مبدا میره اونجا در نظر بگیرید. به این شکل:
حالا فرض کنید از ما میپرسن فاصله نقطه p از q چقدره. خیلی ساده جوابش میشه اندازه برداری که از p میره به q. قضیه فیثاغورث یادتونه که تو یه مثلت قائم الزاویه وتر به توان ۲ میشد جمع توان دوی اضلاع؟ دقیقا به همون شکل اندازه این بردار که الان وتر مثلثه در میاد.
الان توانایی سنجش فاصله بین هر دو نقطه تو فضا رو داریم. یه نقطه جدید میاد وسط. از ما میپرسن نزدیکترین نقطهها به این چیه؟ فاصله همه نقاط از این نقطه جدید رو درمیاریم و اونایی که کمترین فاصله رو دارن معرفی میکنیم. در واقع میشه همسایههای اون نقطه تو یه دایره (بهش میگن KNN).
حالا به یه بعد بالاتر فکر کنید. توی یه فضای ۳ بعدی هم تمام این محاسبات برقراره با یه کم جزییات بیشتر. مثلا همسایههای یک نقطه جدید، بجای دایره میوفته توی یه کره به مرکز اون نقطه. تو ابعاد بالاترش هم همینطور.
حالا بریم سراغ کار خودمون؛ فهمیدن مفهوم از متن.
تمام کلمات موجود تو یه زبان رو برمیداریم. مثلا ۵۰ هزارتا. همه رو پرت میکنیم تو یه فضای خیلی زیاد بُعدی مثلا n. هرکدوم تبدیل میشن به یه بردار n بعدی. همه رو کنار هم میچنیم بشکل ماتریس. هر ستون یک کلمه. بهش میگیم Embedding matrix.
عددی که تو هر سطر و ستون این ماتریس وجود داره اول رندومه اما مدل ما هرچقدر بیشتر که دیتا (مثل مقاله، داستان، کتاب،...) میبینه با یه سری فرمول ریاضی کم کم شروع میکنه به عوض کردن این اعداد (=یاد گرفتن). هر ورودی متنی مثل «بابا باد داد» وزنهای کلمات بابا، باد و داد رو عوض میکنه.
هرچقدر مدل ما بیشتر یاد میگیره، یواش یواش کلمات چاپگر و پرینتر رو نزدیک به هم قراره میده چون مقالاتی که راجع به هرکدوم خونده خیلی شبیه بهم بوده؛ و کم کم به سمتی میریم که هر «جهتی» از این فضای خیلی زیاد بعدی، انگار یک مفهوم رو داخل خودش داره.
بعنوان یه مثال دیگه، مدل GloVe که روی مقالات ویکیپدیا آموزش دیده رو اگر در نظر بگیریم، توش کلمات «ساختمون»، «آسمانخراش»، «سقف» و «ساخت» نزدیک به هم قرار میگیرن.
اما نکته جالب اینه که ما میتونیم اعمال ریاضی روی این کلمات انجام بدیم. تفریق برداری «مرد» از «زن» یه بردار جدید توی فضاست (از انتهای کلمه مرد به کلمه زن وصل کنین). این بردار خیلی شبیههه به برداری که از تفریق «شاه» از «ملکه» بدست میاد.
انگار اون جهت برداری (زرد)، مفهوم جنسیته.
توی این معادله اگر کلمه شاه رو ببریم سمت راست، میتونیم خود کلمه ملکه رو بدست بیاریم: جمع شاه با زن منهای مرد. پس الان یه مدلی داریم که میتونیم ازش بپرسیم پادشاه مونثی که مرد نیست چیه و جواب بگیریم ملکه. میبینید چقدر قشنگ مفهوم و معنی کلمات به ریاضی مدل شدن؟
این کار رو بهش میگن word embedding. حالا فرض کنید توی این فضای چندبعدی، بهجای کلمه، محصولات مختلف دیجیکالا باشن. product embedding.
به ازای هر کالا، عنوان محصول + توضیحاتش رو با استفاده از یه مدل زبانی بزرگ (که مثلا کل ویکیپدیای فارسی رو قبلا خونده) ببریم تو این فضا.
با اینکار، موفق میشیم محصولات شبیه به هم رو نزدیک به هم داشته باشیم. «لپتاپ ۱۵.۶ اینچی MSI» کنار «کامپیوتر همهکاره ASUS» قرار میگیره بدون اینکه تو عنوان کالا اشتراکی داشته باشن. با اختلافی کم، احتمالا کالاهای دیجیتال و با یه فاصله زیاد لباس زنانه که شباهتی با اینا نداره هست.
در نهایت، وقتی کاربر برای چیزی سرچ میکنه، ما اونو برمیداریم و مثل یه نقطه میندازیم توی این فضا، با استفاده از KNN میبینیم چه محصولاتی تو نزدیکترین همسایگی این نقطه هستن و همونا رو نشون میدیم.
اینطوری با سرچ چاپگر میشه تو نتایج پرینترها رو دید. به همین راحتی به همین خوشمزگی 😁
من با استفاده از دیتاست دیجیکالا () یه دمو از کل این فرایند ساختم و خیلی چیز جالبی شد. کدش رو گیتهابم هست. دوست داشتید امتحان کنید: البته هنوز خیلی جای بهتر شدن داره.kaggle.com/datasets/radea… github.com/ArmanJR/Digika…
در آخر، رفرنس و نکته:
- ویدیو
- من سعی کردم به سادهترین شکل ریاضیش رو بگم و شاید نادقیق حرف زده باشم. با پوزش از اساتید لطفا ایده کلی رو بچسبید :))
- پیادهسازی این تو مقیاس دیجیکالا منابع زیادی میخواد اگر پیاده نمیشه شاید فعلا نمیصرفه لابد ¯\_(ツ)_/¯
• • •
Missing some Tweet in this thread? You can try to
force a refresh
داستان از جایی شروع شد که دیدم عکسالعمل من به عکسهایی که پارتنرم از مو و لباس و ناخونش میفرسته تکراری شده و ذوقم رو درست منتقل نمیکنه. تا کی بگم پشمااام/💋💋/خوشگل😍؟ اصلا زشته در جواب اون زیبایی مطلق که با ذوق برام عکس گرفته شده بخوام پشمامو با چارتا ایموجی بفرستم :))) #رشتو
کلا وقتی یه دختر خوشگل از خودش برای شما عکس میفرسته، شما یکی از این دوتا پسری:
- یا با دهها سال تجربه در امور لاس، بلدی جواب بدی جوری که قند تو دلش آب شه
- یا تجربهت کمه و چارتا پشمام و برگام و ایموجی چشم قلبی اینا میفرستی
ولی یه حالت مخفی سوم هم هست که... خب ریاضی بلدی 🤓
من تو لاس زدن اصلا خوب نیستم. کتاب و دوره آموزشی لاسزنی هم که نداریم. نمیتونم با صد نفر هم دیت کنم که با آزمون و خطا یاد بگیرم. فکر کردم چیکار کنم، و قویترین چیزی که پیدا کردم این بود: شعر فارسی.
تا حالا فکر کردید اگر ته هرچیزی تو دنیا رو بگیریم بریم آخرش به کجا میرسیم؟
برای جواب این سوال بریم سراغ ویکیپدیا جایی که برای هرچی از زیردریایی U516 ارتش هیتلر بگیر تا نصفالنهار ۱۴ درجه، صفحه توش وجود داره.
معمولا توضیحات ویکیپدیا با معرفی دستهبندی یا منشأ اون چیز شروع میشه/
تو یه صفحه تصادفی مثل توییت قبل، فوتبال آمریکایی در اصل یه ورزش تیمیه. اگر صفحه ورزش تیمی رو باز کنیم به فعالیت ورزشی میرسیم. بعد به ورزش => فعالیت بدنی => بدن => انسان و... همینطور تا بالاتر.
اگر همین روند رو طی کنیم و هربار وارد اولین لینکی که توی اولین پاراگراف وجود داره/
بشیم، انگار همه چیز میرسن به یکی: فلسفه!
واسه اینکه ببینیم این حرف چقدر درسته و هرچیز رندومی تو دنیا چقدر فاصله داره از فلسفه، یه اسکریپت نوشتم که بیاد هربار این روند رو طی کنه و بشماره. ۱۰۰۰ صفحه رو بصورت رندوم از ۶.۷ میلیون صفحهی ویکیپدیای انگلیسی/
موقع مقایسه محصولات تو دیجی کالا جنسی که امتیاز پایینتر اما رأیهای بیشتر داره رو انتخاب میکنید یا اونی که امتیاز بالاتر اما رأیهای کمتر داره؟ این مشکلیه که حتما بهش برخوردید و نتونستید تصمیم بگیرید ولی لاپلاس تو قرن ۱۸ این مسئله رو حل کرده و نتیجهش شده قانون توالی لاپلاس 👇
تو نظریه احتمال، قاعده توالی (Rule of succession) فرمولیه که توسط لاپلاس معرفی شد. این فرمول هنوز مورد استفاده قرار میگیره، مخصوصا برای تخمین احتمالات وقتی که مشاهدات کمی داریم یا برای حل مشکل رویدادهای اصلاً مشاهده نشده در داده های نمونه (مثل نظرات منفی در امتیازات یک محصول) /
اینجا نمیخوام تئوری لاپلاس رو براتون باز کنم اما نتیجهای که مطالعات لاپلاس برای مسئله ما داره اینه که، اگر برای محصولی نظرات کمی وجود داره و بین اونها هم نظرات منفی کمه یا اصلا نیست، برای اینکه به عدد قابل مقایسه برسیم، میایم ۱ نظر کاملا مثبت و ۱ نظر کاملا منفی اضافه میکنیم /