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

سرور مجازی NVMe

Python برای NLP: Tokenization، Stemming و Lemmatization با کتابخانه SpaCy

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


در مقاله قبلی بحث خود را در مورد روش انجام پردازش زبان طبیعی با پایتون شروع کردیم. روش خواندن و نوشتن فایل های متنی و PDF را دیدیم. در این مقاله، ما شروع به کار با فضایی کتابخانه برای انجام چند کار اساسی NLP مانند نشانه گذاری، ریشه یابی و ریشه یابی.

معرفی SpaCy

کتابخانه spaCy یکی از محبوب ترین کتابخانه های NLP در کنار NLTK است. تفاوت اساسی بین این دو کتابخانه در این واقعیت است که NLTK شامل طیف گسترده ای از الگوریتم ها برای حل یک مسئله است در حالی که spaCy تنها شامل یک الگوریتم است، اما بهترین الگوریتم برای حل یک مسئله.

NLTK در سال 2001 منتشر شد در حالی که spaCy نسبتا جدید است و در سال 2015 توسعه یافته است. در این سری از مقالات روی NLP، ما بیشتر با spaCy سر و کار خواهیم داشت، به دلیل ماهیت هنری آن. با این حال، هنگامی که انجام یک کار با استفاده از NLTK به جای spaCy آسان تر باشد، NLTK را نیز لمس خواهیم کرد.

نصب SpaCy

اگر از pip نصب کننده برای نصب کتابخانه های پایتون، به خط فرمان بروید و عبارت زیر را اجرا کنید:

$ pip install -U spacy

در غیر این صورت اگر از Anaconda استفاده می کنید، باید دستور زیر را اجرا کنید روی اعلان آناکوندا:

$ conda install -c conda-forge spacy

پس از دانلود و نصب spaCy، گام بعدی دانلود مدل زبان است. ما از مدل زبان انگلیسی استفاده خواهیم کرد. از مدل زبان برای انجام انواع وظایف NLP استفاده می شود که در بخش بعدی خواهیم دید.

دستور زیر مدل زبان را دانلود می کند:

$ python -m spacy download en

عملکرد پایه

قبل از اینکه عمیق‌تر به توابع مختلف spaCy بپردازیم، اجازه دهید به طور خلاصه روش کار با آن را ببینیم.

به عنوان اولین قدم، شما نیاز دارید import را spacy کتابخانه به شرح زیر

import spacy

بعد، باید مدل زبان spaCy را بارگذاری کنیم.

sp = spacy.load('en_core_web_sm')

در اسکریپت بالا ما از load تابع از spacy کتابخانه برای بارگذاری مدل اصلی زبان انگلیسی. مدل در ذخیره می شود sp متغیر.

بیایید اکنون یک سند کوچک با استفاده از این مدل ایجاد کنیم. یک سند می تواند یک جمله یا مجموعه ای از جملات باشد و می تواند طول نامحدودی داشته باشد. اسکریپت زیر یک سند spaCy ساده ایجاد می کند.

sentence = sp(u'Manchester United is looking to sign a forward for $90 million')

وقتی سندی با استفاده از مدل ایجاد می‌شود، spaCy به‌طور خودکار سند شما را به توکن‌ها تبدیل می‌کند.

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

for word in sentence:
    print(word.text)

خروجی اسکریپت بالا به شکل زیر است:

Manchester
United
is
looking
to
sign
a
forward
for
$
90
million

می توانید ببینید که ما نشانه های زیر را در سند خود داریم. ما همچنین می توانیم ببینیم بخش هایی از سخنرانی هر یک از این نشانه ها با استفاده از .pos_ ویژگی نشان داده شده در زیر:

for word in sentence:
    print(word.text,  word.pos_)

خروجی:

Manchester PROPN
United PROPN
is VERB
looking VERB
to PART
sign VERB
a DET
forward NOUN
for ADP
$ SYM
90 NUM
million NUM

می بینید که به هر کلمه یا نشانه در جمله ما بخشی از گفتار اختصاص داده شده است. به عنوان مثال، “منچستر” به عنوان یک اسم خاص، “نگاه کردن” به عنوان یک فعل برچسب گذاری شده است، و به همین ترتیب روی.

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

