سلام ?
شاید برای شما هم این سوال وجود داشته باشه که Elasticsearch یا سایر ابزار های جستجو، چطوری تصمیم میگیرن که کدوم نتیجه بیشترین ارتباط رو با کلمهی مورد جستجو داره ?
یکی از راهها برای رسیدن به این هدف، استفاده از الگوریتم TF-IDF هستش که قراره توی این مطلب، اون رو خیلی خلاصه توضیح بدم و یه نمونه از پیادهسازیش رو با هم ببینیم.
TF-IDF = Term Frequency Inverse Document Frequency
این الگوریتم، بر اساس دفعات تکرار کلمه توی متن به اون یه امتیازی رو اختصاص میده، هرچی اون امتیاز بیشتر باشه یعنی اهمیت اون کلمه بیشتره.
یعنی چقد اون عبارت مورد جستجوی کاربر توی document تکرار شده و هرچی این عدد بیشتر باشه یعنی مرتبط تره.
یعنی چقد عبارت مورد جستجوی ما توی همهی document ها تکرار شده و هرچی این عدد بیشتر باشه یعنی بی ربط تره نتیجه جستجو.
فرضکنید میخوایم نام محمد رو جستجو بکنیم، کلمهی محمد توی یه متن 500 کلمهای 10 بار تکرار شده پس TF کلمهی محمد میشه 500 / 10 = 0.02
حالا اگه بخوایم IDF رو حساب بکنیم نیازه که بدونیم کلا چندتا document داریم که شامل کلمهی محمد هستن. اگه تعداد کل document های ما 100.000 تا باشن و کلمهی محمد توی 20.000 تا از این داکیومنتا باشه مقدار IDF میشه 20.000 / 100.000 = 5
و در نهایت TF-IDF ما میشه => 5 * 0.02 = 0.1
حالا بیاید یه مورد دیگه رو بررسی کنیم، فرض کنید کلمه the توی یه داکیومنت 500 کلمهای 100 بار تکرار شده و از 100.000 تا داکیومنتمون توی 80.000 تاش هست.
اینجا TF میشه => 500 / 100 = 0.2
و IDF میشه => 80.000 / 100.000 = 1.25
و TF-IDF میشه => 1.25 * 0.2 = 0.25
حالا فرض کنید که کلمهی محمد حسین رو جستجو کردیم، اینجا چه اتفاقی میوفته؟
برای هر کدوم از کلمات به صورت جداگونه TF-IDF محاسبه میشه و نتیجشون جمع میشن با هم و هر داکیومنتی که score بیشتری داشت به عنوان اولین نتیجه بر گردونده میشه.
در نتیجه اگه مثلا عبارت The New Age رو جستجو بکنیم تاثیر عبارت The توی نمره خیلی کم خواهد بود، چرا؟ چون این عبارت تقریبا توی همه داکیومنت ها به تعداد زیادی وجود داره، امتیاز پایینی میگیره و به همین دلیل تاثیر کمی هم داره.
یه پیادهسازی خیلی ساده از این الگوریتم رو نوشتم، که میتونید ببینید (اگه کد رو نمیبینید فیلترشکنتون رو روشن کنید و صفحه رو رفرش کنید، کد داخل gist هستش و بعضی وقتا gist با فیلترشکن باز میشه فقط)
اگه میخواید بیشتر راجع به این الگوریتم بدونید میتونید از لینکهای زیر استفاده کنید ?
ممنون از اینکه وقت گذاشتید و خوندید ?
محمد محمدعلیان - 5 شهریور 1400 نوشته شده! و 30 اردیبهشت 1401 منتشر شده.