از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون برای NLP: بخشهایی از برچسبگذاری گفتار و شناسایی موجودیت نامگذاری شده
سرفصلهای مطلب
این چهارمین مقاله از سری مقالات من است روی پایتون برای NLP. در مقاله قبلی خود توضیح دادم که چگونه فضایی کتابخانه را می توان برای انجام کارهایی مانند واژگان و تطبیق عبارت استفاده کرد.
در این مقاله قسمت هایی از برچسب گذاری گفتار و شناسایی موجودیت نامگذاری شده را به طور مفصل بررسی خواهیم کرد. خواهیم دید که چگونه می توان از کتابخانه spaCy برای انجام این دو کار استفاده کرد.
برچسبگذاری بخشهای گفتار (POS).
بخشهایی از برچسبگذاری گفتار صرفاً به اختصاص دادن بخشهایی از گفتار به تک تک کلمات در یک جمله اشاره دارد، به این معنی که برخلاف تطبیق عبارت، که در سطح جمله یا چند کلمهای انجام میشود، بخشهایی از برچسبگذاری گفتار در سطح نشانه انجام میشود.
بیایید یک مثال بسیار ساده از بخش هایی از برچسب گذاری گفتار را در نظر بگیریم.
import spacy
sp = spacy.load('en_core_web_sm')
طبق معمول، در فیلمنامه بالا ما import مدل اصلی spaCy انگلیسی. در مرحله بعد، باید یک سند spaCy ایجاد کنیم که از آن برای انجام بخشهایی از برچسبگذاری گفتار استفاده میکنیم.
sen = sp(u"I like to play football. I hated it in my childhood though")
شیء سند spaCy دارای چندین ویژگی است که می توان از آنها برای انجام کارهای مختلف استفاده کرد. به عنوان مثال، به print متن سند، text
ویژگی استفاده می شود. به طور مشابه، pos_
ویژگی تگ POS دانه درشت را برمی گرداند. برای به دست آوردن تگ های POS ریز دانه، می توانیم از آن استفاده کنیم tag_
صفت. و در نهایت برای دریافت توضیح یک تگ میتوانیم از spacy.explain()
روش و نام تگ را برای آن ارسال کنید.
بیایید این را در عمل ببینیم:
print(sen.text)
اسکریپت بالا به سادگی متن جمله را چاپ می کند. خروجی به شکل زیر است:
I like to play football. I hated it in my childhood though
بعد، بیایید ببینیم pos_
صفت. ما خواهیم کرد print تگ POS کلمه “متنفر” که در واقع هفتمین نشانه در جمله است.
print(sen(7).pos_)
خروجی:
VERB
می توانید ببینید که تگ POS بازگشتی برای “متنفر” یک “VERB” است زیرا “متنفر” یک فعل است.
حالا وقته print برچسب POS ریز برای کلمه “متنفر”.
print(sen(7).tag_)
خروجی:
VBD
برای اینکه ببینیم VBD به چه معناست، می توانیم استفاده کنیم spacy.explain()
روشی که در زیر نشان داده شده است:
print(spacy.explain(sen(7).tag_))
خروجی:
verb, past tense
خروجی نشان می دهد که VBD یک فعل در زمان گذشته است.
اجازه دهید print متن، تگ های POS درشت دانه، تگ های POS ریز دانه، و توضیح برچسب ها برای همه کلمات در جمله.
for word in sen:
print(f'{word.text:{12}} {word.pos_:{10}} {word.tag_:{8}} {spacy.explain(word.tag_)}')
در اسکریپت بالا، خوانایی و قالب بندی را با افزودن 12 فاصله بین متن و تگ POS درشت دانه و سپس 10 فاصله دیگر بین تگ های POS درشت دانه و تگ های POS ریز دانه بهبود می دهیم.
خروجی:
I PRON PRP pronoun, personal
like VERB VBP verb, non-3rd person singular present
to PART TO infinitival to
play VERB VB verb, base form
football NOUN NN noun, singular or mass
. PUNCT . punctuation mark, sentence closer
I PRON PRP pronoun, personal
hated VERB VBD verb, past tense
it PRON PRP pronoun, personal
in ADP IN conjunction, subordinating or preposition
my ADJ PRP$ pronoun, possessive
childhood NOUN NN noun, singular or mass
though ADP IN conjunction, subordinating or preposition
آ لیست کامل برچسب برای بخشهای گفتار و تگهای ریزدانه به همراه توضیحات آنها در اسناد رسمی spaCy موجود است.
چرا تگ کردن POS مفید است؟
برچسب گذاری POS می تواند واقعا مفید باشد، به خصوص اگر کلمات یا نشانه هایی دارید که می توانند چندین برچسب POS داشته باشند. به عنوان مثال، بسته به زمینه، کلمه “google” را می توان هم به عنوان اسم و هم به عنوان فعل استفاده کرد. هنگام پردازش زبان طبیعی، شناسایی این تفاوت مهم است. خوشبختانه، کتابخانه spaCy با الگوریتمهای یادگیری ماشینی از پیش ساخته شده است که بسته به زمینه (کلمات اطراف)، میتواند تگ POS صحیح را برای کلمه بازگرداند.
بیایید این را در عمل ببینیم. اسکریپت زیر را اجرا کنید:
sen = sp(u'Can you google it?')
word = sen(2)
print(f'{word.text:{12}} {word.pos_:{10}} {word.tag_:{8}} {spacy.explain(word.tag_)}')
در اسکریپت بالا سند spaCy را با متن “آیا می توانید آن را در گوگل جستجو کنید؟” ایجاد می کنیم. در اینجا کلمه “google” به عنوان یک فعل استفاده می شود. بعد، ما print تگ POS برای کلمه “google” به همراه توضیح برچسب. خروجی به شکل زیر است:
google VERB VB verb, base form
از خروجی می بینید که کلمه google به درستی به عنوان یک فعل شناسایی شده است.
حال بیایید نمونه دیگری را ببینیم:
sen = sp(u'Can you search it روی google?')
word = sen(5)
print(f'{word.text:{12}} {word.pos_:{10}} {word.tag_:{8}} {spacy.explain(word.tag_)}')
در اینجا در اسکریپت بالا از کلمه “google” به عنوان اسم استفاده می شود همانطور که در خروجی نشان داده شده است:
google PROPN NNP noun, proper singular
پیدا کردن تعداد تگ های POS
شما می توانید تعداد دفعات هر تگ POS را با تماس گرفتن پیدا کنید count_by
روی شی سند spaCy. روش طول می کشد spacy.attrs.POS
به عنوان مقدار پارامتر
sen = sp(u"I like to play football. I hated it in my childhood though")
num_pos = sen.count_by(spacy.attrs.POS)
num_pos
خروجی:
{96: 1, 99: 3, 84: 2, 83: 1, 91: 2, 93: 1, 94: 3}
در خروجی می توانید شناسه تگ های POS را به همراه فرکانس وقوع آنها مشاهده کنید. متن تگ POS را می توان با ارسال شناسه تگ به واژگان سند واقعی spaCy نمایش داد.
for k,v in sorted(num_pos.items()):
print(f'{k}. {sen.vocab(k).text:{8}}: {v}')
اکنون در خروجی، ID، متن و فرکانس هر تگ را مطابق شکل زیر مشاهده خواهید کرد:
83. ADJ : 1
84. ADP : 2
91. NOUN : 2
93. PART : 1
94. PRON : 3
96. PUNCT : 1
99. VERB : 3
تجسم بخشی از تگ های گفتار
تجسم تگ های POS به صورت گرافیکی بسیار آسان است. این displacy
ماژول از spacy
برای این منظور از کتابخانه استفاده می شود. برای تجسم تگ های POS در داخل Jupyter notebook، باید تماس بگیرید render
روش از displacy
ماژول و آن را به سند فضایی، سبک تجسم، و تنظیم کنید jupyter
نسبت به True
همانطور که در زیر نشان داده شده است:
from spacy import displacy
sen = sp(u"I like to play football. I hated it in my childhood though")
displacy.render(sen, style='dep', jupyter=True, options={'distance': 85})
در خروجی باید درخت وابستگی زیر را برای تگ های POS مشاهده کنید.
شما به وضوح می توانید وابستگی هر توکن را ببینید روی دیگری به همراه تگ POS.
اگر می خواهید تگ های POS را در خارج از آن تجسم کنید Jupyter notebook، سپس باید با شماره تماس بگیرید serve
روش. طرح تگ های POS به شکل HTML در مرورگر پیش فرض شما چاپ می شود. اسکریپت زیر را اجرا کنید:
displacy.serve(sen, style='dep', options={'distance': 120})
پس از اجرای اسکریپت بالا، پیام زیر را مشاهده خواهید کرد:
Serving روی port 5000...
Using the 'dep' visualizer
برای مشاهده درخت وابستگی، آدرس زیر را در مرورگر خود تایپ کنید: http://127.0.0.1:5000/. درخت وابستگی زیر را خواهید دید:
به نام Entity Recognition
شناسایی موجودیت نامگذاری شده به شناسایی کلمات در یک جمله به عنوان یک موجودیت اشاره دارد، به عنوان مثال نام یک شخص، مکان، سازمان، و غیره. بیایید ببینیم چگونه کتابخانه spaCy شناسایی موجودیت نامگذاری شده را انجام می دهد. به اسکریپت زیر نگاه کنید:
import spacy
sp = spacy.load('en_core_web_sm')
sen = sp(u'Manchester United is looking to sign Harry Kane for $90 million')
در اسکریپت بالا یک سند spaCy ساده با مقداری متن ایجاد کردیم. برای یافتن موجودیت نامگذاری شده می توانیم از ents
ویژگی، که لیستی از تمام موجودات نامگذاری شده در سند را برمی گرداند.
print(sen.ents)
خروجی:
(Manchester United, Harry Kane, $90 million)
می بینید که سه نهاد نامگذاری شده شناسایی شدند. برای مشاهده جزئیات هر موجودیت نامگذاری شده، می توانید از text
، label
، و spacy.explain
متدی که شی entity را به عنوان پارامتر می گیرد.
for entity in sen.ents:
print(entity.text + ' - ' + entity.label_ + ' - ' + str(spacy.explain(entity.label_)))
در خروجی، نام موجودیت را به همراه نوع موجودیت و شرح کوچکی از موجودیت مطابق شکل زیر مشاهده خواهید کرد:
Manchester United - ORG - Companies, agencies, institutions, etc.
Harry Kane - PERSON - People, including fictional
$90 million - MONEY - Monetary values, including unit
می بینید که “منچستریونایتد” به درستی به عنوان یک سازمان، شرکت و … شناسایی شده است، به همین ترتیب “هری کین” به عنوان یک فرد و در نهایت “90 میلیون دلار” به درستی به عنوان موجودی از نوع مانی شناسایی شده است.
افزودن موجودیت های جدید
همچنین می توانید موجودیت های جدیدی را به یک سند موجود اضافه کنید. به عنوان مثال در مثال زیر، “Nesfruita” توسط کتابخانه spaCy به عنوان یک شرکت شناسایی نشده است.
sen = sp(u'Nesfruita is setting up a new company in India')
for entity in sen.ents:
print(entity.text + ' - ' + entity.label_ + ' - ' + str(spacy.explain(entity.label_)))
خروجی:
India - GPE - Countries, cities, states
از خروجی می بینید که فقط هند به عنوان یک موجودیت شناسایی شده است.
اکنون برای افزودن “Nesfruita” به عنوان موجودی از نوع “ORG” به سند خود، باید مراحل زیر را انجام دهیم:
from spacy.tokens import Span
ORG = sen.vocab.strings(u'ORG')
new_entity = Span(sen, 0, 1, label=ORG)
sen.ents = list(sen.ents) + (new_entity)
اول، ما نیاز داریم import را Span
کلاس از spacy.tokens
مدول. در مرحله بعد، باید مقدار هش the را بدست آوریم ORG
نوع نهاد از سند ما. پس از آن، باید مقدار هش را تعیین کنیم ORG
به دهانه از آنجایی که “Nesfruita” اولین کلمه در سند است، فاصله 0-1 است. در نهایت، باید دامنه جدید موجودیت را به لیست موجودیت ها اضافه کنیم. حال اگر اسکریپت زیر را اجرا کنید، در لیست موجودیت ها «نسفرویتا» را خواهید دید.
for entity in sen.ents:
print(entity.text + ' - ' + entity.label_ + ' - ' + str(spacy.explain(entity.label_)))
خروجی اسکریپت بالا به شکل زیر است:
Nesfruita - ORG - Companies, agencies, institutions, etc.
India - GPE - Countries, cities, states
موجودیت های شمارش
در مورد تگهای POS، میتوانیم با استفاده از روش خاصی تعداد تگهای POS را در یک سند بشماریم. sen.count_by
. با این حال، برای موجودیت های نامگذاری شده، چنین روشی وجود ندارد. ما می توانیم به صورت دستی فرکانس هر نوع موجودیت را بشماریم. فرض کنید سند زیر را به همراه موجودیت های آن داریم:
sen = sp(u'Manchester United is looking to sign Harry Kane for $90 million. David demand 100 Million Dollars')
for entity in sen.ents:
print(entity.text + ' - ' + entity.label_ + ' - ' + str(spacy.explain(entity.label_)))
خروجی:
Manchester United - ORG - Companies, agencies, institutions, etc.
Harry Kane - PERSON - People, including fictional
$90 million - MONEY - Monetary values, including unit
David - PERSON - People, including fictional
100 Million Dollars - MONEY - Monetary values, including unit
برای شمارش اشخاص تایپ شده در سند بالا، میتوانیم از اسکریپت زیر استفاده کنیم:
len((ent for ent in sen.ents if ent.label_=='PERSON'))
در خروجی، 2 را مشاهده خواهید کرد زیرا 2 موجودیت از نوع PERSON در سند وجود دارد.
تجسم موجودیت های نامگذاری شده
مانند تگهای POS، میتوانیم موجودیتهای نامگذاری شده را نیز در داخل آن مشاهده کنیم Jupyter notebook و همچنین در مرورگر.
برای انجام این کار، ما دوباره از displacy
هدف – شی. به مثال زیر نگاه کنید:
from spacy import displacy
sen = sp(u'Manchester United is looking to sign Harry Kane for $90 million. David demand 100 Million Dollars')
displacy.render(sen, style='ent', jupyter=True)
میبینید که تنها تفاوت بین تجسم موجودیتهای نامگذاری شده و تگهای POS این است که در اینجا در مورد موجودیتهای نامگذاری شده، ما ارسال کردیم. ent
به عنوان ارزش برای style
پارامتر. خروجی اسکریپت بالا به شکل زیر است:
از خروجی میبینید که موجودیتهای نامگذاری شده با رنگهای مختلف به همراه انواع موجودیتهایشان برجسته شدهاند.
همچنین میتوانید انواع موجودیتها را برای نمایش فیلتر کنید. برای انجام این کار، باید نوع موجودات را برای نمایش در یک لیست ارسال کنید، که سپس به عنوان یک مقدار به ents
کلید یک فرهنگ لغت فرهنگ لغت سپس به آن منتقل می شود options
پارامتر از render
روش از displacy
ماژول مطابق شکل زیر:
filter = {'ents': ('ORG')}
displacy.render(sen, style='ent', jupyter=True, options=filter)
در اسکریپت بالا مشخص کردیم که فقط موجودیت های نوع ORG باید در خروجی نمایش داده شوند. خروجی اسکریپت بالا به شکل زیر است:
در نهایت، میتوانید موجودیتهای نامگذاری شده را نیز در خارج از آن نمایش دهید Jupyter notebook. اسکریپت زیر موجودیت های نامگذاری شده را در مرورگر پیش فرض شما نمایش می دهد. اسکریپت زیر را اجرا کنید:
displacy.serve(sen, style='ent')
حالا اگر به آدرس مراجعه کنید http://127.0.0.1:5000/ در مرورگر خود، باید موجودیت های نامگذاری شده را ببینید.
نتیجه
بخشهایی از برچسبگذاری گفتار و شناسایی موجودیت نامگذاری شده برای موفقیت هر کار NLP بسیار مهم است. در این مقاله دیدیم که چگونه میتوان از کتابخانه spaCy پایتون برای انجام برچسبگذاری POS و شناسایی موجودیت نامگذاری شده با کمک مثالهای مختلف استفاده کرد.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-24 00:35:03