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

سرور مجازی NVMe

پایتون برای NLP: تطبیق واژگان و عبارت با SpaCy

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


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

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

تطبیق مبتنی بر قانون

کتابخانه spaCy همراه با یک Matcher ابزاری که می تواند برای تعیین قوانین سفارشی برای تطبیق عبارت استفاده شود. این process برای استفاده از Matcher ابزار بسیار مستقیم است. اولین کاری که باید انجام دهید این است که الگوهایی را که می خواهید مطابقت دهید، تعریف کنید. بعد، شما باید الگوها را به آن اضافه کنید Matcher ابزار و در نهایت، شما باید آن را اعمال کنید Matcher ابزاری برای سندی که می‌خواهید قوانین خود را با آن مطابقت دهید. این به بهترین شکل با کمک یک مثال توضیح داده می شود.

برای تطبیق مبتنی بر قانون، باید مراحل زیر را انجام دهید:

ایجاد شیء مطابقت

اولین گام این است که شیء مطابقت ایجاد کنید:

import spacy
nlp = spacy.load('en_core_web_sm')

from spacy.matcher import Matcher
m_tool = Matcher(nlp.vocab)

تعریف الگوها

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

p1 = ({'LOWER': 'quickbrownfox'})
p2 = ({'LOWER': 'quick'}, {'IS_PUNCT': True}, {'LOWER': 'brown'}, {'IS_PUNCT': True}, {'LOWER': 'fox'})
p3 = ({'LOWER': 'quick'}, {'LOWER': 'brown'}, {'LOWER': 'fox'})
p4 =  ({'LOWER': 'quick'}, {'LOWER': 'brownfox'})

در اسکریپت بالا،

  • p1 به دنبال عبارت “quickbrownfox” است
  • p2 به دنبال عبارت “quick-brown-fox” می گردد.
  • p3 سعی می کند “qucik brown fox” را جستجو کند.
  • p4 به دنبال عبارت “Quick Brownfox” است.

ویژگی نشانه LOWER تعریف می کند که عبارت باید قبل از تطبیق به حروف کوچک تبدیل شود.

پس از تعریف الگوها، باید آنها را به آن اضافه کنیم Matcher شی ای که قبلا ایجاد کردیم.

m_tool.add('QBF', None, p1, p2, p3, p4)

در اینجا “QBF” نام همسان ما است. هر اسمی میتونی بهش بدی

اعمال تطبیق در سند

ما خودمان را داریم matcher آماده. مرحله بعدی اعمال تطبیق است روی یک سند متنی و ببینیم آیا می توانیم مطابقت داشته باشیم. بیایید ابتدا یک سند ساده ایجاد کنیم:

sentence = nlp(u'The quick-brown-fox jumps over the lazy dog. The quick brown fox eats well. \
               the quickbrownfox is dead. the dog misses the quick brownfox')

برای اعمال تطبیق بر یک سند. سند باید به عنوان یک پارامتر به شی تطبیق داده شود. نتیجه، تمام شناسه‌های عباراتی است که در سند تطبیق داده شده‌اند، همراه با موقعیت‌های شروع و پایان آنها در سند. اسکریپت زیر را اجرا کنید:

phrase_matches = m_tool(sentence)
print(phrase_matches )

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

((12825528024649263697, 1, 6), (12825528024649263697, 13, 16), (12825528024649263697, 21, 22), (12825528024649263697, 29, 31))

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

برای اینکه در واقع نتیجه را به روشی بهتر مشاهده کنیم، می‌توانیم از طریق هر عبارت منطبق تکرار کنیم و مقدار رشته آن را نمایش دهیم. اسکریپت زیر را اجرا کنید:

for match_id, start, end in phrase_matches:
    string_id = nlp.vocab.strings(match_id)  
    span = sentence(start:end)                   
    print(match_id, string_id, start, end, span.text)

خروجی:

12825528024649263697 QBF 1 6 quick-brown-fox
12825528024649263697 QBF 13 16 quick brown fox
12825528024649263697 QBF 21 22 quickbrownfox
12825528024649263697 QBF 29 31 quick brownfox

از خروجی، می توانید تمام عبارات منطبق به همراه شناسه واژگان و موقعیت شروع و پایان را مشاهده کنید.

گزینه های بیشتر برای تطبیق مبتنی بر قانون

اسناد رسمی از کتابخانه sPacy حاوی جزئیات همه موارد است نشانه ها و وایلد کارت ها که می تواند برای تطبیق عبارت استفاده شود.

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

