محمد محمدعلیان
محمد محمدعلیان
خواندن ۲ دقیقه·۳ سال پیش

الگوریتم TF-IDF یا بصورت پیش‌فرض چطوری Elasticsearch تصمیم می‌گیره کدوم رکورد مرتبط تره؟

سلام ?

شاید برای شما هم این سوال وجود داشته باشه که Elasticsearch یا سایر ابزار های جستجو، چطوری تصمیم می‌گیرن که کدوم نتیجه بیشترین ارتباط رو با کلمه‌ی مورد جستجو داره ?

یکی از راه‌ها برای رسیدن به این هدف، استفاده از الگوریتم TF-IDF هستش که قراره توی این مطلب، اون رو خیلی خلاصه توضیح بدم و یه نمونه از پیاده‌سازیش رو با هم ببینیم.

TF-IDF = Term Frequency Inverse Document Frequency

این الگوریتم، بر اساس دفعات تکرار کلمه توی متن به اون یه امتیازی رو اختصاص میده، هرچی اون امتیاز بیشتر باشه یعنی اهمیت اون کلمه بیشتره.

حالا Term Frequency یعنی چی؟

یعنی چقد اون عبارت مورد جستجوی کاربر توی document تکرار شده و هرچی این عدد بیشتر باشه یعنی مرتبط تره.

و Inverse Document Frequency یعنی چی؟

یعنی چقد عبارت مورد جستجوی ما توی همه‌ی 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 با فیلترشکن باز میشه فقط)

https://gist.github.com/mhmda-83/830522209728be8fac39bc1287109176

اگه می‌خواید بیشتر راجع به این الگوریتم بدونید می‌تونید از لینک‌های زیر استفاده کنید ?

Wikipedia
Monkey Learn


ممنون از اینکه وقت گذاشتید و خوندید ?
محمد محمدعلیان - 5 شهریور 1400 نوشته شده! و 30 اردیبهشت 1401 منتشر شده.

کانال تلگرامم | لینکدینم

الگوریتم
یه ممد 20 ساله که برنامه‌نویس بک-انده. لینکای من: https://redl.ink/Mohammadalian_1383
شاید از این پست‌ها خوشتان بیاید