الگوریتم یافتن مشابهت اسناد – راهنمای مقدماتی


در این مقاله با روش کدنویسی و همچنین مبانی ریاضیاتی فاصله اقلیدسی، مشابهت کسینوسی و همبستگی پیرسون به عنوان سه الگوریتم یافتن مشابهت اسناد برای طراحی موتورهای «پیشنهاد موارد مشابه» آشنا خواهیم شد. امروزه سیستمهای پیشنهاد محتوا اهمیت زیادی در حوزههای گوناگون دارند. هسته اصلی سیستمهای پیشنهادی مفهوم «پالایش گروهی» (Collaborative Filtering) است و در هسته اصلی پالایش گروهی نیز بحث «مشابهت سند» (Document Similarity) قرار دارد.
در ادامه 3 الگوریتم برای محاسبه مشابهت اسناد معرفی میکنیم:
- فاصله اقلیدسی
- مشابهت کسینوسی
- ضریب همبستگی پیرسون
حتی یک شهود کلی در مورد شیوه کار این الگوریتمها موجب میشود که ابزار صحیحی برای ساخت یک موتور هوشمندتر مورد استفاده قرار دهیم.
وجه اشتراک الگوریتمها
در زمان بررسی الگوریتمها همواره این مفاهیم را در پسزمینه ذهن خود داشته باشید.
- محاسبات روی بازنماییهای بُرداری اشیا اعمال میشوند.
- مشابهت/فاصله هر زمان بین یک جفت منفرد از بردارها محاسبه میشود.
- صرف نظر از الگوریتم، انتخاب قابلیت تأثیر عمدهای روی نتایج دارد.
فاصله اقلیدسی
فاصله اقلیدسی به طور خلاصه به مسافت بین 2 نقطه در یک فضای چندبعدی گفته میشود.
به این ترتیب نقاط نزدیکتر، به همدیگر شباهت بیشتری دارند. نقاط دورتر از همدیگر تفاوت بیشتری دارند. از این رو در نمودار فوق ماریو و کارلوس شباهت بیشتری نسبت به جفت کارلوس و جنی دارند.
در نمودار فوق فضای دوبعدی (ویژگیهای ثروت و دوستان) عامدانه انتخاب شده تا رسم نمودار سادهتر باشد. اما میتوان فاصله را در فضای فراتر از 2 بعد نیز محاسبه کرد، گرچه به فرمول خاصی نیاز دارد.
به طور شهودی این روش برای اندازهگیری مسافت معنیدار است. ما سندها را به صورت نقاطی رسم میکنیم که به طور عملی امکان اندازهگیری فاصله بین آنها با استفاده از خطکش وجود دارد.
مقایسه شهرها با فاصله اقلیدسی
در این بخش مثالی از مقایسه سه شهر نیویورک، تورنتو و پاریس را بررسی میکنیم.
- تورنتو = [3,7]
- نیویورک = [7,8]
- پاریس = [2,10]
بردار ویژگی شامل 2 خصوصیت به صورت [population, temperature] است. جمعیت بر حسب میلیون و دما با مقیاس سانتیمتر است. اکنون از آنجا که این مسئله را نیز به صورت 2 بعدی طراحی کردهایم، میتوانیم مسافت بین نقاط را با خطکش اندازهگیری کنیم، اما به جای آن باید از فرمول بهره بگیریم.
این فرمول چه 2 و چه 1000 بُعد وجود داشته باشد، کار میکند.
پیادهسازی فاصله اقلیدسی در پایتون
فرمول ریاضی فاصله اقلیدسی به صورت زیر است:
در ادامه تابعی مینویسیم که آن را پیادهسازی کرده و مسافت بین دو نقطه را محاسبه میکند:
به این ترتیب میبینیم که مسافت بین نیویورک و تورنتو برابر با 4.12 است.
محاسبه فاصله اقلیدسی با Sklearn
تابعی که در بخش فوق نوشتیم کمی ناکافی است. Sklearn یک نسخه سریعتر را با استفاده از Numpy پیادهسازی میکند. در بخش پروداکشن فقط از این نسخه باید استفاده کنیم:
توجه کنید که این نسخه به عنوان ورودی به جای لیست از آرایه استفاده میکند، اما نتیجه مشابهی به دست میآید.
مشابهت کسینوسی
مشابهت کسینوسی به طور خلاصه به کسینوس زاویه بین دو نقطه در یک فضای چندبُعدی گفته میشود.
به این ترتیب نقاط با زوایای کمتر، مشابهت بیشتری دارند و نقاط با زوایای بزرگتر از همدیگر متفاوتتر هستند.

