یافتن ریشه کلمات با Stemming و Lemmatization

اگر درس‌های قبل، مخصوصاً درسِ کوله‌ی کلمات(BoW) و تحلیل احساسات را خوانده باشید، احتمالاً متوجه یک نکته شده‌اید. عموماً در متونِ مختلف، کلماتی وجود دارند که نزدیک به هم هستند ولی به دو یا چند شکل مختلف نوشته می‌شوند. الگوریتم‌های متن‌کاوی این نوع کلمات را به دو یا چند شکل مختلف شناسایی می‌کند و نمی‌تواند رابطه‌ی معنایی بین این این کلمات پیدا کتند. مثلاً فرض کنید دو کلمه‌ی “غذا” و “غذاها” در یک جمله باشند. با استفاده از مدل‌هایی مانند BoW جهت تبدیل کلمات به ماتریس، کلمه‌ی “غذا” یک ویژگی(بُعد) و کلمه‌ی “غذاها” یک ویژگی(بُعد) دیگر می‌شود که این یک نقطه ضعف برای مدل‌هایی مانند BoW یا الگوریتم‌های متن‌کاوی دیگر است.

برای یادآوری، دوباره مثالِ درسِ کوله‌ی کلمات را می‌آوریم(به هر کلمه یک عدد نسبت داده می‌شد و هر کلمه به یک ستون ویژگی(بُعد) در ماتریسِ ویژگی نگاشت می‌شد:

  • جمله‌ی 1: من از غذای این رستوران خوشم آمد
  • جمله‌ی 2: غذای رستوران خیلی خوب بود ولی رفتار پرسنل نه
  • جمله‌ی 3: جای پارک پیدا نمی‌شد و غذا خیلی دیر به دستمان رسید

من(1)، از(2)، غذای(3)، این(4)، رستوران(5)، خوشم(6)، آمد(7)، خیلی(8)، خوب(9)، بود(10)، ولی(11)، رفتار(12)، پرسنل(13)، نه(14)، جای(15)، پارک(16)، پیدا(17)، نمی‌شد(18)، و(19)، غذا(20)، دیر(21)، به(22)، دستمان(23)، رسید(24)

حال فرض کنید در جمله‌ی دوم، به جای “غذای” از “غذاهای” استفاده می‌شد. آن‌وقت بایستی یک ستونِ ویژگی(بُعد) دیگر به ماتریس اضافه می‌کردیم و در تحلیل‌های بَعدی(مثلاً طبقه‌بندی یا تحلیل احساس یا خوشه‌بندیِ متون)، این دو کلمه مجزا از هم در نظر گرفته می‌شدند(چون در دو ستون مختلف بودند و الگوریتم، این‌ها را دو کلمه‌ی کاملاً جدا و بی‌ربط به هم در نظر می‌گرفت). اما می‌دانیم که منظور از این کلمه یک چیز بوده و در واقع ریشه‌ی این دو کلمه یکی هستند. ریشه‌ی این دو کلمه “غذا” است.

عمل ریشه‌یابی این امکان را می‌دهند که فُرم‌های مختلفِ یک کلمه را به یک فُرمِ واحد تبدیل کنیم. با این کار تعداد ویژگی‌ها کمتر می‌شود(درس کاهش ویژگی را خوانده باشید) و همچنین شکل‌های مختلفِ یک کلمه حذف شده و کامپیوتر می‌تواند شکل‌های مختلفِ یک کلمه را یکی در نظر بگیرد.

برای ریشه‌یابیِ کلمات معمولاً از دو روشِ Stemming و Lemmatization استفاده می‌شود که هر دو روش قادر هستند ریشه‌ی یک کلمه را به دست بیاورند. برای مثال کلمه‌ای مانندِ “رفتن” را تصور کنید که ممکن است در جمله‌های مختلف به شکل‌های گوناگون ظاهر شود. برای مثال:

  • من به خیابان اصلی رفتم
  • بیا با هم به مسافرت برویم
  • کاش سال پیش سفری می‌رفتم
  • می‌دانستم اگر با آن‌ها بد صحبت کنند، احتملاً بروند

تمامیِ فعل‌های “رفتن” در جملاتِ بالا را می‌توان به کلمه‌ی “رفت” نگاشت کرد. با این کار می‌توان 4ویژگی(رفتم، برویم، می‌رفتم، بروند) را به یک ویژگی(رفت) نگاشت کرد و با این عمل کاهش ویژگی(کاهش ابعاد) نیز انجام می‌شود.

الگوریتم‌های مختلفی جهت انجام عمل Stemming(که یکی از روش‌های به دست آوردن ریشه‌ی کلمات است) وجود دارد. در زبان انگلیسی الگوریتم Porter بسیار معروف است. این الگوریتم طبق یک سری قاعده‌ی منظم(مثلاً حذف حرف s در آخر کلماتِ جمع) می‌تواند ریشه‌ی کلمات را با دقتِ خوبی به دست آورد. همچنین در زبان فارسی، الگوریتم کاظم تقوی، این کار را با دقت بالایی(برای کلمات فارسی) انجام می‌دهد.

عمل Lemmatization نیز می‌تواند توسط روش‌هایی انجام شود. در این عمل نیاز است که از یک فرهنگ لغت یا چیزی شبیه به آن برای به دست آوردنِ ریشه‌ی لغات استفاده شود، چون عموماً روش‌های Lemmatization به صورت با قاعده نیستند.

 

منبع

همچنین ممکن است مطالب زیر را بخواهید بررسی کنید

نظرات

نظر شما چیه؟

مرجع تخصصب پردازش زبان فارسی

NLP Farsi .ir

خبرنامه

برای اطلاع از به روز رسانی های جدید، اطلاعات و غیره، در خبرنامه ما مشترک شوید.