بیایید یک الگوی ساده بنویسیم که بتواند عبارت “سریع–قهوه ای-روباه” یا سریع قهوه ای—روباه را مشخص کند.

بیایید ابتدا تطبیق قبلی را حذف کنیم QBF.

m_tool.remove('QBF')

بعد، باید الگوی جدید خود را تعریف کنیم:


p1 = ({'LOWER': 'quick'}, {'IS_PUNCT': True, 'OP':'*'}, {'LOWER': 'brown'}, {'IS_PUNCT': True, 'OP':'*'}, {'LOWER': 'fox'})
m_tool.add('QBF', None, p1)

الگو p1 با تمام عباراتی که یک یا چند علامت نگارشی در عبارت وجود دارد مطابقت خواهد داشت quick brown fox. بیایید اکنون سند خود را برای فیلتر تعریف کنیم:

sentence = nlp(u'The quick--brown--fox jumps over the  quick-brown---fox')

می توانید ببینید سند ما دارای دو عبارت quick–brown–fox و quick-brown—fox است که باید با الگوی ما مطابقت داشته باشد. بیایید تطبیق خود را در سند اعمال کنیم و نتایج را ببینیم:

phrase_matches = m_tool(sentence)

for match_id, start, end in phrase_matches:
    string_id = nlp.vocab.strings(match_id)  
    span = sentence(start:end)                   
    print(match_id, string_id, start, end, span.text)

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

12825528024649263697 QBF 1 6 quick--brown--fox
12825528024649263697 QBF 10 15 quick-brown---fox

از خروجی می بینید که تطبیق دهنده ما با موفقیت این دو عبارت را مطابقت داده است.

تطبیق مبتنی بر عبارت

در بخش آخر، دیدیم که چگونه می‌توانیم قوانینی را تعریف کنیم که بتوان از آنها برای شناسایی عبارات از سند استفاده کرد. علاوه بر تعریف قوانین، می‌توانیم مستقیماً عباراتی را که به دنبال آن هستیم، مشخص کنیم.
این یک روش کارآمدتر برای تطبیق عبارت است.

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

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

import bs4 as bs  
import urllib.request  
import re  
import nltk

scrapped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')  
article = scrapped_data .read()

parsed_article = bs.BeautifulSoup(article,'lxml')

paragraphs = parsed_article.find_all('p')

article_text = ""

for p in paragraphs:  
    article_text += p.text
    
    
processed_article = article_text.lower()  
processed_article = re.sub('(^a-zA-Z)', ' ', processed_article )  
processed_article = re.sub(r'\s+', ' ', processed_article)

فیلمنامه به طور مفصل در مقاله من توضیح داده شده است روی پیاده سازی Word2Vec با gensim کتابخانه در پایتون اگر می‌خواهید بفهمید تجزیه در پایتون چگونه کار می‌کند، می‌توانید بروید و مقاله را بخوانید.

این processed_article حاوی سندی است که برای تطبیق عبارت استفاده خواهیم کرد.

مراحل انجام تطبیق عبارت کاملاً شبیه تطبیق مبتنی بر قانون است.

شیء تطبیق عبارت ایجاد کنید

به عنوان اولین گام، باید a را ایجاد کنید PhraseMatcher هدف – شی. اسکریپت زیر این کار را انجام می دهد:

import spacy
nlp = spacy.load('en_core_web_sm')


from spacy.matcher import PhraseMatcher
phrase_matcher = PhraseMatcher(nlp.vocab)

توجه داشته باشید که در بخش قبلی که a را ایجاد کردیم Matcher هدف – شی. در اینجا، در این مورد، ما در حال ایجاد یک PhraseMathcer هدف – شی.

فهرست عبارات را ایجاد کنید

در مرحله دوم، باید فهرستی از عبارات را ایجاد کنید تا مطابقت داشته باشد و سپس لیست را به اسناد spaCy NLP تبدیل کنید، همانطور که در اسکریپت زیر نشان داده شده است:

phrases = ('machine learning', 'robots', 'intelligent agents')

patterns = (nlp(text) for text in phrases)

در نهایت باید لیست عبارات خود را به عبارت matcher اضافه کنید.

phrase_matcher.add('AI', None, *patterns)

در اینجا نام همسان ما AI است.

اعمال تطبیق در سند

مانند تطبیق مبتنی بر قانون، دوباره باید تطبیق عبارت خود را در سند اعمال کنیم. با این حال، مقاله تجزیه شده ما در قالب سند spaCy نیست. بنابراین، ما مقاله خود را به قالب سند sPacy تبدیل می کنیم و سپس تطبیق عبارت خود را در مقاله اعمال می کنیم.

