پردازش زبان های طبیعی (NLP) [3]

منظور از Regular (عبارت قاعده مند)، عبارتی است که با آن بتوانیم به یک دسته کلی از متون ، و یا رشته ها دسترسی داشته باشیم؛ در واقع به عنوان مثال، وقتی بخواهیم به تمامی عبارات که با حرف " آ " شروع شده و با حرف " م " پایان می یابند، می بایست از Regex یا Regular Expression استفاده نماییم.

ما با یک عبارت قاعده مند، می توانیم تمامی زیررشته های (Sub-string) موجود در یک رشته (String) را که در آن صدق می کنند، شناسایی کنیم.

Regex چیست؟
Regex چیست؟

به عنوان شروع موارد زیر را به خاطر داشته باشیم:

  1. کاراکتر “.” : یعنی هر کاراکتری بجز انتهای خط
  2. کاراکتر “*” : یعنی به تعداد 0 یا بیشتر کاراکتر
  3. کاراکتر “+” : یعنی به تعداد 1 یا بیشتر کاراکتر
  4. کاراکتر”؟” : یعنی مهم نیست در ادامه کاراکتری وجود داشته باشد یا نه
  5. کاراکتر “d/” : یعنی اگر عدد بود
  6. کاراکتر “w/” : یعنی اگر حروف, عدد یا کاراکتر “_” بود
  7. کاراکتر “$” : یعنی پایان رشته ی خط
  8. کاراکتر”^” : یعنی آغاز رشته ی خط
  9. عبارت [XYZ] : یعنی یک تک کاراکتر از کلاس کاراکترها
  10. عبارت [XYZ]+ : یعنی یک یا بیشتر کاراکتر از کلاس کاراکترها

یک کامند خیلی معروفه وجود دارد که قطعاً به گوش شما خورده است (Grep)، که به عنوان ابزاری برای جستجو در متنب هم نظور یافتن الگویی خاص در فایل‌های مختلف مورد استفاده قرار می‌گیرد که به راحتی می‌توان این ابزار را با دستور Regex مورد استفاده قرار داد.

وبسایت ReGexr جهت تست آنلاین قواعد Regex
وبسایت ReGexr جهت تست آنلاین قواعد Regex

خوب نوبت این هست که مقداری دست به کد بشویم. پایتون به صورت پیش فرض و Built-in پکیج کار با Regular Expression دارد که به صورت زیر می توانیم آن را بارگذاری کنیم:

import re

توابع مهم قابل استفاده در Regex عبارتند از :

  • Findall()
  • Search()
  • Split()
  • Sub()

به عنوان اولین مثال میخواهیم ببینیم که آیا در کل متن موجود (فرض کنید یک جمله و یا یک متن طولانی از یک وب سایت خبری) جمله ای وجود دارد که با کلمه "من" شروع شده است یا خیر؟

تمامی توابع بر روی این جمله تست و اجرا شده است:

من، سهیل تهرانی پور ،از آکادمی یادگیری ماشین ایران ، در حال نوشتن مقاله پردازش زبان طبیعی ، در ویرگول هستم

(شایان ذکر است می توانید قطعات کد زیر را در یک فایل با پسوند "py." و یا در Jupyter Notebook عیناً Copy-paste کنید و خروجی را مشاهده نمایید.) در ابتدا به بررسی تابع Findall خواهیم پرداخت:

import re
str = &quotمن، سهیل تهرانی پور،از آکادمی یادگیری ماشین ایران، در حال نوشتن مقاله پردازش زبان طبیعی، در ویرگول هستم&quot
x = re.findall(&quot\Aمن&quot, str)
print(x)
if (x):
print(&quotبله، موجود می باشد&quot)
else:
print(&quotخیر، متاسفانه موجود نیست&quot)

خروجی این دستور در پایتون به صورت زیر خواهد بود:

['من']
بله، موجود می باشد

در ادامه برای بررسی مثال دستور Search از پکیج Regex به صورت زیر می توانیم عمل کنیم:

import re
str = &quotمن، سهیل تهرانی پور،از آکادمی یادگیری ماشین ایران، در حال نوشتن مقاله پردازش زبان طبیعی، در ویرگول هستم&quot
x = re.search(&quot[سهیل]&quot, str)
print(&quot :کلمه مورد نظر در موقعیت زیر می باشد &quot+&quot\n&quot , x.start()) 

خروجی این دستور به صورت زیر خواهد بود:

کلمه مورد نظر در موقعیت زیر می باشد :
4

همانطور که در شکل زیر مشاهده می فرمایید بخشی از کدهای نوشته شده به زبان پایتون در Jupyter Notebook آورده شده است. برای دوستانی که حوصله سر و کله زدن با IDE های مختلف رو ندارند، این بهترین گزینه است. کافیه Anaconda رو از این لینک دانلود کنید و دست به کد بشوید.

با Jupyter Notebook زندگی پایتونی بسیار زیبا خواهد بود.
با Jupyter Notebook زندگی پایتونی بسیار زیبا خواهد بود.

در بخش سوم، شاید یکی از مهمترین توابع در پردازش زبان طبیعی (NLP) را خواهیم داشت «تابع Split» که هر رشته به عنوان ورودی را به بخش های کوچکتر بر اساس درخواست ما تقسیم می کند.

import re
str = &quotمن، سهیل تهرانی پور ،از آکادمی یادگیری ماشین ایران ، در حال نوشتن مقاله پردازش زبان طبیعی ، در ویرگول هستم&quot
x = re.split(&quot\s&quot, str)
print(x)

خروجی این کد به صورت زیر می باشد:

در این جا چون تابع Split را با s\ فراخوانی کرده ایم، در جمله ورودی به ازای هر White Space که می بیند، جداسازی را انجام می دهد.

['من،', 'سهیل', 'تهرانی', 'پور', '،از', 'آکادمی', 'یادگیری', 'ماشین', 'ایران', '،', 'در', 'حال', 'نوشتن', 'مقاله', 'پردازش', 'زبان', 'طبیعی', '،', 'در', 'ویرگول', 'هستم']

در ادامه تابع مهم دیگری که به ویژه در پیش پردازش متون مورد استفاده قرار می گیرد را بررسی می نماییم. تابع SUB که جهت جایگزینی یک کاراکتر یا رشته با کاراکتر یا رشته دیگر به صورت زیر خواهد بود:

در مثال زیر، (فاصله ویرگول) به (ویرگول) تبدیل شده است.

import re
str = &quotمن، سهیل تهرانی پور ،از آکادمی یادگیری ماشین ایران ، در حال نوشتن مقاله پردازش زبان طبیعی ، در ویرگول هستم&quot
x = re.sub(&quot ،&quot, &quot،&quot, str)
print(x)

خروجی دستور بالا به صورت زیر خواهد بود:

من، سهیل تهرانی پور،از آکادمی یادگیری ماشین ایران، در حال نوشتن مقاله پردازش زبان طبیعی، در ویرگول هستم

در مثال زیر به جای «آکادمی یادگیری ماشین ایران» کلمه «Iran Machine Learning» را جایگزین خواهیم نمود:

import re
str = &quotمن، سهیل تهرانی پور ،از آکادمی یادگیری ماشین ایران ، در حال نوشتن مقاله پردازش زبان طبیعی ، در ویرگول هستم&quot
x = re.sub(&quotیادگیری ماشین ایران&quot, &quotIran Machine Learning&quot, str)
print(x)

از تابع Sub و Split به عنوان توابع اصلی در پیش پردازش متون طبیعی یاد می شود. از آن ها در روزهای بعدی که در مورد NLTK صحبت خواهیم نمود، بیشتر می شنویم.
من، سهیل تهرانی پور، قصد دارم تا از طریق ویرگول برای شما بیشتر از NLP بگم تا بتونیم در کنار هم زبان قشنگ فارسی رو جهانی تر کنیم.

بیاین با هم یادگیری ماشین، یاد بگیریم. (Keep Calm and Learn Machine Learning)