بیایید یک سند دیگر ایجاد کنیم:

sentence2 = sp(u"Manchester United isn't looking to sign any forward.")

برای تجزیه وابستگی، ویژگی dep_ مطابق شکل زیر استفاده می شود:

for word in sentence2:
    print(word.text,  word.pos_, word.dep_)

خروجی به شکل زیر است:

Manchester PROPN compound
United PROPN nsubj
is VERB aux
n't ADV neg
looking VERB ROOT
to PART aux
sign VERB xcomp
any DET advmod
forward ADV advmod
. PUNCT punct

از خروجی، می توانید ببینید که spaCy به اندازه کافی هوشمند است تا وابستگی بین توکن ها را پیدا کند، به عنوان مثال در جمله ما یک کلمه داشتیم. is'nt. تجزیه کننده وابستگی آن را به دو کلمه تقسیم کرده و مشخص می کند که n't در واقع نفی کلمه قبلی است.

برای درک دقیق تجزیه وابستگی، مراجعه کنید این مقاله.

علاوه بر چاپ کلمات، شما همچنین می توانید print جملات از یک سند

document = sp(u'Hello from rasanegar. The site with the best Python Tutorials. What are you looking for?')

اکنون می توانیم با استفاده از اسکریپت زیر هر جمله را تکرار کنیم:

for sentence in document.sents:
    print(sentence)

خروجی اسکریپت به شکل زیر است:

Hello from rasanegar.
The site with the best Python Tutorials.
What are you looking for?

همچنین می توانید بررسی کنید که آیا یک جمله با یک نشانه خاص شروع می شود یا خیر. شما می توانید توکن های جداگانه را با استفاده از یک شاخص و براکت های مربعی مانند یک آرایه دریافت کنید:

document(4)

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

The

حالا ببینیم آیا جمله ای در سند با آن شروع می شود یا خیر The، می توانیم استفاده کنیم is_sent_start ویژگی مطابق شکل زیر:

document(4).is_sent_start

در خروجی، خواهید دید True از زمان نشانه The در ابتدای جمله دوم استفاده می شود.

در این بخش، چند عملیات اساسی کتابخانه spaCy را دیدیم. اکنون بیایید عمیق‌تر کاوش کنیم و Tokenization، Stemming و Lemmatization را با جزئیات ببینیم.

توکن سازی

همانطور که قبلاً توضیح داده شد، توکن سازی همان است process تجزیه یک سند به کلمات، علائم نگارشی، ارقام عددی و غیره.

بیایید توکنیزاسیون spaCy را با جزئیات ببینیم. با استفاده از اسکریپت زیر یک سند جدید ایجاد کنید:

sentence3 = sp(u'"They\'re leaving U.K. for U.S.A."')
print(sentence3)

می توانید ببینید که جمله شامل نقل قول در ابتدا و در پایان است. همچنین دارای علائم نگارشی به صورت اختصاری “UK” و “USA” است.

بیایید ببینیم که spaCy چگونه این جمله را تبدیل می کند.

for word in sentence3:
    print(word.text)

خروجی:

"
They
're
leaving
U.K.
for
U.S.A.
"

در خروجی، می‌توانید ببینید که spaCy دو نقل قول شروع و پایان را نشانه گذاری کرده است. با این حال، به اندازه کافی هوشمند است، نه اینکه نقطه نگارشی استفاده شده بین اختصاراتی مانند UK و USA را نشانه گذاری کنیم.

بیایید نمونه دیگری از نشانه گذاری را ببینیم:

sentence4 = sp(u"Hello, I am non-vegetarian, email me the menu at (email protected)")
print(sentence4)

در اینجا در جمله بالا یک خط تیره در کلمه “غیر گیاهخواری” و در آدرس ایمیل داریم. بیایید ببینیم که spaCy چگونه این را نشانه گذاری می کند:

for word in sentence4:
    print(word.text)

خروجی:

Hello
,
I
am
non
-
vegetarian
,
email
me
the
menu
at
(email protected)

