دسته بندی موجودیت های نام دار (Named Entity) – راهنمای کاربردی


شناسایی موجودیت های نام دار (Named Entity Recognition | NER) و دستهبندی آنها (Classification)، فرآیند تشخیص واحدهای اطلاعاتی مانند اسامی افراد، سازمانها و مکانها، و همچنین بیانات عددی از متن ساختارنیافته است. هدف از این کار توسعه روشهای کاربردی و مستقل از دامنه به منظور شناسایی موجودیتهای نامدار با صحت بالا به صورت خودکار است.
شناسایی و دستهبندی موجودیتهای نامدار (Named Entity Recognition and Classification | NERC) فرآیند تشخیص واحدهای اطلاعاتی مانند اسامی افراد، سازمانها، موقعیتها و بیانات ریاضی مانند زمان، تاریخ، پول و درصد در دادههای ساختارنیافته است. هدف از این کار توسعه روشهای کاربردی و مستقل از دامنه به منظور شناسایی موجودیتهای نامدار، با صحت بالا و به صورت خودکار محسوب میشود.
در مطلب «شناسایی موجودیت نام دار با NLTK و SpaCy -- راهنمای کاربردی»، مقدمهای بر NLTK و SpaCy، مفاهیم موجودیت نامدار و چگونگی تشخیص آن با استفاده از دو ابزار بیان شده، مورد بررسی قرار گرفت. اکنون، یک گام به جلوتر رفته و مدل یادگیری ماشین برای NER با استفاده از کتابخانه Scikit-Learn آموزش داده خواهد شد.
داده
دادههای مورد استفاده در اینجا مجموعه نوشتههای مهندسی ویژگی شده با تگهای IOB و POS هستند که در «Kaggle» (+) وجود دارند.
در تصویر زیر چند سطر اول این مجموعه داده مشهود است.
اطلاعات اساسی پیرامون موجودیتها:
- geo = Geographical Entity (موجودیت جغرافیایی)
- org = Organization (سازمان)
- per = Person (شخص)
- gpe = Geopolitical Entity (موجودیت ژئوپلتیکی)
- tim = Time indicator (شاخص زمانی)
- art = Artifact (مصنوعات)
- eve = Event (رویداد)
- nat = Natural Phenomenon (پدیده طبیعی)
IOB
«IOB» سرنامی برای عبارت «Inside–outside–beginning» است و یک روش تگ زنی متداول برای تگ زدن توکنها محسوب میشود.
- I: پیشوند پیش از آنکه تگ نشان دهد که درون یک بخش است.
- B: پیشوندی که نشان میدهد یک تگ آغاز یک بخش است.
- O: این تگ نشان میدهد که یک توکن متعلق به هیچ بخشی نیست (بیرون).
کل مجموعه داده در حافظه یک کامپیوتر جا نمیشود، بنابراین اولین ۱۰۰۰۰۰ رکورد آن را انتخاب کرده و از الگوریتمهای یادگیری حافظه خارجی (Out-of-core learning) به منظور «واکشی» (fetch) و پردازش دادهها استفاده میشود.
پیشپردازش دادهها
همانطور که پیشتر مشخص شد، مقادیر NaN زیادی در ستون «# Sentence» وجود دارند و بنابراین باید این سلولها را با مقادیر دیگری جایگزین کرد.
(4544, 10922, 17)
۴۵۴۴ جمله وجود دارد که شامل ۱۰۹۲۲ کلمه یکتا هستند و با ۱۷ تگ، برچسبگذاری شدهاند. این تگها به طور منظم توزیع نشدهاند.
کد زیر تاریخ متن را با استفاده از «DictVectorizer» (+) و سپس تقسیمبندی آن به دادههای «آموزش» (train) و «آزمون» (test) به بردار تبدیل میکند.
((67000, 15507), (67000,))
الگوریتمهای یادگیری حافظه خارجی
در ادامه برخی از الگوریتمهای حافظه خارجی که برای پردازش دادههای بسیار بزرگ در حافظه یک کامپیوتر طراحی شدهاند و از متد partial_fit استفاده میکنند، مورد آزمون قرار میگیرند.
پرسپترون (Perceptron)
به دلیل آنکه تگ «O» (سرنام outside) متداولترین تگ است و موجب میشود ک نتایج بسیار بهتر از آنچه واقعا هستند به نظر بیایند، هنگام ارزیابی سنجههای دستهبندی باید این تگ را حذف کرد.
دستهبندهای خطی با آموزش SGD
دستهبندی نایو بیز برای مدلهای چندجملهای
دستهبند تهاجمی منفعل (Passive Aggressive Classifier)
هیچ یک از دستهبندهای بالا نتایج قابل قبولی تولید نمیکنند. واضح است که هیچ چیز به آسانی دستهبندی موجودیتهای نام دار با استفاده از دستهبندهای متداول نیست ولی برای دریافت خروجی مناسب باید تلاش بیشتری کرد.
میدان تصادفی شرطی
«میدان تصادفی شرطی» (Conditional Random Field | CRF)، اغلب برای برچسبگذاری یا «تجزیه» (parsing) «دادههای متوالی» (Sequential Data) مانند پردازش زبان طبیعی مورد استفاده قرار میگیرد و در «برچسبگذاری اجزای کلام» (Part-of-speech tagging)، شناسایی موجودیتهای نامگذاری شده و دیگر موارد کاربرد دارد.
sklearn-crfsuite
یک مدل CRF برای شناسایی موجودیتهای نامدار با استفاده از sklearn-crfsuite روی مجموعه داده موجود، آموزش داده میشود.
کد زیر به منظور بازیابی جملات با POS و تگهای آنها مورد استفاده قرار میگیرد. (نکات لازم در این رابطه از اینجا (+) قابل مطالعه است.)
استخراج ویژگی
در این وهله، ویژگیهای بیشتری (بخشهای کلمه، تگهای POS ساده شده، فلگهای پایینتر/عنوان/بالاتر، ویژگیهای کلمات موجود در نزدیکی) استخراج و به فرمت sklearn-crfsuite تبدیل میشوند.
هر جمله باید به لیستی از احکام تبدیل شود. کد زیر از وبسایت رسمی sklearn-crfsuites (+) دریافت شده است.
جداسازی مجموعههای آموزش و آزمون
آموزش یک مدل CRF
ارزیابی
به نظر میرسد نتایج بهبود یافته است. بنابراین با استفاده از sklearn-crfsuite باید به اکتشافات بیشتری پرداخت.
دستهبند چه چیزی یاد گرفته؟
تفسیر: احتمال زیادی وجود دارد که شروع یک موجودیت جغرافیایی (beginning of a geographical entity | B-geo) با یک توکن درون موجودیت جغرافیایی (inside geographical entity | I-geo) دنبال شود. اما انتقال به داخل نام یک سازمان (inside of an organization | I-org) از توکنهایی با دیگر برچسبها دارای سختی زیادی است.
بررسی ویژگیهای وضعیت
مشاهدات
- 5.183603 B-tim word[-3]:day: مدل میآموزد که کلمهای که در نزدیکی قرار داشته «day» بوده، بنابراین توکن احتمالا بخشی از شاخص زمانی است.
- 3.370614 B-per word.lower():president: مدل میآموزد که توکن «president» احتمالا در ابتدای نام یک فرد قرار دارد.
- -3.521244 O postag:NNP: مدل میآموزد که اسامی خاص معمولا موجودیتها هستند.
- -3.087828 O word.isdigit(): ارقام، موجودیتهای احتمالی هستند.
- -3.233526 O word.istitle(): کلمات TitleCase موجودیتهای احتمالی هستند.
ELI5
ELI5 یک بسته پایتون است که امکان بررسی وزنهای مدلهای sklearn_crfsuite.CRF را میدهد.
بازبینی وزنهای مدل
مشاهدات
- این موضوع که I-entity باید B-entity را دنبال کند دارای معنا است، مثلا I-geo در اینجا B-geo را، I-org هم B-org را و I-per نیز B-per را دنبال میکند.
- میتوان مشاهده کرد که یک سازمان درست بعد از نام یک فرد بیاید (B-org -> I-per دارای وزن منفی بسیار بالایی است).
- مدل وزنهای منفی بزرگ را برای انتقال غیر ممکن مانند O -> I-geo ،O -> I-org و O -> I-tim میآموزد.
برای آسان شدن خواندن، میتوان تنها یک زیرمجموعه از تگها را بررسی کرد.
و یا صرفا برخی از ویژگیها برای همه تگها را مورد بررسی قرار داد.
کد کامل انجام این کار با استفاده از sklearn-crfsuite و ELI5 در گیتهاب (+) موجود است.
اگر مطلب بالا برای شما مفید بوده، آموزشهای زیر نیز به شما پیشنهاد میشود:
- مجموعه آموزشهای آمار، احتمالات و دادهکاوی
- مجموعه آموزشهای یادگیری ماشین و بازشناسی الگو
- گنجینه آموزشهای برنامه نویسی پایتون (Python)
- spaCy در پایتون — پردازش زبان طبیعی به صورت آسان
- مجموعه آموزشهای شبکههای عصبی مصنوعی
- مجموعه آموزشهای هوش محاسباتی
- آموزش برنامهنویسی R و نرمافزار R Studio
- مجموعه آموزشهای برنامه نویسی متلب (MATLAB)
^^
سلام ممنون از مطلب خوبتون.
کدی که در این صفحه قرار دادهاید برای متنهای فارسی هم کار میکند؟