NLTK چیست؟
کتابخانه NLTK سرنام (Natural Language Toolkit) مجموعهای است که شامل کتابخانهها و برنامههایی برای پردازش زبانهای آماری است و همانگونه که اشاره شد، یکی از قدرتمندترین گزینهها در این زمینه است که شامل بستههایی است تا ماشینها زبان انسان را بفهمند و با بیانی شیوا به آن پاسخ دهند.
پردازش زبان طبیعی (NLP) رشتهای است که بر روی قابل استفاده کردن زبان طبیعی انسانها توسط برنامههای کامپیوتری تمرکز دارد. در این میان، NLTK یا Natural Language Toolkit یک بسته پایتون است که میتوانید در ارتباط با پردازش زبان طبیعی از آن استفاده کنید.
بخش عمدهای از دادههایی که میتوانید تجزیه و تحلیل کنید، دادههای بدون ساختار هستند و شامل متنهای قابل خواندن برای انسان هستند. قبل از اینکه بتوانید آن دادهها را به صورت برنامهنویسی تجزیه و تحلیل کنید، ابتدا باید آنها را از قبل پردازش کنید. در این مقاله، نحوه انجام اینکار و وظایف مرتبط با پیش پردازش متنی که میتوانید با NLTK انجام دهید را مورد بررسی قرار میدهیم. همچنین، به بررسی این موضوع خواهیم پرداخت که میتوانید برخی از تجزیه و تحلیلهای اولیه متن و مصورسازی دادهها را انجام دهید.
اگر با اصول اولیه استفاده از پایتون آشنا هستید و دوست دارید به دنیای پردازش زبان طبیعی وارد شوید، این مقاله برای شما به رشته تحریری در آمده است.
در پایان این آموزش، قادر خواهید بود:
- متنی را برای تجزیه و تحلیل پیدا کنید
- متن خود را برای تجزیه و تحلیل آماده و پردازش کنید
- متن خود را تحلیل کنید
شروع کار با NLTK پایتون
اولین کاری که باید انجام دهید این است که مطمئن شوید پایتون را نصب کردهاید. برای این آموزش، ما از پایتون 3.9 استفاده خواهید کرد. اگر هنوز پایتون را نصب نکردهاید، ابتدا به سایت رسمی این شرکت بروید، فایل پایتون 3 را دانلود کرده و نصب کنید. این فرآیند پیچیدگی خاصی ندارد و همه کارها بدون مشکل انجام میشود.
هنگامی که پایتون را نصب کردید، در مرحله بعد باید به فکر نصب NLTK با pip باشید. برای این آموزش، نسخه 3.5 را به شرح زیر نصب کنید:
$ python -m pip install nltk==3.5
به منظور انجام مصورسازی در زمینه شناسایی موجودیتهای نامگذاری شده، باید NumPy و Matplotlib را نیز نصب کنیم:
$ python -m pip install numpy matplotlib
توکنسازی (نشانهگذاری)
با نشانهگذاری میتوانید متن را به راحتی بر اساس کلمه یا جمله تقسیم کنید. رویکرد فوق به شما امکان میدهد با تکههای کوچکتری از متن کار کنید که حتی بدون متن کامل نیز منسجم و معنادار هستند. این اولین قدم در تبدیل دادههای بدون ساختار به دادههای ساختاری است که تجزیه و تحلیل آن آسانتر است.
هنگامی که متن را تجزیه و تحلیل میکنید، فرآیند نشانهگذاری را با کلمه و جمله انجام دهید. فرآیند نشانهگذاری کلمات و جملات به شرح زیر انجام میشود:
نشانهگذاری با کلمه: کلمات شبیه به اتمها در زبان طبیعی هستند. آنها کوچکترین واحدهای معنایی هستند که به تنهایی نیز معنادار هستند. نشانهگذاری متن بر اساس کلمه به شما امکان میدهد کلماتی را که اغلب پر کاربرد هستند را شناسایی کنید. به طور مثال، اگر مسئولیت تجزیه و تحلیل گروهی از آگهیهای شغلی را بر عهده دارید، ممکن است متوجه شوید که کلمه «پایتون» اغلب مورد استفاده قرار میگیرد. این میتواند نشان دهنده تقاضای بالایی برای دانش پایتون باشد، اما برای کشف عمیقتر این موضوع باید تحلیلهای بیشتری انجام دهید.
نشانهگذاری بر مبنای جمله: هنگامی که فرآیند نشانهگذاری را روی جمله انجام میدهید، میتوانید نحوه ارتباط کلمات با یکدیگر را تجزیه و تحلیل کنید و اطلاعات بیشتری به دست آورید. به طور مثال، آیا کلمات منفی زیادی در اطراف کلمه "پایتون" وجود دارد، زیرا مدیران استخدام پایتون را دوست ندارند؟ آیا اصطلاحات بیشتری در حوزه توسعه نرمافزار وجود دارد که نشان دهنده نقشهای کاملا متفاوتی از پایتون هستند و به همین صورت.
در اینجا نحوه وارد کردن ماژولهای مختلف NLTK ارائه شده تا بتوانید نحوه نشانهگذاری کلمه و جمله آشنا شوید:
>>> from nltk.tokenize import sent_tokenize, word_tokenize
اکنون که آنچه را که نیاز دارید، وارد کردهاید، میتوانید یک رشته برای نشانهگذاری ایجاد کنید. در اینجا یک نقل قول از Dune وجود دارد که میتوانید از آن استفاده کنید:
>>> example_string = """
... Muad'Dib learned rapidly because his first training was in how to learn.
... And the first lesson of all was the basic trust that he could learn.
... It's shocking to find how many people do not believe they can learn,
... and how many more believe learning to be difficult."""
می توانید از sent_tokenize برای تقسیم example_string به جملات استفاده کنید:
>>> sent_tokenize(example_string)
["Muad'Dib learned rapidly because his first training was in how to learn.",
'And the first lesson of all was the basic trust that he could learn.',
"It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult."]
نشانهگذاری example_string با جمله لیستی از سه رشته را به شرح زیر در اختیارتان قرار میدهد:
"Muad'Dib learned rapidly because his first training was in how to learn."
'And the first lesson of all was the basic trust that he could learn.'
"It's shocking to find how many people do not believe they can learn, and how many more believe learning to be difficult."
اکنون آماده هستیم تا example_string را نشانهگذاری کنیم:
>>> word_tokenize(example_string)
["Muad'Dib",
'learned',
'rapidly',
'because',
'his',
'first',
'training',
'was',
'in',
'how',
'to',
'learn',
'.',
'And',
'the',
'first',
'lesson',
'of',
'all',
'was',
'the',
'basic',
'trust',
'that',
'he',
'could',
'learn',
'.',
'It',
"'s",
'shocking',
'to',
'find',
'how',
'many',
'people',
'do',
'not',
'believe',
'they',
'can',
'learn',
',',
'and',
'how',
'many',
'more',
'believe',
'learning',
'to',
'be',
'difficult',
'.']
شما لیستی از رشتههایی را دریافت کردهاید که NLTK آنها را کلمات میداند، مانند:
"Muad'Dib"
'training'
'how'
اما رشتههای زیر نیز واژه محسوب میشوند:
"'s"
','
'.'
مشاهده میکنید که چگونه "It's" در آخرالزمان تقسیم شد تا "It" و "s" را به شما بدهند، اما "Muad'Dib" کامل رها شد؟ این به این دلیل اتفاق افتاد که NLTK میداند که «It» و «'s» (انقباض is) دو کلمه متمایز هستند، بنابراین آنها را جداگانه شمارش کرد. اما «Muad'Dib» مانند «It's» یک انقباض پذیرفتهشده نیست، بنابراین بهعنوان دو کلمه جداگانه خوانده نشد و دست نخورده باقی ماند.
فیلتر کردن کلمات توقف
کلمات توقف کلماتی هستند که میخواهید نادیده بگیرید، بنابراین هنگام پردازش متن، آنها را از متن خود حذف میکنید. کلمات بسیار رایجی مانند in، is و an اغلب به عنوان کلمات توقف استفاده میشوند، زیرا آنها به خودی خود معنی زیادی به متن اضافه نمیکنند.
اکنون باید ماژولهای موردنیاز NLTK به منظور فیلتر کردن کلمات توقف را وارد کنیم:
>>> nltk.download("stopwords")
>>> from nltk.corpus import stopwords
>>> from nltk.tokenize import word_tokenize
در اینجا یک نقل قول از Worf است که میتوانید آن را فیلتر کنید:
>>> worf_quote = "Sir, I protest. I am not a merry man!"
اکنون worf_quote را با کلمه نشانهگذاری کنید و لیست حاصل را در words_in_quote ذخیره کنید:
>>> words_in_quote = word_tokenize(worf_quote)
>>> words_in_quote
['Sir', ',', 'protest', '.', 'merry', 'man', '!']
شما فهرستی از کلمات موجود در worf_quote دارید، بنابراین گام بعدی این است که مجموعهای از کلمات توقف را برای فیلتر کردن words_in_quote ایجاد کنید. برای این مثال، باید روی کلمات توقف در "english" تمرکز کنید:
>>> stop_words = set(stopwords.words("english"))
در مرحله بعد، یک لیست خالی ایجاد کنید تا کلماتی را که از فیلتر عبور میکنند را نگهداری کنید:
>>> filtered_list = []
شما یک لیست خالی ایجاد کردید، filtered_list، تا همه کلمات را در words_in_quote که کلمات توقف نیستند، نگه دارید. اکنون میتوانید از stop_words برای فیلتر کردن words_in_quote استفاده کنید:
>>> for word in words_in_quote:
... if word.casefold() not in stop_words:
... filtered_list.append(word)
ما از حلقه for روی words_in_quote برای پیمایش آن استفاده کردیم و همه کلماتی را که کلمات پایانی نبودند به filtered_list اضافه کردیم. علاوه بر این از casefoldروی کلمه استفاده کردیم تا بتوانیم بزرگی یا کوچکی حروف را نادیده بگیریم. این کار ارزش انجام دادن را دارد، زیرا stopwords.words ('english') فقط شامل نسخههای کوچک کلمات توقف است.
از طرف دیگر، میتوانید از درک فهرست استفاده کنید تا فهرستی از تمام کلمات متن که کلمات پایانی نیستند را آماده کنید:
>>> filtered_list = [
... word for word in words_in_quote if word.casefold() not in stop_words
... ]
وقتی از درک لیست (list comprehension) استفاده می کنید، یک لیست خالی ایجاد نمیکنید تا موارد را به انتهای آن اضافه میکنید. در عوض، فهرست و محتویات آن را همزمان تعریف میکنید. استفاده از تکنیک درک لیست اغلب پایتونیکتر است. اجازه دهید به کلماتی که در filtered_list قرار گرفتند نگاهی بیندازیم:
>>> filtered_list
['Sir', ',', 'protest', '.', 'merry', 'man', '!']
شما چند کلمه مانند "am" و "a" را فیلتر کردید، اما "not" را نیز فیلتر کردید که بر معنای کلی جمله تأثیر میگذارد.
کلماتی مانند I و not ممکن است برای فیلتر کردن خیلی مهم به نظر برسند که این مسئله به نوع تحلیلی که انجام میدهید، بستگی دارد. دلیل این کار به شرح زیر است:
I یک ضمیر است که به جای کلمه محتوایی، کلمه متنی است:
کلمههای محتوایی به شما اطلاعاتی در مورد موضوعات مطرح شده در متن یا احساسی که نویسنده در مورد آن موضوعات دارد، میدهد.
کلمات زمینه به شما اطلاعاتی در مورد سبک نوشتن میدهند. شما میتوانید الگوهایی را در نحوه استفاده نویسندگان از کلمات متنی برای تعیین کمیت سبک نوشتاری خود مشاهده کنید. هنگامی که سبک نوشتاری آنها را اندازهگیری کردید، میتوانید متنی را که توسط نویسنده ناشناس نوشته شده است تجزیه و تحلیل کنید تا ببینید چقدر از یک سبک نوشتاری خاص پیروی میکند، بنابراین میتوانید سعی کنید نویسنده را شناسایی کنید.
not از نظر فنی یک قید است، اما همچنان در فهرست کلمات توقف زبان انگلیسی NLTK گنجانده شده است. اگر میخواهید فهرست کلمات توقف را ویرایش کنید تا not را حذف کنید یا تغییرات دیگری ایجاد کنید، باید ماژول مربوطه را دانلود کنید.
بنابراین، I و not میتوانند بخشهای مهمی از جمله باشند، البته این موضوع بستگی به این مسئله دارد که شما چه چیزی را میخواهید از آن جمله بیاموزید.
Stemming
Stemming یک فرآیند پردازش متن است که در آن کلمات را به ریشه آنها کاهش میدهید که بخش اصلی یک کلمه هستند. به عنوان مثال، کلمات helping و helper ریشه help هستند. Stemming به شما این امکان را میدهد که به جای تمام جزئیات نحوه استفاده از یک کلمه، معنای اصلی آن را در نظر بگیرید. NLTK بیش از یک stemmer دارد، اما شما از Porter stemmer استفاده خواهید کرد.
در اینجا نحوه وارد کردن مولفههای مربوطه NLTK برای شروع stemming به شرح زیر است:
>>> from nltk.stem import PorterStemmer
>>> from nltk.tokenize import word_tokenize
اکنون که فرآیند وارد کردن ماژولها به اتمام رسید، می توانید یک stemmer را با PorterStemmer به صورت زیر ایجاد کنید:
>>> stemmer = PorterStemmer()
مرحله بعدی این است که یک رشته برای stem ایجاد کنید. برای این منظور به روش زیر عمل میکنیم:
>>> string_for_stemming = """
... The crew of the USS Discovery discovered many discoveries.
... Discovering is what explorers do."""
قبل از اینکه بتوانید کلمات را در آن رشته ریشهیابی کنید، باید تمام کلمات آن را جدا کنید:
>>> words = word_tokenize(string_for_stemming)
اکنون که فهرستی از تمام کلمات نشانهگذاری شده از رشته دارید، به آنچه در کلمات است نگاهی داشته باشید:
>>> words
['The',
'crew',
'of',
'the',
'USS',
'Discovery',
'discovered',
'many',
'discoveries',
'.',
'Discovering',
'is',
'what',
'explorers',
'do',
'.']
با استفاده از stemmer.stem فهرستی از کلمههای ریشهیابی شده، ایجاد کنید:
>>> stemmed_words = [stemmer.stem(word) for word in words]
به آنچه در stemmed_words آمده است نگاهی بیندازید:
>>> stemmed_words
['the',
'crew',
'of',
'the',
'uss',
'discoveri',
'discov',
'mani',
'discoveri',
'.',
'discov',
'is',
'what',
'explor',
'do',
'.']
در اینجا برای همه کلماتی که با « discov » یا « Discov » شروع میشوند، آمده است:
کلمات اصلی به شرح زیر هستند:
- 'Discovery'
- 'discovered'
- 'discoveries'
- 'Discovering'
کلمه ریشهیابی شده به شرح زیر هستند:
- 'discoveri'
- 'discov'
- 'discoveri'
- 'discov'
این نتایج کمی متناقض به نظر میرسند، زیرا Discovery به شما discoveri میدهد در حالی که Discovering به شما discov میدهد.
بیشریشهیابی (Overstemming) و کمریشهیابی (Under Stemming) دو راهی هستند که میتوانند نتایج اشتباهی را به وجود آورند:
- کمریشهیابی، زمانی اتفاق میافتد که دو کلمه مرتبط باید به یک ریشه کاهش پیدا کنند، اما اینگونه نمیشود و یک حالت منفی کاذب به وجود میآورد.
- بیشریشهیابی زمانی اتفاق میافتد که دو کلمه نامرتبط به یک ریشه کاهش مییابند، حتی اگر نباید این اتفاق بیفتد که یک مثبت کاذب به وجود میآورد.
- قدمت الگوریتم ریشه پورتر (Porter stemming algorithm) به سال 1979 باز میگردد و طبیعی است که قدیمی باشد. Snowball stemmer که Porter2 نیز نامیده می شود، بهبود یافته نسخه اصلی است و از طریق NLTK نیز در دسترس است، بنابراین می توانید از آن در پروژه های خود استفاده کنید. همچنین، شایان ذکر است که هدف Porter stemmer تولید کلمات کامل نیست، بلکه یافتن اشکال مختلف یک کلمه است.
- خوشبختانه، شما راههای دیگری برای کاهش واژهها به معنای اصلیشان دارید، مانند واژهسازی که قدرت خوبی در این زمینه در اختیارتان قرار میدهد.
ماهنامه شبکه را از کجا تهیه کنیم؟
ماهنامه شبکه را میتوانید از کتابخانههای عمومی سراسر کشور و نیز از دکههای روزنامهفروشی تهیه نمائید.
ثبت اشتراک نسخه کاغذی ماهنامه شبکه
ثبت اشتراک نسخه آنلاین
کتاب الکترونیک +Network راهنمای شبکهها
- برای دانلود تنها کتاب کامل ترجمه فارسی +Network اینجا کلیک کنید.
کتاب الکترونیک دوره مقدماتی آموزش پایتون
- اگر قصد یادگیری برنامهنویسی را دارید ولی هیچ پیشزمینهای ندارید اینجا کلیک کنید.
نظر شما چیست؟