از خروجی مشخص است که spaCy در واقع قادر به شناسایی ایمیل بوده و علیرغم داشتن “-“، آن را توکن نکرده است. از طرفی کلمه «غیر گیاهخواری» نشانه گذاری شد.

بیایید ببینیم چگونه می توانیم کلمات موجود در سند را بشماریم:

len(sentence4)

در خروجی، 14 عدد را مشاهده خواهید کرد که تعداد توکن های موجود در آن است sentence4.

شناسایی موجودیت ها

علاوه بر توکن کردن اسناد به کلمات، می توانید متوجه شوید که آیا کلمه موجودی است مانند شرکت، مکان، ساختمان، ارز، موسسه و غیره.

بیایید یک مثال ساده از شناسایی موجودیت نامگذاری شده را ببینیم:

sentence5 = sp(u'Manchester United is looking to sign Harry Kane for $90 million')  

بیایید ابتدا سعی کنیم به سادگی آن را نشانه گذاری کنیم:

for word in sentence5:
    print(word.text)

خروجی:

Manchester
United
is
looking
to
sign
Harry
Kane
for
$
90
million

ما می دانیم که “منچستریونایتد” یک کلمه است، بنابراین نباید آن را به دو کلمه تبدیل کرد. به همین ترتیب، “هری کین” نام یک شخص است و “90 میلیون دلار” یک ارزش ارزی است. اینها هم نباید توکنیزه شوند.

اینجاست که شناسایی موجودیت نامگذاری شده برای بازی می آید برای دریافت موجودیت های نامگذاری شده از یک سند، باید از آن استفاده کنید ents صفت. بیایید موجودیت های نامگذاری شده را از جمله بالا بازیابی کنیم. اسکریپت زیر را اجرا کنید:

for entity in sentence.ents:
    print(entity.text + ' - ' + entity.label_ + ' - ' + str(spacy.explain(entity.label_)))

در اسکریپت بالا، ما print متن موجودیت، برچسب موجودیت و جزئیات موجودیت. خروجی به شکل زیر است:

خروجی:

Manchester United - ORG - Companies, agencies, institutions, etc.
Harry Kane - PERSON - People, including fictional
$90 million - MONEY - Monetary values, including unit

می‌توانید ببینید که سازمان فضایی SpaCy با موفقیت «منچستر یونایتد» را به‌عنوان یک سازمان، «هری کین» را به‌عنوان یک شخص و «۹۰ میلیون دلار» را به‌عنوان ارزش ارز شناسایی کرده است.

تشخیص اسم ها

علاوه بر شناسایی موجودیت های نامگذاری شده، اسامی نیز قابل شناسایی هستند. برای انجام این کار، noun_chunks ویژگی استفاده می شود. جمله زیر را در نظر بگیرید:

sentence5 = sp(u'Latest Rumours: Manchester United is looking to sign Harry Kane for $90 million')  

بیایید سعی کنیم اسم های این جمله را پیدا کنیم:

for noun in sentence5.noun_chunks:
    print(noun.text)

خروجی:

Latest Rumours
Manchester United
Harry Kane

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

ساقه

Stemming به کاهش یک کلمه به آن اشاره دارد root فرم. در حین انجام وظایف پردازش زبان طبیعی، با سناریوهای مختلفی روبرو می شوید که در آن کلمات مختلفی با یکسان پیدا می کنید. root. به عنوان مثال، محاسبه، کامپیوتر، محاسبات، محاسبه و غیره. ممکن است بخواهید کلمات را به آنها کاهش دهید. root فرم به خاطر یکنواختی اینجاست که stemming وارد عمل می شود.

ممکن است برای شما تعجب آور باشد، اما spaCy آنطور که متکی است دارای هیچ عملکردی برای stemming نیست روی فقط واژه سازی بنابراین در این قسمت از NLTK برای stemming استفاده می کنیم.

دو نوع ساقه در NLTK وجود دارد: پورتر استمر و ساقه های گلوله برفی. هر دوی آنها با استفاده از الگوریتم های مختلف پیاده سازی شده اند.

