پردازش متن

پردازش متن در اصل روش ها و عمل جستجو ، جابجایی (تعویض) و تجزیه متن و نوشته هایی با منطق و ساختاری معمولا پیچیده می باشد .در این مبحث ما قصد داریم متن هایی را به عنوان ورودی دریافت کرده و اعمال مختلفی بر روی آن آنجام دهیم . این مبحث یکی از مهمترین بحث های برنامه نویسی می باشد و در زمینه های بسیاری کاربرد دارد . در ساده ترین حد از تجزیه و دریافت پاراامتر های ورودی خط فرمان گرفته تا تکنولوژی هایی طراحی کامپایلر ها ، XML و ... کارایی فراوانی دارد . هدف اساسی و اصلی این بخش آشنایی و کار با الگوی منظم و با قاعده یا Regular Expression می باشد . یک الگوی منظم یک بیان فشرده و با قاعده برای توصیف و مشخص کردن الگو و طرح های پیچیده در یک متن می باشد . برنامه نویس با استفاده از یک الگو منظم می تواند الگو های یکسان و منطبق بر آن در متن را جستجو کرده و سپس اعمالی چون ویرایش ، حذف ، تعویض و ... را پیاده سازی نماید . شما حتما قبلا نیز از الگو های منظم در برنامه نویسی یا ابزار های مختلف استفاده کرده اید . برای مثال در دستورات سیستمی چون ls , dir , grep و ... از انواع بسیار ساده الگوهای منظم استفاده می گردد . زمانی که شما بجای چندین کاراکتر از نشان ستاره (*) و بجای یک کاراکتر از علامت سوال (؟) استفاده می کنید در حقیقت یک الگوی منظم و باقاعده را به دستور ارسال می نمایید . پایتون یکی از قوی ترین زبانهای موجود در زمینه پردازی متن می باشد . امکانات و سهولت استفاده از آن باعث سهولت برنامه نویسی شده و امکان ایجاد برنامه هایی بسیار قدرتمند و سریع را فراهم می آورد . ناگفته نماند که مبحث پردازش متن و کار با الگو های منظم Regular Expression می تواند بسیار پیچیده و گیج کننده باشد . ولی با تمرین و مطالعه و استفاده از آن قابل فهم تر بنظر خواهد رسید .

در پایتون برای پردازش حرفه ای متن ماژولی با نام re موجود می باشد . این ماژول توابع و امکانات بسیار قدرتمندی را فراهم می نماید که در ادامه فصل به توضيح مفصل هر یک پرداخته خواهد شد . اما در کنار این ماژول و در محدوده بسیار کوچکتری نیز می توانید پردازش های ساده ای را بر روی متن انجام دهید . کلاس رشته توابعی را برای این کار فراهم می نماید . همانطور که در درس های پیشین فراگرفتید می توان با استفاده از توابع و متد های وابسته به کلاس رشته اعمالی چون جستجو (index , find و count) ، جابجایی متن (replace) و تجزیه (split)‌ را انجام داد . اما این توابع برای اعمال ساده می باشد و در حد حرفه ای و پیچیده جوابگوی نیاز ما نمی باشند . استفاده و یادگیری این توابع بسیار آسان تر از الگوهای منظم می باشد و کد های نوشته شده نیز خوانایی بالایی خواهند داشت .


معایب توابع عضو کلاس رشته و مقایسه با الگو های منظم

فرض کنید قصد داریم سفارش برنامه ای را دریافت کرده ایم . هدف این برنامه تصحیح نحوه آدرس دهی اسامی خیابانهای یک شهر می باشد . قبلا در پایگاه داده مربوط به اطلاعات یک شهر از اسامی چون ROAD استفاده می شد که اکنون قصد داریم طول آنها را کم کرده و از حروف اختصاری به جای کلمه اصلی استفاده کنیم . برای مثال بجای Road از RD . ابتدا این برنامه را با استفاده از متد های عضو کلاس رشته می نویسیم .

>>> s = '100 NORTH MAIN ROAD'
>>> s.replace('ROAD', 'RD.')
'100 NORTH MAIN RD.'

برنامه بدرستی کار می کند و ظاهرا اهداف ما را دقیقا انجام می دهد . آدرس دیگری را امتحان می کنیم .

>>> s = '100 NORTH BROAD ROAD'
>>> s.replace('ROAD', 'RD.')
'100 NORTH BRD. RD.'

این بار در آدرس اصلی از کلمه استفاده شده که کاراکتر های Road به همان ترتیب در آن وجود دارد و برنامه بدون توجه به این موضوع آدرس را تغییر می دهد . برنامه را طوری تغییر می دهیم که اگر کلمه آخر (۴ کاراکتر) عبارت Road باشد آن را تغییر دهد .

>>> s[:−4] + s[−4:].replace('ROAD', 'RD.')
'100 NORTH BROAD RD.'

برنامه جدید بدرستی کار خواهد کرد و مشکل مطرح شده رخ نخواهد داد . اما کد برنامه بسیار ناخوانا شده و درک دلیل استفاده از اعداد کمی مبهم می باشد . اگر بخواهیم از الگوی پیچیده تری استفاده کنیم کد ها ناخواناتر خواهد شد و نیز مستعد بروز خطا . اکنون همین برنامه را با استفاده از الگو های منظم پیاده سازی می کنیم .

>>> import re
>>> re.sub('ROAD$', 'RD.', s)
'100 NORTH BROAD RD.'


کد برنامه بسیار خواناتر از مثال قبل می باشد . علامت $ نشان دهنده خاتمه یک خط (انتهای رشته و احتمالا شروع خط بعدی) می باشد . پس الگوی $ROAD زمانی با کلمه ROAD برابر خواهد بود که این کلمه به عنوان آخرین کلمه یک رشته باشد .

شاید هنوز این سوال مطرح باشد که با روشی کمی سخت تر همین انجام عمل قابل اجرا توسط توابع عضو کلاس رشته امکان پذیر می باشد . با مطرح کردن مثالی دیگر حالت پیچیده تری از حالت های موجود را مطرح می کنیم . می دانیم اگر آخرین ۴ کاراکتر رشته ROAD باشد باید با RD جابجا شود . فرض کنید آدرس ما '100 BROAD' باشد ! برنامه نوشته شده بر اساس الگو های منظم نیز باعث تغییر ناصحیح آدرس خواهد شد . برنامه را به صورت زیر تغییر می دهیم .

>>> re.sub(r'\bROAD$', 'RD.', s)
'100 BROAD'

در حقیقت ما بدنبال کلمه منفرد ROAD هستیم و این عبارت نباید جزو یک کلمه دیگر باشد . پس کاراکتر قبل از آن باید یک فضای خالی باشد . پس به الگوی خود عبارت b\ را اضافه می کنیم . این عبارت نشانگر یک فضای خالی می باشد و مخفف شده blank space می باشد . نکته دیگر که در این مثال قابل ذکی می باشد استفاده از معرف ویژه r قبل از شروع الگوی منظم می باشد . چون ما قصد استفاده از یک کاراکتر بک اسلش (\) در داخل متن خود داریم یا باید از معرف r قبل از شروع رشته الگو استفاده کنیم یا باید دو بک اسلش پشت سر هم را بکار ببریم . معرف r نشانگر این نکته می باشد که رشته بعد از آن یک رشته معمولی نبوده بلکه یک الگوی منظم می باشد . پس کاراکتر های موجود در آن چون بک اسلش با منطق دیگری مورد پردازش قرار می گیرد .


صفحه قبلی: پایتون
صفحه بعدی: PyGTK