شناسایی موجودیت نام دار با NLTK و SpaCy – راهنمای کاربردی


«شناسایی موجودیت نام دار» (Named entity recognition | NER) یکی از اولین گامها در فرآیند استخراج اطلاعات است که منجر به شناسایی و دستهبندی موجودیتهای دارای نام در متن، به دستههای از پیش تعریف شده مانند اسامی افراد، سازمانها، مکانها، بیان زمانها، مقادیر، ارزشهای پولی، درصدها و دیگر موارد میشود. NER در زمینههای گوناگون «پردازش زبان طبیعی» (Natural Language Processing | NLP) کاربرد دارد و میتواند در پاسخگویی به بسیاری از پرسشهای جهان واقعی مانند مواردی که در زیر بیان شده کمک کند.
- کدام سازمانها در مقالات خبری مورد اشاره قرار گرفتهاند؟
- از چه محصولاتی در نقد و بررسیها نام برده شده است؟
- آیا اسامی افراد در توییتها آورده شده؟ آیا توییت در برگیرنده موقعیت جغرافیایی فرد است؟
در این مقاله چگونگی ساخت شناساگر موجودیتهای نامدار با «NLTK» (سرنامی برای عبارت Natural Language Toolkit) و «SpaCy» به منظور شناسایی اسامی نهادهایی که دارای نام هستند، مانند افراد، سازمانها یا موقعیتها در متن خام شرح داده شده است. اما پیش از آغاز کار دو ابزار بیان شده معرفی میشوند.
NLTK
«NLTK» سرنامی برای عبارت Natural Language Toolkit است. این عنوان برای اشاره به مجموعهای از کتابخانهها و برنامههای نوشته شده برای پردازش زبان طبیعی سمبلیک و آماری برای زبان انگلیسی به کار برده میشود که به «زبان برنامهنویسی پایتون» (Python Programming Language) نوشته شدهاند.
این ابزار توسط «استیون بِرد» (Steven Bird) و «ادوارد لوپر» (Edward Loper) در دپارتمان علوم کامپیوتر و اطلاعات «دانشگاه پنسیلوانیا» (University of Pennsylvania) ساخته و توسعه داده شده است. NLTK شامل ارائههای گرافیکی و دادههای نمونه (sample data) میشود. این جعبه ابزار با کتابی که مفاهیم نهفته در پس وظایف پردازش زبان طبیعی پشتیبانی شده توسط این ابزار را تشریح میکند و یک کتاب راهنما همراه است.
SpaCy
«SpaCy» یک کتابخانه نرمافزاری «متنباز» (open source) برای پردازش زبان طبیعی پیشرفته محسوب میشود که به زبانهای برنامهنویسی «پایتون» (Python) و «سایتون» (Cython) نوشته شده است. این کتابخانه تحت گواهینامه MIT منتشر شده و در حال حاضر دارای مدلهای شبکه عصبی آماری برای زبانهای انگلیسی، آلمانی، اسپانیایی، پرتغالی، فرانسوی، ایتالیایی، هلندی و شناسایی موجودیتهای نامدار چند زبان و توکنسازی بسیاری از زبانهای دیگر است.
برخلاف NLTK که به طور گسترده برای آموزش و پژوهش مورد استفاده قرار میگیرد، spaCy بر فراهم کردن نرمافزارهایی برای استفادههای تولیدی تاکید دارد. نسخه ۱.۰ spaCy از جریانهای کاری «یادگیری عمیق» نیز پشتیبانی میکند که امکان اتصال مدلهای آموزش دیده شده با کتابخانههای یادگیری ماشینی مانند «تنسورفلو» (TensorFlow)، «کِراس» (Keras)، «سایکیت لِرن» (Scikit-learn) یا «پای تُرچ» (PyTorch) را فراهم میکند. کتابخانه یادگیری ماشین spaCy با نام «Thinc» به عنوان یک کتابخانه پایتون مجزا نیز موجود است.
ایمپورت کردن کتابخانهها
برای ایمپورت کردن کتابخانه NLTK از قطعه کد زیر استفاده میشود:
استخراج اطلاعات
در ادامه، از جمله زیر که از نیویورک تایمز برداشته شده برای شرح مبحث استفاده میشود.
European authorities fined Google a record $5.1 billion on Wednesday for abusing its power in the mobile phone market .and ordered the company to alter its practices.
اکنون، «توکنسازی کلمات» (word tokenization) و تگ کردن «اقسام کلمه» «part of speech» صورت میپذیرد.
سپس، خروجی قطعه کد بالا مورد بررسی قرار میگیرد.
یک لیست از تاپلهای حاوی کلمات مجزا در جملات و قسم کلمه آنها دریافت میشود. اکنون، بخشبندی «گروه اسمی» (noun phrase) به منظور شناسایی موجودیتهای نامدار با استفاده از عبارت باقاعده حاوی قواعدی که نشان میدهد جمله چگونه باید بخشبندی شود پیادهسازی میشود.
بخشبندی برای شناسایی موجودیت نامدار
با استفاده از این الگو، یک تجزیهکننده بخش ساخته و روی جمله تست میشود.
خروجی به صورت یک درخت یا سلسله مراتب با S در سطح اول و ادامه جمله قابل خواندن است.
تگهای IOB راه استاندارد برای ارائه ساختار بخشها داخل فایلها هستند و به فرمت زیر نیز قابل استفاده محسوب میشوند.
در این ارائه، یک توکن در هر خط با تگ قسم کلمه و تگ موجودیت نامدار خود وجود دارد. برپایه این واحد آموزش، میتوان یک تگکننده ساخت که برای برچسبگذاری جملات جدید مورد استفاده قرار بگیرد و از تابع ()nltk.chunk.conlltags2tree برای تبدیل توالی تگها در یک درخت بخش استفاده شود. تابع ()nltk.ne_chunk میتواند موجودیتهای نامدار را با استفاده از یک دستهبند شناسایی و دستهبندی برچسبهای دستهها مانند ORGANIZATION ،PERSON و GPE را اضافه کند.
«گوگل» (google) به عنوان یک شخص شناسایی شده و این واقعا ناامید کننده است.
استفاده از SpaCy
شناساگر موجودیت نامدار SpaCy بر فراز «OntoNotes 5» (+) آموزش داده شده و نوع موجودیتهای ارائه شده در زیر را پشتیبانی میکند.
موجودیت
در اینجا نیز از همان جمله «European authorities fined Google a record $5.1 billion on Wednesday for abusing its power in the mobile phone market and ordered the company to alter its practices» استفاده میشود. به عنوان یکی از نقاط قوت Spacy میتوان به این نکته اشاره کرد که یک بار اعمال NLP کافی است.
«European» یک NORP (ملت یا مذهب یا گروه سیاسی)، «Google» یک «سازمان»، «$5.1 billion» یک «مقدار پول» و «Wednesday» یک شی «تاریخ» است.
توکن
در طول مثال بالا، کار در سطح موجودیت انجام شده است.
در مثال پیش رو، تفسیر در سطح توکن برای موجودیتها با استفاده از شمای تگگذاری BILUO به منظور توصیف مرزهای موجودیت انجام میشود.
«B» بدین معنا است که توکن یک موجودیت را شروع کرده، «I» یعنی توکن درون یک موجودیت است، «O» یعنی توکن خارج از موجودیت محسوب میشود و "" یعنی هیچ تگ موجودیتی تنظیم نشده است.
استخراج موجودیت نامدار از یک مقاله
اکنون در مسالهای جدیتر و شبیهتر به مسائل جهان واقعی، موجودیتهای نامدار یکی از مقالات جدید نیویورک تایمز با عنوان «F.B.I. Agent Peter Strzok, Who Criticized Trump in Texts, Is Fired» (+) استخراج میشوند.
188 موجودیت در مقاله وجود دارد و این موجودیتها با ۱۰ برچسب یکتا نمایش داده شدهاند.
در ادامه سه تا از مکررترین موجودیتها مشخص شدهاند.
اکنون یک جمله به صورت تصادفی انتخاب میشود تا مساله شفافتر باشد.
در این وهله به منظور تولید نشانهگذاری خام، «displacy.render» باید اجرا شود.
یکی از مواردی که به اشتباه دستهبندی شده FBI است. با استفاده از «displaCy visualizer» (+) توکار spaCy، جمله بالا و وابستگیهای آن نمایش داده میشوند.
اکنون، به صورت کلمه به کلمه (verbatim)، قسم کلمه استخراج و این جمله مرتبسازی میشود.
استخراج موجودیتهای نامدار به جز «F.B.I»، برای کلیه موارد صحیح است.
در نهایت، موجودیت کل مقاله تعیین میشود.
کد کامل این مطلب در گیتهاب (+) موجود است.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- spaCy در پایتون — پردازش زبان طبیعی به صورت آسان
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- مجموعه آموزشهای هوش محاسباتی
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
^^
سلام
اگر بخواهیم به جای ex از یک دیتاست که در گوگل درایو داریم استفاده کنیم، چطوری باید این دیتاست را به sent بدهیم؟؟؟
با سلام؛
از همراهی شما با مجله فرادرس سپاسگزاریم. اینکه مجموعه داده چه ساختاری دارد، شامل سطرها و ستونها و محتوای آن ها، در اصلاحاتی که باید روی کد انجام شود، تاثیرگذار است. در حالت کلی، در صورتی که تمایل بر آن باشد که ورودی به صورت فایل به برنامه داده شود، بهتر است آن را در یکی از فرمتهای مرسوم مانند CSV ذخیره کرد. اما نباید فراموش کرد در صورت استفاده از فایل، باید در برنامه بخشی را به بحث پیشپردازش و فعالیتهای مربوط به آن تخصیص داد. همچنین، کل کد را برای خواندن و پردازش سطرها و ستونهای آن مجموعه داده تغییر داد. کدی که در اینجا ارائه شده قالبی کلی از کد و پردازشهای مورد نیاز برای شناسایی موجودیت نامدار را به تصویر میکشد و برای مسائل پیچیدهتر، ضمن حفظ کلیت و ذات کار، نه تنها نیاز به اصلاح کد که نیاز به اصلاح کل فرایند است.