از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون برای NLP: مقدمه ای بر کتابخانه الگو
سرفصلهای مطلب
این هشتمین مقاله از سری مقالات من است روی پایتون برای NLP. در مقاله قبلی خود توضیح دادم که چگونه می توان از کتابخانه TextBlob پایتون برای انجام انواع وظایف NLP از توکن سازی تا برچسب گذاری POS و طبقه بندی متن تا تحلیل احساسات استفاده کرد. در این مقاله به بررسی پایتون می پردازیم الگو کتابخانه، که یکی دیگر از کتابخانه های بسیار مفید پردازش زبان طبیعی است.
کتابخانه Pattern یک کتابخانه چند منظوره است که می تواند وظایف زیر را انجام دهد:
- پردازش زبان طبیعی: انجام کارهایی مانند توکن سازی، ریشه یابی، برچسب گذاری POS، تجزیه و تحلیل احساسات و غیره.
- داده کاوی: حاوی APIهایی برای استخراج داده ها از سایت هایی مانند توییتر، فیس بوک، ویکی پدیا و غیره است.
- یادگیری ماشینی: شامل مدلهای یادگیری ماشینی مانند SVM، KNN و پرسپترون است که میتواند برای طبقهبندی، رگرسیون و کارهای خوشهبندی استفاده شود.
در این مقاله دو کاربرد اول کتابخانه Pattern را از لیست بالا مشاهده خواهیم کرد. ما استفاده از Pattern Library برای NLP را با انجام وظایفی مانند نشانهسازی، ریشهیابی و تحلیل احساسات بررسی خواهیم کرد. همچنین خواهیم دید که چگونه می توان از کتابخانه Pattern برای وب کاوی استفاده کرد.
نصب کتابخانه
برای نصب کتابخانه می توانید از موارد زیر استفاده کنید pip دستور:
$ pip install pattern
در غیر این صورت اگر از توزیع Anaconda پایتون استفاده می کنید، می توانید از دستور Anaconda زیر برای دانلود کتابخانه استفاده کنید:
$ conda install -c asmeurer pattern
توابع کتابخانه الگو برای NLP
در این قسمت تعدادی از اپلیکیشن های NLP Pattern Library را مشاهده خواهیم کرد.
Tokenizing، POS Tagging و Chunking
در کتابخانههای NLTK و spaCy، ما یک عملکرد جداگانه برای توکن کردن، برچسبگذاری POS و یافتن عبارات اسمی در اسناد متنی داریم. از سوی دیگر، در کتابخانه Pattern، all-in-one وجود دارد parse
روشی که یک رشته متن را به عنوان پارامتر ورودی می گیرد و توکن های مربوطه را در رشته به همراه تگ POS برمی گرداند.
این parse
متد همچنین به ما می گوید که آیا نشانه یک عبارت اسمی یا عبارت فعل، یا فاعل یا مفعول است. همچنین میتوانید با تنظیم، نشانههای کلمهسازی شده را بازیابی کنید lemmata
پارامتر به True
. نحو از parse
روش به همراه مقادیر پیش فرض برای پارامترهای مختلف به صورت زیر است:
parse(string,
tokenize=True,
tags=True,
chunks=True,
relations=False,
lemmata=False,
encoding='utf-8',
tagset=None
)
بیایید ببینیم parse
روش در عمل:
from pattern.en import parse
from pattern.en import pprint
pprint(parse('I drove my car to the hospital yesterday', relations=True, lemmata=True))
برای استفاده از parse
روش، شما باید import را en
ماژول از pattern
کتابخانه این en
ماژول شامل توابع NLP زبان انگلیسی است. اگر از pprint
روش به print خروجی از parse
روش روی را console، باید خروجی زیر را ببینید:
WORD TAG CHUNK ROLE ID PNP LEMMA
I PRP NP SBJ 1 - i
drove VBD VP - 1 - drive
my PRP$ NP OBJ 1 - my
car NN NP ^ OBJ 1 - car
to TO - - - - to
the DT NP - - - the
hospital NN NP ^ - - - hospital
yesterday NN NP ^ - - - yesterday
در خروجی، می توانید کلمات توکن شده را به همراه تگ POS آنها، قسمتی که توکن ها به آن تعلق دارند و نقش را مشاهده کنید. شما همچنین می توانید شکل lemmatized توکن ها را مشاهده کنید.
اگر تماس بگیرید split
روش روی شی برگردانده شده توسط parse
در روش، خروجی لیستی از جملات خواهد بود که در آن هر جمله فهرستی از نشانه ها و هر نشانه فهرستی از کلمات به همراه برچسب های مرتبط با کلمات است.
به عنوان مثال به اسکریپت زیر نگاه کنید:
from pattern.en import parse
from pattern.en import pprint
print(parse('I drove my car to the hospital yesterday', relations=True, lemmata=True).split())
خروجی اسکریپت بالا به شکل زیر است:
((('I', 'PRP', 'B-NP', 'O', 'NP-SBJ-1', 'i'), ('drove', 'VBD', 'B-VP', 'O', 'VP-1', 'drive'), ('my', 'PRP$', 'B-NP', 'O', 'NP-OBJ-1', 'my'), ('car', 'NN', 'I-NP', 'O', 'NP-OBJ-1', 'car'), ('to', 'TO', 'O', 'O', 'O', 'to'), ('the', 'DT', 'B-NP', 'O', 'O', 'the'), ('hospital', 'NN', 'I-NP', 'O', 'O', 'hospital'), ('yesterday', 'NN', 'I-NP', 'O', 'O', 'yesterday')))
کثرت کردن و تکینگی کردن نشانه ها
این pluralize
و singularize
از روش هایی برای تبدیل کلمات مفرد به جمع و بالعکس استفاده می شود.
from pattern.en import pluralize, singularize
print(pluralize('leaf'))
print(singularize('theives'))
خروجی به شکل زیر است:
leaves
theif
تبدیل صفت به درجات مقایسه ای و مافوق
شما می توانید درجات مقایسه ای و فوق العاده یک صفت را با استفاده از آن بازیابی کنید comparative
و superlative
کارکرد. به عنوان مثال، درجه نسبی خوب بهتر است و درجه عالی خوب بهترین است. بیایید این را در عمل ببینیم:
from pattern.en import comparative, superlative
print(comparative('good'))
print(superlative('good'))
خروجی:
better
best
یافتن N-Gram
N-Gram به ترکیب “n” کلمات در یک جمله اشاره دارد. به عنوان مثال، برای جمله “او به بیمارستان می رود”، 2 گرم می شود (او می رود)، (می رود به) و (به بیمارستان). N-Gram ها می توانند نقش مهمی در طبقه بندی متن و مدل سازی زبان ایفا کنند.
در کتابخانه الگو، ngram
متد برای یافتن تمام n-gram در یک رشته متن استفاده می شود. اولین پارامتر به ngram
متد رشته متن است. تعداد n گرم به عدد منتقل می شود n
پارامتر روش به مثال زیر نگاه کنید:
from pattern.en import ngrams
print(ngrams("He goes to hospital", n=2))
خروجی:
(('He', 'goes'), ('goes', 'to'), ('to', 'hospital'))
یافتن احساسات
احساس به نظر یا احساس نسبت به یک چیز خاص اشاره دارد. کتابخانه Pattern عملکردی را برای یافتن احساسات از یک رشته متن ارائه می دهد.
در الگو، sentiment
شی برای یافتن قطبیت (مثبت یا منفی) متن به همراه ذهنیت آن استفاده می شود.
بسته به متداول ترین صفت های مثبت (خوب، بهترین، عالی، و غیره) و منفی (بد، افتضاح، رقت انگیز، و غیره)، نمره احساسی بین 1 و -1 به متن اختصاص داده می شود. به این نمره احساس، قطبیت نیز می گویند.
علاوه بر نمره احساسات، ذهنیت نیز برمی گردد. مقدار ذهنیت می تواند بین 0 تا 1 باشد. ذهنیت میزان نظرات شخصی و اطلاعات واقعی موجود در متن را کمیت می کند. ذهنیت بالاتر به این معنی است که متن به جای اطلاعات واقعی، حاوی نظرات شخصی است.
from pattern.en import sentiment
print(sentiment("This is an excellent movie to watch. I really love it"))
وقتی اسکریپت بالا را اجرا می کنید، باید خروجی زیر را ببینید:
(0.75, 0.8)
جمله “این یک فیلم عالی برای تماشا است. من واقعا آن را دوست دارم” دارای احساسات 0.75 است که نشان می دهد بسیار مثبت است. به طور مشابه، ذهنیت 0.8 به این واقعیت اشاره دارد که جمله نظر شخصی کاربر است.
بررسی اینکه آیا یک بیانیه یک واقعیت است
این modality
تابع کتابخانه Pattern را می توان برای یافتن درجه قطعیت در رشته متن استفاده کرد. این modality
تابع مقداری بین -1 تا 1 برمی گرداند modality
تابع مقداری بیشتر از 0.5 را برمی گرداند.
در اینجا یک نمونه از آن در عمل آورده شده است:
from pattern.en import parse, Sentence
from pattern.en import modality
text = "Paris is the capital of France"
sent = parse(text, lemmata=True)
sent = Sentence(sent)
print(modality(sent))
1.0
در اسکریپت بالا ما ابتدا import را parse
روش همراه با Sentence
کلاس در خط دوم، ما import را modality
تابع. این parse
متد متن را به عنوان ورودی می گیرد و یک فرم نشانه گذاری شده از متن را برمی گرداند که سپس به متن ارسال می شود Sentence
سازنده کلاس این modality
روش طول می کشد Sentence
شیء کلاس و مدالیته جمله را برمی گرداند.
از آنجایی که رشته متن “پاریس پایتخت فرانسه است” یک واقعیت است، در خروجی مقدار 1 را مشاهده خواهید کرد.
به طور مشابه، برای جمله ای که قطعی نیست، مقدار بازگردانده شده توسط modality
روش حدود 0.0 است. به اسکریپت زیر نگاه کنید:
text = "I think we can complete this task"
sent = parse(text, lemmata=True)
sent = Sentence(sent)
print(modality(sent))
0.25
از آنجایی که رشته در مثال بالا خیلی قطعی نیست، مدالیته رشته فوق 0.25 خواهد بود.
اصلاحات املایی
این suggest
می توان از روش برای یافتن اینکه آیا یک کلمه به درستی املا شده است یا نه استفاده کرد. این suggest
اگر کلمه ای 100% درست نوشته شده باشد، متد 1 را برمی گرداند. در غیر این صورت suggest
متد تصحیحات احتمالی کلمه را به همراه احتمال صحت آنها برمی گرداند.
به مثال زیر نگاه کنید:
from pattern.en import suggest
print(suggest("Whitle"))
در اسکریپت بالا ما یک کلمه داریم Whitle
که به اشتباه نوشته شده است. در خروجی پیشنهادات احتمالی برای این کلمه را مشاهده خواهید کرد.
(('While', 0.6459209419680404), ('White', 0.2968881412952061), ('Title', 0.03280067283431455), ('Whistle', 0.023549201009251473), ('Chile', 0.0008410428931875525))
بر اساس suggest
در روش، احتمال 0.64 وجود دارد که کلمه “While” باشد، به همین ترتیب احتمال 0.29 وجود دارد که کلمه “White” باشد و به همین ترتیب روی.
حالا بیایید یک کلمه را درست املا کنیم:
from pattern.en import suggest
print(suggest("Fracture"))
خروجی:
(('Fracture', 1.0))
از خروجی مشاهده می کنید که احتمال 100% املای صحیح کلمه وجود دارد.
کار با اعداد
کتابخانه Pattern شامل توابعی است که می تواند برای تبدیل اعداد در قالب رشته های متنی به همتایان عددی آنها و بالعکس استفاده شود. برای تبدیل از متن به نمایش عددی number
تابع استفاده می شود. به طور مشابه برای تبدیل مجدد از اعداد به نمایش متن متناظر آنها numerals
تابع استفاده می شود. به اسکریپت زیر نگاه کنید:
from pattern.en import number, numerals
print(number("one hundred and twenty two"))
print(numerals(256.390, round=2))
خروجی:
122
two hundred and fifty-six point thirty-nine
در خروجی عدد 122 را مشاهده خواهید کرد که نمایش عددی متن “صد و بیست و دو” است. به همین ترتیب، باید “دویست و پنجاه و شش نقطه سی و نه” را ببینید که نمایش متنی عدد 256.390 است.
به یاد داشته باشید، برای numerals
تابعی که باید عدد صحیحی را ارائه کنیم که می خواهیم عدد ما به آن گرد شود.
این quantify
تابع برای بدست آوردن تخمین تعداد کلمات از موارد موجود در لیست استفاده می شود که عبارتی را برای ارجاع به گروه ارائه می دهد. اگر فهرستی دارای 3-8 مورد مشابه باشد، quantify
تابع آن را به “چند” کمیت می کند. دو مورد به یک “زوج” کمیت می شوند.
from pattern.en import quantify
print(quantify(('apple', 'apple', 'apple', 'banana', 'banana', 'banana', 'mango', 'mango')))
در لیست، ما سه سیب، سه موز و دو انبه داریم. خروجی از quantify
تابع این لیست به شکل زیر است:
several bananas, several apples and a pair of mangoes
به طور مشابه، مثال زیر تخمین های دیگر تعداد کلمات را نشان می دهد.
from pattern.en import quantify
print(quantify({'strawberry': 200, 'peach': 15}))
print(quantify('orange', amount=1200))
خروجی:
hundreds of strawberries and a number of peaches
thousands of oranges
توابع کتابخانه الگو برای داده کاوی
در بخش قبل، تعدادی از متداولترین توابع کتابخانه Pattern برای NLP را دیدیم. در این بخش خواهیم دید که چگونه می توان از کتابخانه Pattern برای انجام انواع وظایف داده کاوی استفاده کرد.
این web
ماژول کتابخانه Pattern برای کارهای وب کاوی استفاده می شود.
دسترسی به صفحات وب
این URL
شی برای بازیابی مطالب از صفحات وب استفاده می شود. چندین روش دارد که می توان از آنها برای باز کردن یک صفحه وب، دانلود مطالب از یک صفحه وب و خواندن یک صفحه وب استفاده کرد.
می توانید مستقیماً از download
روشی برای دانلود محتویات HTML هر صفحه وب. اسکریپت زیر کد منبع HTML مقاله ویکی پدیا را دانلود می کند روی هوش مصنوعی
from pattern.web import download
page_html = download('https://en.wikipedia.org/wiki/Artificial_intelligence', unicode=True)
همچنین میتوانید فایلها را از صفحات وب دانلود کنید، برای مثال، تصاویر را با استفاده از روش URL:
from pattern.web import URL, extension
page_url = URL('https://upload.wikimedia.org/wikipedia/commons/f/f1/RougeOr_football.jpg')
file = open('football' + extension(page_url.page), 'wb')
file.write(page_url.download())
file.close()
در اسکریپت بالا ابتدا با استفاده از صفحه وب ارتباط برقرار می کنیم URL
روش. بعد، ما را صدا می کنیم extension
روش روی باز شده page، که پسوند فایل را برمی گرداند. پسوند فایل در انتهای رشته “football” اضافه شده است. روش باز برای خواندن این مسیر و در نهایت، فراخوانی می شود download()
متد تصویر را دانلود کرده و در مسیر اجرای پیش فرض می نویسد.
یافتن URL در متن
می توانید استفاده کنید findurl
روش استخراج URL از رشته های متنی به عنوان مثال:
from pattern.web import find_urls
print(find_urls('To search anything, go to www.google.com', unique=True))
در خروجی، آدرس وب سایت گوگل را مطابق شکل زیر مشاهده خواهید کرد:
('www.google.com')
ایجاد درخواست های ناهمزمان برای صفحات وب
صفحات وب می توانند بسیار بزرگ باشند و دانلود محتوای کامل صفحه وب ممکن است کمی طول بکشد، که می تواند کاربر را از انجام هر کار دیگری مسدود کند. روی برنامه تا وب کامل page دانلود می شود. با این حال web
ماژول کتابخانه Pattern حاوی تابعی به نام است asynchronous
، که محتویات یک صفحه وب را به صورت موازی دانلود می کند. این asynchronous
روش در پسزمینه اجرا میشود تا کاربر بتواند در حین بارگیری صفحه وب با برنامه تعامل داشته باشد.
بیایید یک مثال بسیار ساده از آن را در نظر بگیریم asynchronous
روش:
from pattern.web import asynchronous, time, Google
asyn_req = asynchronous(Google().search, 'artificial intelligence', timeout=4)
while not asyn_req.done:
time.sleep(0.1)
print('searching...')
print(asyn_req.value)
print(find_urls(asyn_req.value, unique=True))
در اسکریپت بالا، ما نتیجه جستجوی گوگل را بازیابی می کنیم page 1 برای عبارت جستجوی “هوش مصنوعی”، می توانید ببینید که در حالی که page دانلودها یک حلقه while به صورت موازی اجرا می کنیم. در نهایت، نتایج بازیابی شده توسط پرس و جو با استفاده از value
ویژگی شی که توسط asynchronous
مدول. سپس URL ها را از جستجو استخراج می کنیم و سپس چاپ می شوند روی صفحه نمایش
دریافت نتایج موتور جستجو با API ها
کتابخانه الگو شامل SearchEngine
کلاسی که از کلاس هایی مشتق شده است که می توان برای اتصال به API های تماس موتورهای جستجو و وب سایت های مختلف مانند گوگل، بینگ، فیس بوک، ویکی پدیا، توییتر و غیره استفاده کرد. SearchEngine
ساختار شی سه پارامتر را می پذیرد:
license
: کلید مجوز توسعه دهنده برای موتور جستجو یا وب سایت مربوطهthrottle
: مربوط به اختلاف زمانی بین درخواست های متوالی به سرور استlangauge
: زبان نتایج را مشخص می کند
این search
روش از SearchEngine
class برای درخواست یک موتور جستجو برای یک جستجوی خاص استفاده می شود. این search
روش می تواند پارامترهای زیر را داشته باشد:
query
: رشته جستجوtype:
نوع داده ای که می خواهید جستجو کنید، می تواند سه مقدار داشته باشد:SEARCH
،NEWS
وIMAGE
.start
: page که از آن می خواهید جستجو را شروع کنیدcount
: تعداد نتایج در هر page.
کلاس های موتور جستجو که به ارث می برند SearchEngine
کلاس همراه با آن search
روش عبارتند از: Google
، Bing
، Twitter
، Facebook
، Wikipedia
، و Flickr
.
عبارت جستجو برای هر مورد اشیاء را برمی گرداند. این result
سپس شیء می تواند برای بازیابی اطلاعات مربوط به نتیجه جستجو شده استفاده شود. صفات از result
شی هستند url
، title
، text
، language
، author
، date
.
حالا بیایید یک مثال بسیار ساده ببینیم که چگونه می توانیم چیزی را جستجو کنیم روی گوگل از طریق کتابخانه الگو. به یاد داشته باشید، برای اینکه این مثال کار کند، باید از کلید مجوز توسعه دهنده خود برای Google API استفاده کنید.
from pattern.web import Google
google = Google(license=None)
for search_result in google.search('artificial intelligence'):
print(search_result.url)
print(search_result.text)
در اسکریپت بالا، یک شی از کلاس گوگل ایجاد می کنیم. در سازنده Google، کلید مجوز خود را به license
پارامتر. بعد رشته را رد می کنیم artificial intelligence
به search
روش. به طور پیشفرض، 10 مورد اول از اولین نتیجه میشوند page بازگردانده می شود که سپس تکرار می شود و URL و متن هر نتیجه نمایش داده می شود روی صفحه نمایش
این process برای موتور جستجوی بینگ مشابه است، فقط باید آن را جایگزین کنید Bing
کلاس با Google
در اسکریپت بالا
حالا بیایید توییتر را برای سه توییت جدید که حاوی متن “هوش مصنوعی” هستند جستجو کنیم. اسکریپت زیر را اجرا کنید:
from pattern.web import Twitter
twitter = Twitter()
index = None
for j in range(3):
for tweet in twitter.search('artificial intelligence', start=index, count=3):
print(tweet.text)
index = tweet.id
در اسکریپت بالا ما ابتدا import را Twitter
کلاس از pattern.web
مدول. در مرحله بعد، روی توییتهای بازگردانده شده توسط the Twitter
کلاس و نمایش متن توییت روی را console. برای اجرای اسکریپت فوق به هیچ کلید مجوزی نیاز ندارید.
تبدیل داده های HTML به متن ساده
این download
روش از URL
کلاس داده ها را در قالب HTML برمی گرداند. با این حال، اگر میخواهید یک تحلیل معنایی متن انجام دهید، به عنوان مثال، طبقهبندی احساسات، باید دادهها را بدون تگهای HTML پاک کنید. می توانید داده ها را با plaintext
روش. این روش به عنوان یک پارامتر، محتوای HTML را که توسط download
روش، و متن پاک شده را برمی گرداند.
به اسکریپت زیر نگاه کنید:
from pattern.web import URL, plaintext
html_content = URL('https://rasanegar.com/python-for-nlp-introduction-to-the-textblob-library/').download()
cleaned_page = plaintext(html_content.decode('utf-8'))
print(cleaned_page)
در خروجی، باید متن پاک شده را از صفحه وب مشاهده کنید:
https://rasanegar.com/python-برای-nlp-introduction-to-the-textblob-library/.
مهم است به خاطر داشته باشید که اگر از پایتون 3 استفاده می کنید، باید با آن تماس بگیرید decode('utf-8')
روش تبدیل داده ها از بایت به فرمت رشته ای.
تجزیه اسناد PDF
کتابخانه Pattern حاوی شی PDF است که می تواند برای تجزیه یک سند PDF استفاده شود. PDF (قالب سند قابل حمل) یک فایل متقابل است که حاوی تصاویر، متون و فونت ها در یک سند مستقل است.
بیایید ببینیم که چگونه یک سند PDF را می توان با شی PDF تجزیه کرد:
from pattern.web import URL, PDF
pdf_doc = URL('http://demo.clab.cs.cmu.edu/NLP/syllabus_f18.pdf').download()
print(PDF(pdf_doc.decode('utf-8')))
در اسکریپت ما یک سند را با استفاده از download
تابع. سپس، سند HTML دانلود شده به کلاس PDF ارسال می شود که در نهایت آن را چاپ می کند روی را console.
پاک کردن کش
نتایج با روش هایی مانند SearchEngine.search()
و URL.download()
به طور پیش فرض در کش محلی ذخیره می شوند. برای پاک کردن کش پس از دانلود یک سند HTML، می توانیم استفاده کنیم clear
روش کلاس کش، همانطور که در زیر نشان داده شده است:
from pattern.web import cache
cache.clear()
نتیجه
کتابخانه Pattern یکی از مفیدترین کتابخانه های پردازش زبان طبیعی در پایتون است. اگرچه به اندازه spaCy یا NLTK شناخته شده نیست، اما دارای قابلیت هایی مانند یافتن موارد برتر و مقایسه ها، و تشخیص واقعیت و عقیده است که آن را از سایر کتابخانه های NLP متمایز می کند.
در این مقاله کاربرد کتابخانه Pattern برای پردازش زبان طبیعی و داده کاوی و وب اسکرپینگ را بررسی کردیم. ما دیدیم که چگونه میتوان کارهای اساسی NLP مانند توکنسازی، واژهسازی و تحلیل احساسات را با کتابخانه الگو انجام داد. در نهایت، ما همچنین روش استفاده از Pattern را برای ایجاد پرس و جوهای موتورهای جستجو، استخراج توییت های آنلاین و تمیز کردن اسناد HTML مشاهده کردیم.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-23 10:20:03