sentence = nlp (processed_article)

matched_phrases = phrase_matcher(sentence)

در خروجی، همه شناسه‌های تمام عبارات منطبق را به همراه نمایه‌های شروع و پایان آنها در سند خواهیم داشت، همانطور که در زیر نشان داده شده است:

((5530044837203964789, 37, 39),
 (5530044837203964789, 402, 404),
 (5530044837203964789, 693, 694),
 (5530044837203964789, 1284, 1286),
 (5530044837203964789, 3059, 3061),
 (5530044837203964789, 3218, 3220),
 (5530044837203964789, 3753, 3754),
 (5530044837203964789, 5212, 5213),
 (5530044837203964789, 5287, 5288),
 (5530044837203964789, 6769, 6771),
 (5530044837203964789, 6781, 6783),
 (5530044837203964789, 7496, 7498),
 (5530044837203964789, 7635, 7637),
 (5530044837203964789, 8002, 8004),
 (5530044837203964789, 9461, 9462),
 (5530044837203964789, 9955, 9957),
 (5530044837203964789, 10784, 10785),
 (5530044837203964789, 11250, 11251),
 (5530044837203964789, 12290, 12291),
 (5530044837203964789, 12411, 12412),
 (5530044837203964789, 12455, 12456))

برای دیدن مقدار رشته عبارات مطابقت داده شده، اسکریپت زیر را اجرا کنید:

for match_id, start, end in matched_phrases:
    string_id = nlp.vocab.strings(match_id)  
    span = sentence(start:end)                   
    print(match_id, string_id, start, end, span.text)

در خروجی، مقدار رشته عبارات منطبق را مطابق شکل زیر مشاهده خواهید کرد:

5530044837203964789 AI 37 39 intelligent agents
5530044837203964789 AI 402 404 machine learning
5530044837203964789 AI 693 694 robots
5530044837203964789 AI 1284 1286 machine learning
5530044837203964789 AI 3059 3061 intelligent agents
5530044837203964789 AI 3218 3220 machine learning
5530044837203964789 AI 3753 3754 robots
5530044837203964789 AI 5212 5213 robots
5530044837203964789 AI 5287 5288 robots
5530044837203964789 AI 6769 6771 machine learning
5530044837203964789 AI 6781 6783 machine learning
5530044837203964789 AI 7496 7498 machine learning
5530044837203964789 AI 7635 7637 machine learning
5530044837203964789 AI 8002 8004 machine learning
5530044837203964789 AI 9461 9462 robots
5530044837203964789 AI 9955 9957 machine learning
5530044837203964789 AI 10784 10785 robots
5530044837203964789 AI 11250 11251 robots
5530044837203964789 AI 12290 12291 robots
5530044837203964789 AI 12411 12412 robots
5530044837203964789 AI 12455 12456 robots

از خروجی می توانید هر سه عبارتی را که سعی کردیم جستجو کنیم به همراه فهرست شروع و پایان آنها و شناسه رشته ها را مشاهده کنید.

کلمات را متوقف کنید

قبل از اینکه این مقاله را به پایان برسانیم، فقط می خواستم لمس کنم روی مفهوم کلمات توقف کلمات توقف، کلمات انگلیسی مانند “the”، “a”، “an” و غیره هستند که معنای خاص خود را ندارند. کلمات توقف اغلب برای کارهای NLP مانند طبقه بندی متن یا مدل سازی زبان چندان مفید نیستند. بنابراین اغلب بهتر است قبل از پردازش بیشتر سند، این کلمات توقف را حذف کنید.

کتابخانه spaCy شامل 305 کلمه توقف است. علاوه بر این، بسته به نیاز خود، می‌توانیم کلمات توقف را نیز از کتابخانه spaCy اضافه یا حذف کنیم.

برای دیدن کلمات توقف پیش‌فرض spaCy می‌توانیم استفاده کنیم stop_words ویژگی مدل spaCy همانطور که در زیر نشان داده شده است:

import spacy
sp = spacy.load('en_core_web_sm')
print(sp.Defaults.stop_words)

در خروجی، تمام کلمات توقف sPacy را خواهید دید:

