در مقاله قبلی به معرفی و نصب ابزارهای پیش نیاز برای انجام پروژه ها، پایتون و parsivar پرداختیم حال در این آموزش قصد داریم قابلیتهای مختلف این کتابخانه یعنی پارسی ور را مرور کنیم. کدهای این آموزش در این آدرس قرار میگیرند. قبل از شروع ابتدا یک مرحله مهم در پردازش زبان طبیعی یعنی “پیش پردازش داده” را تعریف میکنیم. فرآیند تبدیل داده خام، به فرمتی که برای ماشین خوانا و قابل درک باشد. برای انجام هر فعالیت مرتبط با لازم است متون ابتدا تمیز شده و پیش پردازش میشوند.
مراحل پیش پردازش معمولا ثابت بوده و شامل مواردیست که در این آموزش به مرور ابتدا تعریف شده و سپس نحوه استفاده از آن در پارسی ور بررسی میشود.
پیش پردازش متون شامل موارد زیر است:
- نرمال سازی متن
- تبدیل متن به جملات(Sentence Segmentation)
- تبدیل جملات به کلمات(Tokenization)
- ریشه یابی(Stemming)
- Lemmatization
- تشخیص نقش کلمات (Part-of-speech Tagging)
- قطعهبندی (Chunker)
- پارسر یا تجزیهگر جملات
- تصحیح خطای املایی (Spell Correction)
در هر پروژه معمولا برخی از موارد بالا استفاده میشوند. در این مقاله قسمت اول از لیست بالا آموزش داده میشود و در مقاله بعدی موارد بعدی بررسی خواهند شد.
نرمال سازی
- در فرآیند نرمالسازی میخواهیم همه متون استاندارد و یکپارچه شوند. برای مثال
- تبدیل اعداد انگلیسی به فارسی 1 به 1
- حذف اسپیسها و فضاهای خالی اضافی مثل “سلام خوبی” به “سلام خوبی”
- حذف تشدید از کلمات(چون تشدید مخصوص زبان عربی است)
- و موارد مختلفی دیگری که بسته به نیاز هر پروژه باید روی متن اعمال شود تا متون همه یکدست شوند.
ابتدا برای استفاده از کتابخانه پارسی ور باید آنرا فراخوانی کنیم.


سپس برای نرمال سازی(استانداردسازی) متن یک شی از کلاس Normalizer میسازیم.


یک متغیر رشتهای با نام دلخواه ایجاد کرده و آن را با یک متن دلخواه مقداردهی میکنیم. متن استفاده شده در کد به صورت زیر است.
“به گزارش ایسنا سمینار شیمی آلی از امروز ۱۱ شهریور ۱۳۹۶ در دانشگاه علم و صنعت ایران آغاز به کار کرد. این سمینار تا ۱۳ شهریور ادامه مییابد.”


در اینجا تابع normalizer از شی My_Normalizer را صدا زده و متغیرمان را به عنوان آرگومان ارسال میکنیم.


خروجی به صورت زیر است.


مواردی که اصلاح شدند:
- شامل تبدیل ارقام فارسی به انگلیسی
- ایجاد فاصله بین نقطه و کاراکترهای اطرافش
- تبدیل فاصله به نیم فاصله
یک قابلیت جالب Normalizer استخراج تاریخ از متن است. کافی است مقدار date_normalizing_needed را True کرده و به عنوان آرگومان ارسال کنیم.


دوباره تابع Normalizer را صدا زده و متغیرمان را به عنوان آرگومان ارسال میکنیم.


و خروجی تاریخهایی که داخل متن وجود داشتهاند را به روز، ماه، سال تبدیل کرده است.


یک قابلیت دیگر Normalizer تبدیل کلمات فینگلیش به فارسی است. کافی است مقدار pinglish_conversion_needed را True کرده و به عنوان آرگومان ارسال کنیم.


دوباره تابع normalizer را صدا زده و متغیرمان را به عنوان آرگومان ارسال میکنیم و نتیجه به صورت زیر است.


Sentence Segmentation
فرآیندی که طی آن یک متن به تعدادی جمله تقسیم میشود. معیار تقسیم بندی معمولا علائم تمام کننده جمله مثل”.!؟” است.
در Parsivar برای استفاده از این قابلیت ابتدا کلاس Tokenizer را Import میکنیم.


سپس از کلاسTokenizer یک شی میسازیم.


حال از تابع tokenize_sentences کمک گرفته و متن نرمال شده را به عنوان آرگومان ارسال میکنیم.(بهتر است ابتدا متن نرمال شود و سپس به جملات تبدیل شود)


نتایج در متغیر Sents ذخیره میشود.


همینطور که قابل مشاهده است متن اصلی به تعدادی جمله تبدیل شده است.
Tokenization
به فرآیندی که طی آن جمله به یکسری واژه (توکن) تبدیل میشود. در parsivar برای استفاده از این قابلیت کافی است تابع Tokenize_Words از شی My_Tokenizer را فراخوانی کنیم.


خروجی شامل یکسری واژه است.


ریشه یابی(Stemming)
فرآیندی که طی آن ریشه یک واژه به دست میآید. مثل “کتابها” که دارای ریشه “کتاب” است یا “میخوردن” که دارای ریشه “خورد#خور” است. در فرآیند Stemming، برای بدست آوردن ریشه، یکسری گامها به ترتیب انجام می شوند و در اصطلاح برای آن الگوریتم تعریف میشود برای مثال ابتدا پیشوند حذف شود. در گام بعدی به سراغ پسوندها میروند و گامهای بعدی به همین صورت. ضعف جدی این روش گاها تولید ریشه بی معنی است مثلا ریشه “بشارت دادم” که ممکن است “ب” به عنوان پیشوند در نظر گرفته و نتیجه غلط شود. برای زبان انگلیسی معمولا از الگوریتم پورتر استفاده میکنند ولی متاسفانه برای زبان فارسی الگوریتم قابل اعتمادی توسط زبان شناسان ارائه نشده است.
Lemmatization
Stemming و Lemmatization هر دو یک کار یکسان ولی به روش مختلف انجام میدهند. Lemmatization شبیه به این است که با دیدن یک کلمه، به سراغ دایره المعارف رفته و بررسیهای لازم را انجام داده و یک کلمه را به عنوان ریشه بر میگردانیم. مزیت این روش تولید نشدن کلمات نامربوط به عنوان ریشه است. البته سرعت این روش نسبت به Stemming پایین تر است چون باید جستجو انجام شود.
parsivar فقط از قابلیت Stemming پشتیبانی می کند. برای استفاده از این قابلیت ابتدا کلاس FindStems را import میکنیم.


سپس یکی شی از FindStems میسازیم.


در نهایت کلمه مورد نظر را به تابع Convert_to_stem از شی My_stemmer میفرستیم.


چون “میروم” یک فعل است خروجی باید به صورت بنهای ماضی یا مضارع باشد.


برای تست بیشتر کد زیر اجرا شد.


به طور کلی نتایج قابل قبول است. ولی در تشخیص برخی از افعال و جمع مکسر مشکل دارد.
در این مقاله آموزشی ابتدا مراحل مختلف پیش پردازش متون را معرفی کرده و بخش اول از آن را به کمک کتابخانه پارسی ور پیاده سازی کردیم در مقاله آموزشی بعدی قسمت دوم پیش پردازشها را به کمک پارسی ور پیاده سازی میکنیم.
دانلود این مقاله آموزشی
3 دیدگاه
بابک کریمی
مفید بود..با تشکر
Mohammad
سلام خسته نباشید .
تا جایی که یادمه parsivar یه متد داشت که میشد باهاش جملات غیر رسمی و به اصطلاح محاوره ای رو به رسمی تبدیل کنه . اما یادم نیس اسمش چی بود!!! نت هم گشتم پیدا نکردم متاسفانه. میشه راههنمایی کنید ؟ و اگه امکانش هس به ایمیلم بفرستید کدشو ؟ ممنون میشم . خیلی بهش نیاز دارم .
آرزو محمدزاده
درود بر شما
به نقل از مهندس دهقانی
تا جایی که بنده با ابزار پارسی ور کار کردم، چنین قابلیتی نداشته ولی یکی از ابزارهایی که در زمینه تبدیل متون محاوره به رسمی روی متون فارسی وجود دارد از لینک زیر قابل دسترسی است https://demo.text-mining.ir/Home/FormalConverter