پردازش متن فارسی در پایتون با کتابخانه هضم

فرض کنید هزاران پیام فارسی را از شبکههای اجتماعی جمعآوری کردهاید و حالا میخواهید پردازش سادهای روی این متنها انجام دهید؛ مثلاً میخواهید بدانید چند درصدِ این پیامها، درباره «کتاب» است. احتمالاً آسانترین راه این است که کلمه «کتاب» را بین این پیامها جستجو کنید و بر اساس آن، فراوانی کلمه را محاسبه کنید. اما اینجا مشکلی وجود دارد!

کلمه «کتاب» لزوماً به یک شکل نوشته نمیشود. کتاب، کتــــاب، ڪتاب، کتابـــ و … . از دید ماشین هر یک از این کلمات، جداست؛ در حالی که اینطور نیست.
اینجاست که پیشپردازش و نرمالسازی متن اهمیت پیدا میکند. نرمالسازی یعنی متن ورودی را که ممکن است به هر شکلی نوشته شده باشد به یک متن استاندارد و متحدالشکل تبدیل کنیم.
این یعنی حذف فاصلههای اضافه، اصلاح فاصلهها در پسوندها و پیشوندها، اصلاح فاصله در علائم نگارشی، تبدیل اعداد غیر فارسی به فارسی، استفاده از گیومه به جای کوتیشن، تبدیل حروف عربی و غیراستاندارد به حروف فارسی، حذف تکرارهای بیهوده حروف، حذف علائم و کاراکترهای بیفایده، اصلاح فاصله در ترکیب اعداد و کلمات و … .
اگر بخواهید همه این کارها را خودتان انجام دهید باید زمان زیادی را برای تشخیص حالات مختلف و کدنویسی برای هر یک از این حالتها صرف کنید.
اما راه آسانتری وجود دارد: کتابخانه هضم
هضم یک کتابخانه متنباز بر مبنای زبان پایتون برای پردازش متون فارسی است. تمام کارهای بالا را میتوانید با چند خط کد با کتابخانه هضم انجام دهید.
این متن را با کمک کتابخانه هضم تمیز میکنیم:
input = “””سلاممممم بچه ها
براي یادگیری و درك بهتر"پردازش زبـــــــــان طبیعی" ڪتاب خوبی سراغ دارید؟
از7شب دارم می گردم ؛ ولی کتاب خوبے پیدا نکردم... .
”””
normalizer = Normalizer()
output = normalizer.normalize(input)
print(output)
خروجی به صورت زیر خواهد بود:
«سلام بچهها برای یادگیری و درک بهتر «پردازش زبان طبیعی» کتاب خوبی سراغ دارید؟ از ۷ شب دارم میگردم؛ ولی کتاب خوبی پیدا نکردم … .»
در ادامه با قابلیتهای هضم، بیشتر آشنا میشویم:
تمیزکردن متن
هدف از تمیزکردن متن یا اصطلاحاً نرمالسازی، رفع نایکدستیها و متحدالشکل کردن متن، جهت آمادهسازی آن برای پردازشهای بعدی است. کتابخانه هضم توانایی بسیار خوبی در این بخش دارد.
>>> normalizer = Normalizer()
>>> normalizer.normalize('اِعلاممممم کَرد : « زمین لرزه ای به بُزرگیِ 6دهم ریشتر ...»')
'اعلام کرد: «زمینلرزهای به بزرگی ۶ دهم ریشتر …»'
استخراج جملات و کلمات
گاهی لازم است جملات یا کلمات متن را استخراج کنید. هضم میتواند این کار را به سادگی برای شما انجام دهد. حتی میتواند در هنگام استخراج جملات، مفاهیمی مثل هشتگ، ایمیل، عدد و لینک را هم علامت بگذارد.
>>> tokenizer = WordTokenizer()
>>> tokenizer.tokenize('این جمله (خیلی) پیچیده نیست!!!')
['این', 'جمله', '(', 'خیلی', ')', 'پیچیده', 'نیست', '!!!']
>>> tokenizer = WordTokenizer(join_verb_parts=False)
>>> print(' '.join(tokenizer.tokenize('سلام.')))
سلام .
>>> tokenizer = WordTokenizer(join_verb_parts=False, replace_links=True)
>>> print(' '.join(tokenizer.tokenize('در قطر هک شد https://t.co/tZOurPSXzi https://t.co/vtJtwsRebP')))
در قطر هک شد LINK LINK
>>> tokenizer = WordTokenizer(join_verb_parts=False, replace_ids=True, replace_numbers=True)
>>> print(' '.join(tokenizer.tokenize('زلزله ۴.۸ ریشتری در هجدک کرمان @bourse24ir')))
زلزله NUMF ریشتری در هجدک کرمان ID
>>> tokenizer = WordTokenizer(join_verb_parts=False, separate_emoji=True)
>>> print(' '.join(tokenizer.tokenize('دیگه میخوام ترک تحصیل کنم 😂😂😂')))
دیگه میخوام ترک تحصیل کنم 😂 😂 😂
ریشهیابی کلمات
با کتابخانه هضم میتوانید ریشه یا بن کلمات را پیدا کنید. مثلاً ریشه کلمه «کتابها»، «کتاب» است، یا در کلمه «میروم»، بن ماضی و مضارع به ترتیب «رفت» و «رو» است.
>>> lemmatizer = Lemmatizer()
>>> lemmatizer.lemmatize('کتابها')
'کتاب'
>>> lemmatizer.lemmatize('آتشفشان')
'آتشفشان'
>>> lemmatizer.lemmatize('میروم')
'رفت#رو'
>>> lemmatizer.lemmatize('گفته_شده_است')
'گفت#گو'
>>> lemmatizer.lemmatize('نچشیده_است')
'چشید#چش'
>>> lemmatizer.lemmatize('مردم', pos='N')
'مردم'
>>> lemmatizer.lemmatize('اجتماعی', pos='AJ')
'اجتماعی'
برچسبگذاری کلمات
شاید لازم باشد فعلها، اسمها، صفتها و دیگر ساختهای زبانی را استخراج کنید. این کار نیز با کمک هضم امکانپذیر است.
>>> posTagger = POSTagger(model = 'pos_tagger.model')
>>> posTagger.tag(tokens = ['من', 'به', 'مدرسه', 'ایران', 'رفته_بودم', '.'])
[('من', 'PRON'), ('به', 'ADP'), ('مدرسه', 'NOUN,EZ'), ('ایران', 'NOUN'), ('رفته_بودم', 'VERB'), ('.', 'PUNCT')]
قطعهبندی
گاهی در برخی از جملات مثل «رئیس جمهور ایران به نیویورک سفر کرد.»، عبارت «رئیس جمهور ایران»، در ظاهر سه کلمه است ولی در حقیقت یک واحد معنایی است. کتابخانه هضم امکان استخراج این گروههای معنایی را نیز دارد.
>>> chunker = Chunker(model = 'chunker.model')
>>> tree = chunker.parse(sentence = [('نامه', 'NOUN,EZ'), ('ایشان', 'PRON'), ('را', 'ADP'), ('دریافت', 'NOUN'), ('داشتم', 'VERB'), ('.', 'PUNCT')])
>>> print(tree)
(S
(NP نامه/NOUN,EZ ایشان/PRON)
(POSTP را/ADP)
(VP دریافت/NOUN داشتم/VERB)
./PUNCT)
تجزیه نحو وابستگی
در نهایت، تجزیهگر نحو وابستگی، با تحلیل ساختار نحوی یک جمله و یافتن کلمات مرتبط، روابط بین کلمات و گروههای معنایی را نشان میدهد.
>>> from hazm import POSTagger, Lemmatizer, DependencyParser
>>> parser = DependencyParser(tagger=POSTagger(model='pos_tagger.model'), lemmatizer=Lemmatizer())
>>> parser.parse(['من', 'به', 'مدرسه', 'رفته بودم', '.']).tree().pprint()
(من (به (مدرسه (رفته_بودم .))))
نمونهای از خروجی تجزیهگر عمقی که برای درک بهتر به شکل نمودار ترسیم شده است:
بازنمایی واژهها و جملات
با استفاده از بازنمایی واژهای هضم میتوانید شبکههای عمیق را با سهولت بیشتری برای کاربردهای زبانی دلخواه خود آموزش دهید. همچنین با استفاده از بازنمایی جملهای میتوانید شباهت میان متون را بسنجید.
>>> wordEmbedding = WordEmbedding(model_type = 'fasttext')
>>> wordEmbedding.load_model('word2vec.bin')
>>> wordEmbedding.doesnt_match(['سلام' ,'درود' ,'خداحافظ' ,'پنجره'])
'پنجره'
>>> wordEmbedding.doesnt_match(['ساعت' ,'پلنگ' ,'شیر'])
'ساعت'
خواندن آسان پیکرههای متنی
پیکرههای متنی، دادههایی هستند که در شکلها و قالبهای مختلفی عرضه میشوند مانند پیکره ویکیپدیا، همشهری، پرسیکا، میراث و … . هر یک از این پیکرهها در ساختار و قالب متفاوتی عرضه میشوند که در نبود کتابخانه هضم باید برای خواندن هر یک از آنها اسکریپت جدایی بنویسید. با کتابخانه هضم بهراحتی میتوانید بیشتر پیکرههای مهم فارسی را با چند خط کد بخوانید.
>>> mirastext = MirasTextReader(filename='mirastext.txt')
>>> next(mirastext.texts())[:42] # first 42 characters of fitst text
'ایرانیها چقدر از اینترنت استفاده میکنند؟'
برای استفاده از این کتابخانه، کسب اطلاعات بیشتر یا مشارکت در توسعه پروژه به صفحه گیتهاب هضم مراجعه کنید.