{'less', 'except', 'top', 'me', 'three', 'fifteen', 'a', 'is', 'those', 'all', 'then', 'everyone', 'without', 'must', 'has', 'any', 'anyhow', 'keep', 'through', 'bottom', 'get', 'indeed', 'it', 'still', 'ten', 'whatever', 'doing', 'though', 'eight', 'various', 'myself', 'across', 'wherever', 'himself', 'always', 'thus', 'am', 'after', 'should', 'perhaps', 'at', 'down', 'own', 'rather', 'regarding', 'which', 'anywhere', 'whence', 'would', 'been', 'how', 'herself', 'now', 'might', 'please', 'behind', 'every', 'seems', 'alone', 'from', 'via', 'its', 'become', 'hers', 'there', 'front', 'whose', 'before', 'against', 'whereafter', 'up', 'whither', 'two', 'five', 'eleven', 'why', 'below', 'out', 'whereas', 'serious', 'six', 'give', 'also', 'became', 'his', 'anyway', 'none', 'again', 'onto', 'else', 'have', 'few', 'thereby', 'whoever', 'yet', 'part', 'just', 'afterwards', 'mostly', 'see', 'hereby', 'not', 'can', 'once', 'therefore', 'together', 'whom', 'elsewhere', 'beforehand', 'themselves', 'with', 'seem', 'many', 'upon', 'former', 'are', 'who', 'becoming', 'formerly', 'between', 'cannot', 'him', 'that', 'first', 'more', 'although', 'whenever', 'under', 'whereby', 'my', 'whereupon', 'anyone', 'toward', 'by', 'four', 'since', 'amongst', 'move', 'each', 'forty', 'somehow', 'as', 'besides', 'used', 'if', 'name', 'when', 'ever', 'however', 'otherwise', 'hundred', 'moreover', 'your', 'sometimes', 'the', 'empty', 'another', 'where', 'her', 'enough', 'quite', 'throughout', 'anything', 'she', 'and', 'does', 'above', 'within', 'show', 'in', 'this', 'back', 'made', 'nobody', 'off', 're', 'meanwhile', 'than', 'neither', 'twenty', 'call', 'you', 'next', 'thereupon', 'therein', 'go', 'or', 'seemed', 'such', 'latterly', 'already', 'mine', 'yourself', 'an', 'amount', 'hereupon', 'namely', 'same', 'their', 'of', 'yours', 'could', 'be', 'done', 'whole', 'seeming', 'someone', 'these', 'towards', 'among', 'becomes', 'per', 'thru', 'beyond', 'beside', 'both', 'latter', 'ours', 'well', 'make', 'nowhere', 'about', 'were', 'others', 'due', 'yourselves', 'unless', 'thereafter', 'even', 'too', 'most', 'everything', 'our', 'something', 'did', 'using', 'full', 'while', 'will', 'only', 'nor', 'often', 'side', 'being', 'least', 'over', 'some', 'along', 'was', 'very', 'روی', 'into', 'nine', 'noone', 'several', 'i', 'one', 'third', 'herein', 'but', 'further', 'here', 'whether', 'because', 'either', 'hereafter', 'really', 'so', 'somewhere', 'we', 'nevertheless', 'last', 'had', 'they', 'thence', 'almost', 'ca', 'everywhere', 'itself', 'no', 'ourselves', 'may', 'wherein', 'take', 'around', 'never', 'them', 'to', 'until', 'do', 'what', 'say', 'twelve', 'nothing', 'during', 'sixty', 'sometime', 'us', 'fifty', 'much', 'for', 'other', 'hence', 'he', 'put'}

همچنین می توانید بررسی کنید که آیا یک کلمه یک کلمه توقف است یا نه. برای این کار می توانید از is_stop ویژگی مطابق شکل زیر:

sp.vocab('wonder').is_stop

از آنجایی که “عجب” یک کلمه توقف فضایی نیست، خواهید دید False در خروجی

برای افزودن یا حذف کلمات توقف در spaCy، می توانید استفاده کنید sp.Defaults.stop_words.add() و sp.Defaults.stop_words.remove() روش ها به ترتیب

sp.Defaults.stop_words.add('wonder')

بعد، ما باید تنظیم کنیم is_stop برای wonder به “درست” همانطور که در زیر نشان داده شده است:

sp.vocab('wonder').is_stop = True

نتیجه

تطبیق عبارات و واژگان یکی از مهمترین وظایف پردازش زبان طبیعی است. در این مقاله، بحث خود را در مورد روش استفاده از پایتون برای انجام تطبیق مبتنی بر قانون و عبارت ادامه دادیم. علاوه بر این، کلمات توقف spaCy را نیز دیدیم.

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

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



منتشر شده در 1403-01-24 04:03:05

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

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

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