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

سرور مجازی NVMe

پایتون برای NLP: مقدمه ای بر کتابخانه الگو

0 9
زمان لازم برای مطالعه: 11 دقیقه


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

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

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

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