از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون برای NLP: تطبیق واژگان و عبارت با SpaCy
سرفصلهای مطلب
این سومین مقاله از این سری مقالات است روی پایتون برای پردازش زبان طبیعی در مقاله قبلی دیدیم که چگونه 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