پورتر استمر

بیایید پورتر استمر را در عمل ببینیم:

import nltk

from nltk.stem.porter import *

بیایید یک کلاس ایجاد کنیم PorterStemmer.

stemmer = PorterStemmer()

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

tokens = ('compute', 'computer', 'computed', 'computing')

اسکریپت زیر با استفاده از porter stemmer ریشه کلمات موجود در لیست را پیدا می کند:

for token in tokens:
    print(token + ' --> ' + stemmer.stem(token))

خروجی به صورت زیر است:

compute --> comput
computer --> comput
computed --> comput
computing --> comput

می بینید که تمام 4 کلمه به “comput” کاهش یافته است که در واقع یک کلمه نیست.

استمر گلوله برفی

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

from nltk.stem.snowball import SnowballStemmer

stemmer = SnowballStemmer(language='english')

tokens = ('compute', 'computer', 'computed', 'computing')

for token in tokens:
    print(token + ' --> ' + stemmer.stem(token))

در اسکریپت بالا، ما از Snowball stemmer برای یافتن ریشه همان 4 کلمه ای که با porter stemmer استفاده کردیم، استفاده کردیم. خروجی به شکل زیر است:

compute --> comput
computer --> comput
computed --> comput
computing --> comput

می بینید که نتایج یکسان است. ما هنوز “محاسبه” را به عنوان پایه دریافت کردیم. باز هم، این کلمه “کامپیوتر” در واقع یک کلمه فرهنگ لغت نیست.

اینجاست که کلمه نویسی مفید است. Lemmatization کلمه را همانطور که در فرهنگ لغت آمده به ریشه خود کاهش می دهد. ریشه‌هایی که از طریق واژه‌سازی برگردانده می‌شوند، واژه‌های فرهنگ لغت واقعی هستند و برخلاف کلماتی که توسط استمر برگردانده می‌شوند، از نظر معنایی کامل هستند.

Lemmatization

اگرچه ما نمی‌توانیم stemming را با spaCy انجام دهیم، اما می‌توانیم با استفاده از spaCy واژه‌سازی را انجام دهیم.

برای این کار باید از lemma_ صفت روی سند spaCy فرض کنید جمله زیر را داریم:

sentence6 = sp(u'compute computer computed computing')

ما می‌توانیم ریشه همه کلمات را با استفاده از واژه‌سازی spaCy به صورت زیر پیدا کنیم:

for word in sentence6:
    print(word.text,  word.lemma_)

خروجی اسکریپت بالا به شکل زیر است:

compute compute
computer computer
computed compute
computing computing

شما می توانید ببینید که بر خلاف stemming که در آن root ما دریافت کردیم “محاسبه” بود، ریشه هایی که در اینجا به دست آوردیم کلمات واقعی در فرهنگ لغت هستند.

Lemmatization کلمات را در شکل دوم یا سوم به انواع شکل اول خود تبدیل می کند. به مثال زیر نگاه کنید:

sentence7 = sp(u'A letter has been written, asking him to be released')

for word in sentence7:
    print(word.text + '  ===>', word.lemma_)

خروجی:

A ===> a
letter ===> letter
has ===> have
been ===> be
written ===> write
, ===> ,
asking ===> ask
him ===> -PRON-
to ===> to
be ===> be
released ===> release

از خروجی به وضوح می بینید که کلمات در فرم های دوم و سوم مانند “نوشته”، “آزاد شده” و … به شکل اول یعنی “نوشتن” و “رها کردن” تبدیل شده اند.

نتیجه

Tokenization، Stemming و Lemmatization برخی از اساسی ترین وظایف پردازش زبان طبیعی هستند. در این مقاله دیدیم که چگونه می‌توانیم Tokenization و Lemmatization را با استفاده از کتابخانه spaCy انجام دهیم. ما همچنین دیدیم که چگونه NLTK می تواند برای stemming استفاده شود. در مقاله بعدی بحث خود را در مورد واژگان و تطبیق عبارت در پایتون آغاز خواهیم کرد.

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



منتشر شده در 1403-01-24 06:17:03

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

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

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