پردازش متن به عنوان یکی از زیرحوزه های فعال هوش مصنوعی، سابقه ای دیرینه در زبان فارسی دارد و آزمایشگاه های مختلفی در دانشگاه ها و سازمانها برای پردازش متن شکل گرفته اند که آزمایشگاه پردازش متن و زبان طبیعی دانشگاه تهران و آزمایشگاه فناوری وب دانشگاه فردوسی و کارگروه خط و زبان فارسی در شورای عالی اطلاع رسانی از جمله این تلاشهاست.با وجود انجام کارهای مختلف توسط اساتید و محققین کشور اما همچنان این حوزه ، متولی خاصی در کشور ندارد و بسیاری از مقالات و یافته های علمی ، جنبه عملی و کاربرد وسیع پیدا نکرده است .
وب سایت مهندسی داده، قصد دارد تا با زبانی ساده ، مفاهیم حوزه متن کاوی و پردازش متن را با تکیه بر متون فارسی و ارائه مثالهای عملی به مخاطبین ارائه کند. در این سلسله آموزش ها، با محوریت قرار دادن زبان ساده و محبوب پایتون و کتابخانه های قدرتمند این زبان مانند NLTK و استفاده از کتابخانه های مخصوص زبان فارسی موجود مانند هضم ، کار پیش خواهد رفت .
برای شروع ابتدا مفاهیم و اصطلاحات و ابزاری که در ادامه آموزش به کار خواهیم برد را مرور می کنیم : (مرجع : آزمایشگاه وب دانشگاه فردوسی)
براي انجام بسياري از عمليات خودکار بر روي زبانها مانند ترجمه، خلاصهسازي، تصحيح املا و غيره، نيازمند يکسري ابزارهايي جهت پيشپردازش و آمادهسازي متون هستيم. تهيه اين ابزارها به دو صورت انجام ميشود. دسته اول روشهاي وابسته به زبان هستند که براساس برخي قوانين نحوي و ساختاري زبان انجام ميشوند. روشهاي ديگر مستقل از زبان هستند و بيشتر براساس پيکرههاي زباني و با استفاده روشهاي يادگيري ماشين صورت ميگيرد. البته در برخي موارد ترکيبي از هر دو روش مورد استفاده قرار ميگيرد. از اينرو طراحي و پياده سازي اين ابزارها براي زبانهاي مختلف به طرق مختلف و مخصوص زبان مربوطه صورت ميگيرد.
مهمترین ابزارهای پردازش زبان طبیعی در متون عبارتند از:
تاکنون مدل ها و روش های زیادی برای برچسب گذاری در زبان های مختلف استفاده شده است. بعضی از این روش ها عبارتند از:
- مدل مخفی مارکوف (Markov Hidden Model)
- برچسب گذاری مبتنی بر تبدیل یا قانون (Transformation/Rule -based tagger)
- سیستم های مبتنی بر حافظه (Memory-basedSystem
- سیستم های ماکزیمم آنتروپی (Maximum Entropy System)
یکی دیگر از روش های کاری برای ایجاد این ابزار، ایجاد یک rule base که معمولاً به صورت دستی تشکیل می شود، برای تشخیص نوع کلمه است. از نونه های فارسی آن می توان به ابزار آزمایشگاه آقای دکتر بیجن خان، و ابزار آزمایشگاه فناوری وب دانشگاه فردوسی مشهد اشاره کرد. از نمونه های انگلیسی آن می توان به Illinois Part Of Speech Tagger و Stanford POS Tagger اشاره کرد.
البته برای متون فارسی ، ما نیاز به انجام نرمالسازی واژگان هم داریم تا متون ما قبل از پردازش، یکدست و بدون اشکال گردند . توضیحات کاملتر آن به شرح زیر است .
نرمالسازی متن
در ابتدا بایستی همهی نویسههای (کاراکترهای) متن با جایگزینی با معادل استاندارد آن، یکسانسازی گردند. در اولین گام باید متون برای استفاده در گامهای بعدی به شکلی استاندارد درآیند. از آنجایی که متون مختلف ممکن است بسیار به هم شبیه باشند اما به دلیل تفاوتهای ساده ظاهری از نظر ماشین متفاوت باشند؛ به همین دلیل سعی شده است این تفاوتهای سادهی ظاهری برطرف گردد. همچنین اصلاحات دیگری نیز به منظور پردازش دقیقتر متون در این مرحله صورت میگیرد.
در اولین گام باید متون برای استفاده در گامهای بعدی به شکلی استاندارد درآیند. از آنجایی که متون مختلف ممکن است بسیار به هم شبیه باشند اما به دلیل تفاوتهای ساده ظاهری از نظرماشین متفاوت باشند؛ به همین دلیل سعی شده است این تفاوتهای سادهی ظاهری برطرف گردد. برای رسیدن به این هدف، قبل از مقایسه متون، پیشپردازشهایی روی آنها آنجام میشود. طبیعتا هر چه این پیشپردازشها قویتر باشد، نتایج حاصل ازمقایسه متون قابل اطمینانتر خواهد بود. لازم به ذکر است که از آن جایی که زبان فارسی جزو زبانهای غیر ساختیافته است با مشکلات بسیار بیشتری نسبت به سایر زبانها مواجه خواهیم شد. متون غیرساختیافته، متونی هستند که پیش فرض خاصی در مورد قالب آنها نداریم و آنها را به صورت مجموعهای مرتب از جملات در نظر میگیریم.
در ابتدا بایستی همه ی نویسههای (کاراکترهای) متن با جایگزینی با معادل استاندارد آن یکسانسازی گردند. در پردازش رسم الخط زبان فارسی، با توجه به قرابتی که با رسم الخط عربی دارد، همواره در تعدادی از حرفها مشکل وجود دارد که از جمله آنها میتوان به حروف “ک”، “ی”، همزه و … اشاره نمود. در اولین گام باید مشکلات مربوط به این حروف را برطرف ساخت. علاوه بر این، اصلاح و یکسان سازی نویسهی نیمفاصله و فاصله در کاربردهای مختلف آن و همچنین حذف نویسهی «ـ» که برای کشش نویسههای چسبان مورد استفاده قرار میگیرد و مواردی مشابه برای یکسانسازی متون، از اقدامات لازم قبل از شروع فازهای مختلف میباشد. در این فاز مطابق با یک سری قاعده دقیق و مشخص، فاصله ها و نیمفاصله های موجود در متن برای علاماتی نظیر “ها” و “ی” غیرچسبان در انتهای لغات و همچنین پیشوندها و پسوندهای فعلساز نظیر “می”، “ام”، “ایم”، “اید” و موارد مشابه جهت استفاده در فازهای بعدی، اصلاح میگردند.
برخی از این اصلاحات در ذیل آورده شده است:
- اصلاح انواع حرف «ک» به معادل فارسی آنان.
- اصلاح انواع حرف «ی» به معادل فارسی آنان.
- بررسی همزه و انواع مختلف املاهای موجود و اصلاح هر کدام (به عنوان مثال تبدیل ؤ به و ، ئ به ی ، أ به ا ، إ به ا و…)
- حذف شناسهی همزه از انتهای واژههایی مثل شهداء
- حذف شناسه «آ» به «ا» مانند: آب به اب
- اصلاح نویسهی «طور» در واژههایی مانند به طور، آن طور، این طور و …
- بررسی وجود حرف «ی» در انتهای لغاتی مانند خانهی ما و اصلاح آنان
- حذف تشدید از واژهها
- تبدیل ارقام عربی و انگلیسی به معادل فارسی.
- اصلاح نویسهی نیمفاصله
- اصلاح اعراب و حذف فتحه، کسره و ضمه و همچنین تنوینها
- حذف نیمفاصلههای تکراری
- حذف نویسهی «ـ» که برای کشش نویسههای چسبان مورد استفاده قرار میگیرد. مانند تبدیل«بــــــــر» و «بـــر» به «بر»
- چسباندن پسوندهای «تر»، «ترین» و … به آخر واژهها
- اصلاح فاصلهگذاری «ها» در انتهای واژهها و همچنین پسوندهای «های»، «هایی»، «هایم»، «هایت»، «هایش» و …
- اصلاح فاصلهگذاری «می»، «نمی»، «درمی»، «برمی»، «بی» در ابتدای واژهها
- تبدیل «ة» به «هی»
- تبدیل «ب» متصل به ابتدای واژهها به «به»
- اصلاح فاصلهگذاری پسوندها
- حذف فاصلهها و نیمفاصلههای اضافه بکار رفته در متن
- تصحیح فاصلهگذاری در مورد علائم سجاوندی بدین صورت که علائم سجاوندی به لغات قبل از خود میچسبند و با لغت بعد از خود فاصله خواهند داشت.
برای اعمال اصلاحات اولیه قبل از هر عملیاتی، بایستی متون مورد پردازش توسط ابزار Normalizer ، مورد اصلاح قرار گیرند. بعد از نرمال سازی متن، معمولا ایست واژه ها را هم کلمات پرتکرار هستند را برای تعدادی از کاربردها باید حذف کنیم .
ایست واژه ها یا Stop Words: ایست واژه ها کلماتی هستند که با وجود تکرار فراوان در متن دارای اهمیت کمی از نظر معنایی می باشند. از جمله این کلمات در فارسی می توان به “اگر”، “و”، “ولی”، “که” و غیره اشاره کرد. در نگاه اول تصور بر این است که فقط کلمات ربط و تعریف ایست واژه هستند ولی بسیاری از افعال، افعال کمکی، اسمها، قید ها و صفات نیز به عنوان ایست واژه شناخته شده اند. در اغلب عملیات متن کاوی با حذف این کلمات نتیجه پردازش به شدت بهبود می یابد و سبب کاهش بار محاسباتی و افزایش سرعت می شود. برای زبان فارسی نیز چند لیست ایست واژه ایجاد شده که به طور میانگین دارای ۵۰۰ کلمه می باشند.
برای ادامه مباحث آموزشی از کتابخانه هضم و NLTK استفاده خواهیم کرد و به ترتیب، مفاهیم پایه پردازش متن را با انجام مثالهایی عملی مرور خواهیم نمود .
بد نیست نگاهی اجمالی به امکانات اولیه کتابخانه هضم بیندازیم :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | >>> from __future__ import unicode_literals >>> from hazm import * >>> normalizer = Normalizer() >>> normalizer.normalize('اصلاح نويسه ها و استفاده از نیمفاصله پردازش را آسان مي كند') 'اصلاح نویسهها و استفاده از نیمفاصله پردازش را آسان میکند' >>> sent_tokenize('ما هم برای وصل کردن آمدیم! ولی برای پردازش، جدا بهتر نیست؟') ['ما هم برای وصل کردن آمدیم!', 'ولی برای پردازش، جدا بهتر نیست؟'] >>> word_tokenize('ولی برای پردازش، جدا بهتر نیست؟') ['ولی', 'برای', 'پردازش', '،', 'جدا', 'بهتر', 'نیست', '؟'] >>> stemmer = Stemmer() >>> stemmer.stem('کتابها') 'کتاب' >>> lemmatizer = Lemmatizer() >>> lemmatizer.lemmatize('میروم') 'رفت#رو' >>> tagger = POSTagger(model='resources/postagger.model') >>> tagger.tag(word_tokenize('ما بسیار کتاب میخوانیم')) [('ما', 'PRO'), ('بسیار', 'ADV'), ('کتاب', 'N'), ('میخوانیم', 'V')] >>> chunker = Chunker(model='resources/chunker.model') >>> tagged = tagger.tag(word_tokenize('کتاب خواندن را دوست داریم')) >>> tree2brackets(chunker.parse(tagged)) '[کتاب خواندن NP] [را POSTP] [دوست داریم VP]' >>> parser = DependencyParser(tagger=tagger, lemmatizer=lemmatizer) >>> parser.parse(word_tokenize('زنگها برای که به صدا درمیآید؟')) |
فایل wtlab Section 2-4 در آزمایشگاه فناوری وب دانشگاه فردوسی را نیز توصیه می کنم حتما مشاهده کنید.
پی نوشت :
به همت کافه آی تی ، سلسله کارگاه هایی در حوزه متن کاوی فارسی برگزار شده است که برخی از ویدئوهای این کارگاه را می توانید در زیر مشاهده نمائید :
- متن کاوی در وب فارسی-۱
- متن کاوری در وب فارسی-۲
- متن کاوری در وب فارسی – ۳
- متن کاوی در وب فارسی – نشست دوم – ۱
- متن کاوی در وب فارسی – نشست دوم -۲
- متن کاوی در وب فارسی – نشست دوم -۳
در ادامه این سری مقالات و برای جمع آوری دادگان فارسی از وب سایتها، به بخش دوم این آموزش در این آدرس مراجعه کنید.
مقاله پیش بینی احساس مثبت یا منفی کاربران سایت IMDB از طریق پردازش متن را هم از دست ندهید ….
آقا مطالب شما واقعاَ ارزشمنده.
هیچ منبع فارسی مثل شما وجود نداره که اینقدر خوب مباحث دانش داده رو پوشش داده باشه.
با آرزوی سلامتی
سلام دوست عزیز
من یه مشکلی دارم
متن فارسی رو برای من تو \ایتون اینطوری میاره
مثلا این کد خروجی زیر رو داره
from __future__ import unicode_literals
from hazm import sent_tokenize, word_tokenize
word_tokenize(‘حمید’)
[u’\u062d\u0645\u06cc\u062f’]
خب من الان این رو چه کنم؟
تو متن بالا و تمام جاهایی که توضیح دادن راحت نوشته شده که باید در خروجی حمید بیاد اما برای من اینطوریه
من \ایتون ۲٫۷٫۱۲ و لینوکس مینت دارم.
ممنون
با سلام. در صورتی که از پایتون ۳ استفاده کنید این مشکل وجود نخواهد داشت.
ولی اگر مایل به استفاده از پایتون ۲ هستید میتوانید عناصر لیست خروجی را استخراج کرده و آنها را چاپ کنید که به شکل یونیکد چاپ خواهند شد و فقط هنگام چاپ شدن (با دستور print) میتوانید محتوای آن را به شکل فارسی ببینید:
sentence = “حمید به مدرسه رفت.”
tokens = word_tokenize(sentence)
print tokens
for token in tokens:
print token
خروجی print اول:
[u’\u062d\u0645\u06cc\u062f’, u’\u0628\u0647′, u’\u0645\u062f\u0631\u0633\u0647′, u’\u0631\u0641\u062a’, u’.’]
خروجی print دوم:
حمید
به
مدرسه
رفت
.
با سلام میخواستم بدونم چطور یه متن را برای پردازش میتونم در پایتون بارگذاری کنم بدون اینکه متن را تایپ کنم؟
سلام و وقت بخیر
ممنون بابت زحمتی که برای آماده سازی این متن کشیدید فقط سوال اینکه این مطلب بخش دومش آماده شده؟ متاسفانه روی سایت نتونستم پیداش کنم و چون تاریخ مطلب برای بیش از دو سال پیش هست برام سوال شده
در جواب امیر:
http://www.bigdata.ir/1395/03/%D9%BE%D8%B1%D8%AF%D8%A7%D8%B2%D8%B4-%D9%85%D8%AA%D9%88%D9%86-%D8%A7%D8%B3%D8%AA%D8%AE%D8%B1%D8%A7%D8%AC-%D9%85%D8%AA%D9%86-%D8%A7%D8%B2-%D9%88%D8%A8-%D8%B3%D8%A7%DB%8C%D8%AA/
سلام
من یه مشکلی دارم
از پایتون ۳٫۶ استفاده میکنم و پوشه ی resource هم درست کردم و tagger و parser model هارو در اون قرار دادم اما این ارور میاد
from wapiti import Model
ImportError: cannot import name ‘Model’
باید چی کار کنم؟؟!!
سلام…ممنون بابت مطلب مفیدتون…من زمان استفاده از هضم در ژوپیتر به مشکل می خورم و نمی دونم مشکلش چی هست…هضم رو ، روی پایتون نصب کردم..اما باز پیام خطا میده.وقتی از پایتون به طور مستقیم در صفحه داس استفاده می کنم این مشکل رو نداره اما تو ژوپیتر پیام خطا میده..میخوام از ژوپیتر استفاده کنم چون قابلیت پشتیبانی از زبان فارسی رو داره…لطفا راهنماییم کنید..ممنون
—————————————————————————
ModuleNotFoundError Traceback (most recent call last)
<ipython-input-5-ce071eab08ce> in <module>()
—-> 1 from hazm import *
ModuleNotFoundError: No module named ‘hazm’