پردازش زبان طبیعی در پایتون (بخش دوم)
اهداف این بخش
چطور می تونیم با برنامه نویسی مطالب رو پردازش کنیم
چطور می تونیم به طوری خودکار کلید واژه ها و یک متن را خلاصه کنیم
چه ابزار های در پایتون این امر و فرایند رو برای ما محیا می کنند
چالش های جالب در پردازش زبان چی هستند؟
متون و کلمات
همه ما با متن اشنا هستیم و روزانه با اون سرو کار داریم .متن در اینجا به عنوان یک داده خام و برنامه به دستکاری و آنالیز اون میپردازه.اما قبلش بهتر با پایتون بیشتر اشنا شویم
بعد از اینکه از سایت پایتون برنامه رو برای پلتفرم خودتون دانلود و نصب می کنید .یک محیط برنامه نویسی در پایتون برای شما با نام IDLE ایجاد و نصب میشه. که وقتی اون رو اجرا میکنید یکسری اطلاعات بهتون داده میشود
که شامل شماره نسخه تاریخ و حتی میتونید با تایپ copyright اطلاعات بیشتری رو دریافت کنید
بهتر که علامت >>> رو جدی بگیرید جون هر چی رو که اینجا بنویسد و با زدن دکمه Enter اجرا میشه.من خیلی دوستش دارم چون که فکر می کنم خوشکل و یه جورایی منو یاد داس میندازه.شایدم کاملا بی ربط باشه بگذریم اولین کد که می خواهیم اجرا کنیم یه محاسبات عددی است بعنوان مثال وقتی این عبارت رو جلوش می نویسیم و بعد Enter حاصل عبارت رو به ما نشون میده
اما اگر خطی رو که مینویسم شامل خطا باشد به ما اعلام میکنه که کد وارد شده معتبر نیست و جزیئات خطا را نیز در خطوط بعدی به نمایش میگذارد
اما بریم سراغ کتاخانه معرف nltk که در بخش قبل توضیحاتی دربارش داده شده و بعد از اینکه این کتابخانه رو دانلود و نصب کردید می تونید با استفاده از دو خط زیر اون رو وارد پایتون کنید و به تمامی پکیج ها و شرکت ها و مجموعه کتابش رو دانلود و به اونها دسترسی پیدا کنید.
در پنجره ای که باز میشه شما میتونید هرانچه که نیاز دارید و یا همه رو دانلود کنید. که بعنوان مثال من book رو دانلود کردم.
گام بعدی اینکه با دستوری تمامی متون داخل book رو بارگذاری کنیم که بعد از تایپ اون مطالب بارگذاری میشن
همون طوری که مشاهده می کنید ما تونستیم با این دستور from ntlk.book import * کتاب ها رو در text1, text2, … ,text9 بارگذاری کنیم.
بعنوان مثال اگر بزنیم text1 به ما نمایش میدهد.
جستجوی کلمه
راه های زیادی برای بررسی کردن یک متن وجود دارد. Concordance یا تطابق ، رخ داد یک کلمه به همراه برخی از محتوا را نمایش میدهد.در اینجا ما کلمه هیولا monstrous در متن یک Moby Dick by را بررسی کرده ایم.
توی خط اول نوشته که 11 مورد یافت شده است.
تطابق یا همون concordance اجازه میده که ما کلمه رو در متن ببینم.
اما تعداد واژکان یا کلمات داخل متن را می توانیم با دستور len پیدا کنیم
260819 تعداد کلمات ، سمبل ها و یا توکن ها می باشد.توکن یک رشته از کاراکترا می باشد که حالا می تونه یک کلمه و یایک سمبل باشد.وقتی که ما len را صدا میزنیم تعداد توکن ها به ما اعلام می شود و توکن های تکرار نیز شمارش می شوند.اما اگر بخواهیم فقط توکن های یونیک شمارش شود از دستور set استقاده میکنیم
دستور set توکن های و یا کلمات موجود بدون تکرار لیست می کند
دستور sorted هم که مشخصه دیکه مرتب میکنه اول علام و اعداد بعد هم بترتیب حروف الفبا لیست می کند
پس اگر بخواهیم غنی بودن یک متن نسبت به کلماتش بدونیم این کار رو انجام میدیم
در صورتی که بخواهید تعداد تکرار یک کلمه را بدست بیاوریم از Count استفاده میکنیم
خوب الان می خواهیم همین کلمات رو روی یک نمودار ببینم و اینکه چطور در متن بخش شده اند
ابتدا لازم که بسته matplotlib رو نصب کنیم
محل قرار گیری این دو کلمه و یا کاراکتر در متن را به نمایش می گذارد
می توانیم درصد تکرار یک کلمه در متن رو هم بدست بیاوریم
خوب حالا با توجه به موارد با می توانیم یک تابع تعریف کنیم و نسبت یکتا بودن کلمات به کل متن رو به ما بدهد.منظوم از یکتا بودن این هست که در یک من مثل چندین با کلمه "wind" بکار میرد ولی ما فقط می خواهیم این کلمه رو یک بار بشماریم و حالا می خواهیم بدونیم چه نسبتی بین این کلمات در کل متن است. بزارید مثالی بزنم.
"This chapter continues to present programming concepts by example, in the context of a linguistic processing task. We will wait until later before exploring each Python construct systematically. Don't worry if you see an example that contains something unfamiliar; simply try it out and see what it does, and — if you're game — modify it by substituting some part of the code with a different text or word. This way you will associate a task with a programming idiom, and learn the hows and whys later."
متن بالا شامل 87 کلمه میباشد
'This', 'chapter', 'continues', 'to', 'present', 'programming', 'concepts', 'by', 'example,', 'in', 'the', 'context', 'of', 'a', 'linguistic', 'processing', 'task.', 'We', 'will', 'wait', 'until', 'later', 'before', 'exploring', 'each', 'Python', 'construct', 'systematically.', "Don't", 'worry', 'if', 'you', 'see', 'an', 'example', 'that', 'contains', 'something', 'unfamiliar;', 'simply', 'try', 'it', 'out', 'and', 'see', 'what', 'it', 'does,', 'and', '—', 'if', "you're", 'game', '—', 'modify', 'it', 'by', 'substituting', 'some', 'part', 'of', 'the', 'code', 'with', 'a', 'different', 'text', 'or', 'word.', 'This', 'way', 'you', 'will', 'associate', 'a', 'task', 'with', 'a', 'programming', 'idiom,', 'and', 'learn', 'the', 'hows', 'and', 'whys', 'later
اما تنها 67 کلمه یکتا دارد که در برخی از انها در متن تکرار شده اند
'linguistic', 'hows', 'try', 'code', 'substituting', 'word.', 'context', 'until', 'different', 'in', 'if', 'Python', 'something', 'out', 'construct', 'programming', 'what', 'example', 'it', 'concepts', 'We', 'later', 'simply', 'modify', 'will', 'example,', 'that', 'task', 'does,', 'systematically.', 'This', 'part', 'wait', 'whys', 'associate', 'exploring', 'or', 'text', 'to', "Don't", 'some', 'a', 'later.', 'see', 'an', 'the', 'you', 'task.', 'contains', 'with', 'way', 'continues', 'game', 'each', 'chapter', '—', 'idiom,', 'and', "you're", 'present', 'of', 'processing', 'before', 'by', 'unfamiliar;', 'worry', 'learn'}
خوب پس نسبت غنی بودن را میتوان به این صورت بدست اورد 87/67
برای اینکه بتوان نسبت غنی بودن هر یک از text1 , text2 , …text9 بالا را بدست اورد برای استفاده مکرر از دستوریک تابع تعریف میکنم به نام lexical_diversity که وظیفه بدست اوردن نسبت را دارد.
و اکنون تابع را اجرا میکنیم.
پس هرچه عدد ما به یک نزدیک تر باشد . نسب کلمات به کل متن غنی تر میباشد. و از تکرار کلمات جلوگیری شده است.
لازم به ذکر که این فقط یه بازی هست قطعا برای غنی بودن باید به موارد از جمله طول هر متن نیز توجه کرد.
خوب تابع دیگری رو می نویسیم که در اون هر کلمه چند درصد متن خودش رو تشکیل داره به عبارتی اگر a چهار بار در یک متن 10 کلمه ای تشکیل شده است پس 100*4/10
در بخش بعد نگاهی نزدیکتر داریم پایتون در زمینه متن و لیست کلمات.