در نمودار فوق، سه سند را بر اساس تعداد دفعاتی که به کلمات Cooking و Restaurant اشاره شده است مورد بررسی قرار دادهایم.
فاصله اقلیدسی به ما اعلام میکند که بلاگ و مجله مشابهت بیشتری نسبت به بلاگ و روزنامه دارند، اما این نتیجه میتواند گمراهکننده باشد، چون بلاگ و روزنامه میتوانند محتوای مشابه بیشتری داشته باشند، اما فاصله اقلیدسی بیشتری دارند، زیرا مطالب روزنامه طولانیتر است و شامل کلمات بیشتری است.
در عمل هر دو آنها شامل کلمات Restaurant و Cooking بیشتری هستند و احتمالاً مشابهت بیشتری نسبت به هم دارند. مشابهت کسینوسی موجب میشود در این دام نیفتیم.
مقایسه کتابها و مقالات با مشابهت کسینوسی
در این بخش روی مثال قبلی کار میکنیم و به مقایسه اسناد بر اساس تعداد کلمات خاص میپردازیم.
به جای این که مسافت بین هر نقطه را محاسبه کنیم، کسینوس زاویه بین آنها را از مبدأ مختصات در نظر میگیریم. اکنون حتی با یک نگاه مختصر نیز میبینیم که بلاگ و روزنامه مشابهت بیشتری دارند.
پیادهسازی مشابهت کسینوسی در پایتون
توجه کنید که مشابهت کسینوسی به خود زاویه مربوط نیست، بلکه کسینوس زاویه در نظر گرفته میشود. بنابراین زاویههای کمتر (زیر 90 درجه) مشابهت بیشتری دارند.
در ادامه یک تابع برای محاسبه مشابهت کسینوسی پیادهسازی میکنیم:
اینک میتوانیم ببینیم که بلاگ و روزنامه در عمل مشابهت بیشتری نسبت به همدیگر دارند.
مشابهت کسینوسی با Sklearn
در محیط پروداکشن بهتر است پیادهسازی بسیار کارآمدتر Sklearn را ایمپورت کنیم:
چنان که میبینید مقادیر مشابهی به دست میآید.
همبستگی پیرسون
همبستگی پیرسون به طور معمول رابطه بین 2 متغیر را کمّیسازی میکند. در مثال زیر به بررسی همبستگی بین دو متغیر تحصیلات و درآمد میپردازیم.
از همبستگی پیرسون میتوان برای اندازهگیری مشابهت بین دو سند نیز استفاده کرد. در این حالت سند اول به عنوان یک بردار مانند x و سند دوم به عنوان بردار y تصور میشود. از آنجا که ضریب همبستگی پیرسون (r) یک مقدار بین 1 و 1- بازگشت میدهد. فاصله پیرسون را میتوان به صورت 1-r محاسبه کرد تا مقداری بین 0 و 2 بازگشت یابد.
پیادهسازی ضریب همبستگی پیرسون در پایتون
در این بخش فرمولی برای افزایش درک خودمان از طرز کار ضریب همبستگی پیرسون پیادهسازی میکنیم.
به منظور نمایش برخی افراد در مثال مورد نظر خود برخی دادههای ساختگی تولید میکنیم. این افراد را بر اساس مشابهت بر مبنای یک بردار با سه ویژگی مورد بررسی قرار میدهیم.
پیادهسازی ما به صورت زیر است:
چنان که میبینید امیلی و کارتیک کاملاً مشابه به نظر میرسند. ما هر سه این موارد را در ادامه با Scipy بررسی خواهیم کرد.
محاسبه ضریب همبستگی پیرسون با Scipy
پکیج Scipy یک نسخه بسیار کارآمدتر و پایدارتر را برای محاسبه ضریب همبستگی پیرسون پیادهسازی کرده است:
البته ما از اعداد تصادفی به عنوان نقاط داده خود استفاده کردیم. بدین ترتیب میبینیم که امیلی و کاتریک مشابهت بیشتری نسبت به جفت امیلی و تاد دارند.
سخن پایانی
در این مقاله به بررسی اجمالی برخی الگوریتمهای بررسی مشابهت سند به عنوان یک جزء اساسی از موتورهای پیشنهاد محتوا پرداختیم، اما این مقدار بسیار جزئی است و برای بررسی جامع به مطلب بسیار مفصلتری نیاز داریم. در زمینه طراحی یک موتور تجارت الکترونیک، در ادامه باید یک ماتریس نمرات مشابهت بین هر دو جفت کاربران بسازیم. سپس میتوانیم از آن برای پیشنهاد محصولات مشابه خریدهای قبلی کاربران استفاده کنیم. بدین ترتیب یک موتور خوب پیشنهاد محصول، باید شامل قواعد مبتنی بر دامنه و ترجیحهای کاربر نیز باشد.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای پیشبینی و تحلیل سریهای زمانی
- آموزش کامل برنامهنویسی پایتون (Python)
- مجموعه آموزش دادهکاوی و یادگیری ماشین | مقدماتی تا پیشرفته
- سیستم توصیه گر قیمت با پایتون — راهنمای کاربردی
- پیادهسازی سیستمهای توصیهگر در پایتون — از صفر تا صد
==