فهرست مطالب
در این بخش از مقاله، با چگونگی حذف ایست واژه ها (Stop Words) آشنا میشویم و در پایان، ابر کلمات جدیدی میسازیم که از ابر کلمات قبلی بهتر خواهد شد!
شمارش فراوانی (تعداد دفعات تکرار) کلمات
ابتدا محتوا و متن خام مقاله ویکیپدیا در مورد زمین را با فراخوانی تابع wikipedia_page(‘Earth’) که در قسمت قبل به آن اشاره کردیم، دانلود میکنیم:
import requests
text = wikipedia_page('Earth').lower()
print(text[:200] + '...')
مرحله بعدی، شمارش فراوانی یا تعداد دفعات تکرار هر کلمه است. این کار به شناسایی کلمات پرتکرار که به موضوع متن ارتباطی ندارند، کمک میکند (مانند and، or و the).
اینها همان ایست واژه ها هستند. تعریف آنها را بهخاطر دارید؟
ایست واژه ها (Stop Words) کلماتی هستند که هیچ اطلاعات مفیدی در مورد محتوای یک متن یا ماهیت آن ارائه نمیدهند. این کلمات ممکن است به دو صورت باشند. حالت اول کلماتی هستند که معنادار نیستند؛ مانند حروف اضافه و حروف ربط (from، of و …). حالت دوم کلماتی هستند که در متن بسیار تکرار شدهاند و عموماً اطلاعات خاصی را به ما منتقل نمیکنند؛ مانند افعال am، is، are و … .
شمارش فراوانی هر کلمه، یک فرایند سهمرحلهای است:
- ابتدا باید متن را بر اساس کاراکتر space به تعدادی کلمه تقسیم کنیم، یعنی متن را با استفاده از split بهصورت کلمه کلمه جدا کنیم.
- سپس با استفاده از یک تابع شمارنده (Counter Function)، میشماریم که هر کلمه در کل متن چند بار استفاده شده تا تعداد تکرار آن را در کل متن به دست آوریم.
from collections import Counter
# we transform the text into a list of words
# by splitting over the space character ' '
word_list = text.split(' ')
# and count the words
word_counts = Counter(word_list)
خروجی word_counts یک دیکشنری است که کلید (key)های آن، همه کلمات مختلف یک متن و مقادیر (value)های آن، تعداد دفعات تکرار کلمات در متن است.
- میتوانیم با استفاده از most_common(20)، لیستی از 20 کلمه پرتکرار متن را با ترتیب نزولی تکرارشان ببینیم:
for w in word_counts.most_common(20):
print(f"{w[0]}: \t{w[1]} ")
the: 662
of: 342
and: 248
is: 175
to: 164
in: 142
a: 123
earth's: 88
from: 72
by: 70
earth: 68
as: 67
that: 66
at: 58
with: 55
are: 53
about: 46
surface: 41
on: 41
this: 40
میبینیم که بیشتر کلمات لیست، کلماتی مانند the، of و and هستند که معنای خاصی ندارند و هیچ اطلاعات و مفهومی از متن را به ما منتقل نمیکنند. در این لیست، تنها دوکلمه معنادار earth و surface وجود دارد که به موضوع متن، یعنی زمین ارتباط دارند!
بیاییم از یک جنبه دیگر به این لیست نگاه کنیم. آیا متوجه الگوی نزولی تعداد تکرار کلمات شدهاید؟
میتوانیم ببینیم که بسامد کلمه شماره n ام، تقریباً متناسب با 1/n است. اگر تعداد کلمه the را بهعنوان مبنا قرار دهیم (662)، کلمه of که کلمه دوم بوده بهاندازه 2/1 کلمه the تکرار شده است (2/662) یعنی حدوداً (342). بهاینترتیب، کلمه and که کلمه سوم است، بهاندازه 3/1 کلمه the تکرار شده است (3/662) یعنی حدوداً (248). این اعدادی حدودی باتوجهبه لیست بهدستآمده از دیکشنری word_counts، نوشته شدهاند. این نتیجه تجربی، قانون زیف (Zipf’s law) نامیده میشود.
این قانون اولینبار توسط جورج زیف، زبانشناس دانشگاه هاروارد کشف شد. او در سال ۱۹۴۹ متوجه نکته عجیبی درباره میزان فراوانی استفاده از کلمات در هر زبان شد. او متوجه شد تعداد معدودی از کلمات همیشه استفاده میشوند؛ درحالیکه تعداد زیادی از کلمات بهندرت به کار میروند. او وقتی کلمات را به ترتیب تعداد تکرار استفاده از آنها درجهبندی کرد، الگوی جالبی را پیدا کرد: کلمهای که بیشترین تکرار را داشته باشد، همیشه دوبرابر بیشتر از دومین کلمه پرتکرار و سه برابر بیشتر از سومین کلمه پرتکرار و ده برابر بیشتر از دهمین کلمه پرتکرار استفاده میشود.
زیف این الگو را رتبه در برابر فراوانی نامید که بعدها بهعنوان قانون زیف (Zipf’s law) شناخته شد که در بسیاری از زبانها مانند انگلیسی، فرانسوی و اسپانیایی تأیید شده است.
اگر اول راه پردازش زبان طبیعی هستید و میخواهید کار بر روی پروژههای واقعی NLP را یاد بگیرید، دوره آموزش پردازش زبان طبیعی مقدماتی را از دست ندهید.
حذف ایست واژه (Stop Word)
وقت آن است که ایست واژه ها و کلمات بیمعنی را از لیست کلمات استفاده شده در متن، حذف کنیم.
# transform the text into a list of words
words_list = text.split(' ')
# define the list of words you want to remove from the text
stopwords = ['the', 'of', 'and', 'is','to','in','a','from','by','that', 'with', 'this', 'as', 'an', 'are','its', 'at', 'for']
# use a python list comprehension to remove the stopwords from words_list
words_without_stopwords = [ word for word in words_list if word not in stopwords ]
حال اگر مجدداً لیست 20 کلمه پرتکرار متن را ببینیم، متوجه میشویم که با لیست قبلی تفاوت دارد:
Counter(words_without_stopwords).most_common(20)
> [("earth's", 88), ('earth', 68), ('about', 46), ('surface', 41), ('on', 41), ('solar', 36), ('it', 35), ('million', 35), ('have', 32), ('which', 27), ('or', 27), ('life', 26), ('sun', 25), ('water', 24), ('atmosphere', 24), ('other', 24), ('has', 24), ('into', 24), ('than', 23), ('be', 22)]
در مقایسه با لیست قبل، چند کلمه معنادار جدید مانند million، surface، life، solar و sun را داریم. البته همچنان تعدادی ایست واژه در لیست وجود دارد که میتوانیم آنها را نیز کنار بگذاریم (مانند on، it و has) زیرا با حذف هر چه بیشتر تعداد ایست واژه ها، ابر کلمات بهتر و مفهومیتری را به دست میآوریم.
تصویر ابر کلمات مقاله ویکیپدیا در مورد زمین با حذف لیستی از ایست واژه ها.
دوست دارید پروژههایی برای پردازش متن یاد بگیرید که در کارهای دنیای واقعی استفاده میشوند؟ آموزش متن کاوی فارسی با شبکههای عصبی را ببینید.
استفاده از یک لیست از پیش تعریفشدهٔ ایست واژه ها (Stop Word)
هیچ لیست دقیق یا کاملی از ایست واژه ها در هیچ زبانی وجود ندارد زیرا این لیست به محتوا و متن ما بستگی دارد. بهعنوانمثال، برای متنی که در مورد آبوهوا است، اعداد مهم هستند زیرا نمایانگر دمای هوا هستند، اما شاید همین اعداد برای متنهایی در حوزه موسیقی یا حقوقی چندان اهمیت نداشته باشند.
تمام کتابخانههای اصلی NLP، یک لیست از پیش تعریف شدهای از ایست واژه ها بهصورت مجزا دارند که هرکدام از این لیستها را میتوان آنلاین دریافت کرد.
- میتوانید ایست واژه های زبانهای مختلف را در این Repository GitHub پیدا کنید.
- میتوانید ایستواژههایی را که از چندین منبع جمعآوری شدهاند، در این Repository GitHub پیدا کنید.
کتابخانه Word Cloud، یک لیست از پیش تعریف شدهای دارد که از 190 ایست واژه تشکیل شده است. میتوانیم 20 مورد از آنها را ببینیم:
print(list(WordCloud().stopwords)[:20])
> ['these', 'while', 'on', "i'm", 'since', 'himself', 'myself', 'or', 'hers', "i'll", "let's", 'could', 'him', "who's", "mustn't", "she'll", 'his', 'other', "couldn't", 'were']
به طور پیشفرض کتابخانه Word Cloud، از لیست ایست واژه های خود استفاده میکند، اما میتوانیم یک لیستی از ایست واژه های موردنیاز خود را بر اساس متنی که داریم بهعنوان پارامتر stopwords آن تعریف کنیم یعنی به این صورت WordCloud(stopwords = […]),.
اگر از لیست پیشفرض کتابخانه Word Cloud استفاده کنیم، تصویر ابر کلمات ما به این صورت خواهد بود:
تصویر ابر کلمات مقاله ویکیپدیا در مورد زمین با حذف ایست واژه های پیشفرض کتابخانه Word Cloud.
میبینیم که این تصویر از ابر کلمات، اطلاعات بسیار بیشتری در مورد متن مقاله به ما میدهد. زیرا کاملاً واضح است که محتوای متن ما در مورد زمین، ساختار و محیط آن است.
شنیدید برای یادگیری هوش مصنوعی باید ریاضیات بلد باشید و نگرانید که ریاضی را فراموش کردید؟ آموزش سریع جبر خطی را در کانال یوتیوب دیتاهاب ببینید تا خیالتان راحت شود.
- تبدیل یک متن به لیستی از کلمات را توکنسازی (Tokenization) میگویند و هر کلمه را یک توکن مینامند.
- یکی از سادهترین راهها برای توکنسازی، تقسیم متن بر اساس کاراکتر space با استفاده از split(‘ ‘) است.
- هیچ لیست دقیق یا کاملی از ایست واژه ها در هیچ زبانی وجود ندارد زیرا این لیست به محتوا و متن ما بستگی دارد.
- به طور پیشفرض، اگر مقدار پارامتر stop word را مشخص نکنیم، کتابخانه Word Cloud از لیست از پیش تعریف شده خود که شامل 190 کلمه است، برای شناسایی و حذف ایست واژه ها استفاده میکند.
در این مقاله، با نحوه حذف ایست واژه های یک متن آشنا شده و یکی از راههای ساده توکنسازی، یعنی توکنسازی بر اساس کاراکتر space را دیدیم. قرار است در مقاله بعدی بیشتر در مورد توکنسازی و کتابخانه NLTK صحبت کنیم.