وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

پایتون برای NLP: بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده

0 5
زمان لازم برای مطالعه: 8 دقیقه


این چهارمین مقاله از سری مقالات من است روی پایتون برای 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 مشاهده کنید.

پایتون برای NLP: بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده

شما به وضوح می توانید وابستگی هر توکن را ببینید روی دیگری به همراه تگ 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/. درخت وابستگی زیر را خواهید دید:

پایتون برای NLP: بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده

به نام 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 پارامتر. خروجی اسکریپت بالا به شکل زیر است:

پایتون برای NLP: بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده

از خروجی می‌بینید که موجودیت‌های نام‌گذاری شده با رنگ‌های مختلف به همراه انواع موجودیت‌هایشان برجسته شده‌اند.

همچنین می‌توانید انواع موجودیت‌ها را برای نمایش فیلتر کنید. برای انجام این کار، باید نوع موجودات را برای نمایش در یک لیست ارسال کنید، که سپس به عنوان یک مقدار به ents کلید یک فرهنگ لغت فرهنگ لغت سپس به آن منتقل می شود options پارامتر از render روش از displacy ماژول مطابق شکل زیر:

filter = {'ents': ('ORG')}
displacy.render(sen, style='ent', jupyter=True, options=filter)

در اسکریپت بالا مشخص کردیم که فقط موجودیت های نوع ORG باید در خروجی نمایش داده شوند. خروجی اسکریپت بالا به شکل زیر است:

پایتون برای NLP: بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده

در نهایت، می‌توانید موجودیت‌های نام‌گذاری شده را نیز در خارج از آن نمایش دهید Jupyter notebook. اسکریپت زیر موجودیت های نامگذاری شده را در مرورگر پیش فرض شما نمایش می دهد. اسکریپت زیر را اجرا کنید:

displacy.serve(sen, style='ent')

حالا اگر به آدرس مراجعه کنید http://127.0.0.1:5000/ در مرورگر خود، باید موجودیت های نامگذاری شده را ببینید.

نتیجه

بخش‌هایی از برچسب‌گذاری گفتار و شناسایی موجودیت نام‌گذاری شده برای موفقیت هر کار NLP بسیار مهم است. در این مقاله دیدیم که چگونه می‌توان از کتابخانه spaCy پایتون برای انجام برچسب‌گذاری POS و شناسایی موجودیت نام‌گذاری شده با کمک مثال‌های مختلف استفاده کرد.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-24 00:35:03

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید