از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
NLP ساده در پایتون با TextBlob: Lemmatization
سرفصلهای مطلب
معرفی
TextBlob یک بسته ساخته شده است روی در بالای دو بسته دیگر، یکی از آنها Natural Language Toolkit نام دارد که عمدتاً به صورت مخفف آن شناخته می شود. NLTK، و دیگری است الگو. NLTK یک بسته سنتی است که برای پردازش متن یا پردازش زبان طبیعی (NLP)و Pattern عمدتاً برای وب کاوی ساخته شده است.
TextBlob به گونهای طراحی شده است که یادگیری و دستکاری آن آسانتر از NLTK باشد، در حالی که همان وظایف مهم NLP مانند واژهسازی، تحلیل احساسات، ریشهگذاری، برچسبگذاری POS، استخراج عبارت اسمی، طبقهبندی، ترجمه و موارد دیگر را حفظ میکند. می توانید لیست کاملی از وظایف را مشاهده کنید روی را TextBlob PyPI page.
اگر به دنبال یک نمای کلی از بسیاری از وظایف NLP هستید که میتوانند با TextBlob اجرا شوند، به راهنمای «Python for NLP: مقدمهای بر کتابخانه TextBlob» نگاهی بیندازید.
هیچ پیش نیاز فنی خاصی برای استفاده از TextBlob مورد نیاز نیست. به عنوان مثال، بسته برای هر دو پایتون 2 و 3 قابل اجرا است (Python >= 2.7 یا >= 3.5).
همچنین، در صورتی که هیچ گونه اطلاعات متنی در دسترس ندارید، TextBlob مجموعه های لازم از داده های زبان (معمولاً متون) را ارائه می دهد که به نام بدنه ها، از پایگاه داده NLTK.
نصب TextBlob
بیایید با نصب TextBlob شروع کنیم. اگر از a استفاده می کنید terminal، command-line، یا خط فرمان، می توانید وارد کنید:
$ pip install textblob
در غیر این صورت، اگر از a Jupyter Notebook، می توانید دستور را مستقیماً از notebook با اضافه کردن علامت تعجب !
در ابتدای آموزش:
!pip install textblob
توجه: این process به دلیل تعداد زیاد الگوریتمها و مجموعههایی که این کتابخانه دارد، ممکن است کمی طول بکشد.
پس از نصب TextBlob، برای داشتن نمونه متنی، می توانید با اجرای دستورات متنی را دانلود کنید. python -m textblob.download_corpora
فرمان یک بار دیگر، می توانید آن را مستقیماً در خط فرمان یا در a اجرا کنید notebook قبل از آن با علامت تعجب.
هنگام اجرای دستور، باید خروجی زیر را ببینید:
$ python -m textblob.download_corpora
(nltk_data) Downloading package brown to /Users/csamp/nltk_data...
(nltk_data) Package brown is already up-to-date!
(nltk_data) Downloading package punkt to /Users/csamp/nltk_data...
(nltk_data) Package punkt is already up-to-date!
(nltk_data) Downloading package wordnet to /Users/csamp/nltk_data...
(nltk_data) Package wordnet is already up-to-date!
(nltk_data) Downloading package averaged_perceptron_tagger to
(nltk_data) /Users/csamp/nltk_data...
(nltk_data) Package averaged_perceptron_tagger is already up-to-
(nltk_data) date!
(nltk_data) Downloading package conll2000 to /Users/csamp/nltk_data...
(nltk_data) Unzipping corpora/conll2000.zip.
(nltk_data) Downloading package movie_reviews to
(nltk_data) /Users/csamp/nltk_data...
(nltk_data) Unzipping corpora/movie_reviews.zip.
Finished.
ما قبلا بسته TextBlob و مجموعه های آن را نصب کرده ایم. حال، بیایید بیشتر در مورد لمت سازی بدانیم.
برای محتوای بیشتر TextBlob، NLP ساده در پایتون با TextBlob: Tokenization، NLP ساده در پایتون با TextBlob: تشخیص N-Grams و تجزیه و تحلیل احساسات در پایتون با راهنمای TextBlob را بررسی کنید.
Lemmatization چیست؟
قبل از اینکه عمیق تر به حوزه NLP بروید، باید بتوانید برخی از اصطلاحات کلیدی را بشناسید:
مجموعه نوشته ها (یا پیکرها به صورت جمع) – مجموعه خاصی از داده های زبان (مثلاً متون) است. به عنوان مثال، Corpora معمولاً برای آموزش مدلهای مختلف طبقهبندی متن یا تحلیل احساسات استفاده میشود.
لما – کلمه ای است که در فرهنگ لغت به دنبال آن می گردید. به عنوان مثال، اگر می خواهید به تعریف فعل “runs” نگاه کنید، باید “run” را جستجو کنید.
ساقه – بخشی از یک کلمه است که هرگز تغییر نمی کند.
خود لماتیزاسیون چیست؟
Lemmatization است process به دست آوردن لم کلمات از یک پیکره.
نمونه ای از این موضوع می تواند جمله زیر باشد:
- ورودی (جسم): آلیس فکر می کند گم شده است، اما بعد شروع به یافتن خود می کند
- خروجی (لم): | آلیس | فکر کن | او | است | گم شده | اما | سپس | شروع | به | پیدا کردن | خودش |
توجه داشته باشید که هر کلمه در جمله ورودی با توجه به بافت آن در جمله اصلی به صورت لماتیزه می شود. به عنوان مثال، “آلیس” یک اسم خاص است، بنابراین ثابت می ماند و افعال “فکر می کند” و “شروع می کند” در شکل های پایه خود “اندیشیدن” و “شروع” ارجاع می شوند.
Lemmatization یکی از مراحل اساسی پردازش زبان است. کلمات را برای آنها به ارمغان می آورد root فرم ها یا لم ها، که اگر در فرهنگ لغت به دنبال آنها باشیم، آنها را پیدا می کنیم.
در مورد TextBlob، واژهسازی مبتنی است روی پایگاه داده ای به نام ورد نتکه توسط دانشگاه پرینستون توسعه و نگهداری می شود. در پشت صحنه، TextBlob از WordNet استفاده می کند مورفی پردازنده برای به دست آوردن لم برای یک کلمه.
توجه داشته باشید: جهت مراجعه بیشتر روی روش عملکرد واژهسازی در TextBlob، میتوانید نگاهی به آن بیندازید مستندات.
احتمالاً تغییرات قابل توجهی را با کلمه نویسی متوجه نخواهید شد مگر اینکه با حجم زیادی از متن کار کنید. در آن صورت، واژهسازی به کاهش اندازه کلماتی که ممکن است در جستجوی آنها باشیم کمک میکند و در عین حال سعی میکنیم متن آنها را در جمله حفظ کنیم. میتوان آن را بیشتر در توسعه مدلهای ترجمه ماشینی، بهینهسازی موتورهای جستجو یا سؤالات مختلف تجاری به کار برد.
پیاده سازی Lemmatization در کد
اول از همه، لازم است یک شی TextBlob ایجاد کنید و یک پیکره نمونه تعریف کنید که بعداً به صورت لماتیزه خواهد شد. در این مرحله اولیه، میتوانید یک رشته متن برای استفاده بنویسید یا تعریف کنید (مانند این راهنما)، یا میتوانیم از نمونهای از مجموعه NLTK که دانلود کردهایم استفاده کنیم. بیایید با دومی برویم.
انتخاب یک بررسی از NLTK Corpus
به عنوان مثال، بیایید سعی کنیم لم های یک نقد فیلم را که در مجموعه است به دست آوریم. برای انجام این کار، ما import هم کتابخانه TextBlob و هم movie_reviews
از nltk.corpus
بسته:
from textblob import TextBlob
from nltk.corpus import movie_reviews
پس از وارد کردن، میتوانیم نگاهی به فایلهای نقد فیلم با استفاده از آن بیاندازیم fileids()
روش. از آنجایی که این کد در a اجرا می شود Jupyter نوت بوک، ما می توانیم مستقیما اجرا کنیم:
movie_reviews.fileids()
با این کار لیستی از 2000 نام فایل متنی حاوی نظرات منفی و مثبت باز می گردد:
('neg/cv000_29416.txt',
'neg/cv001_19502.txt',
'neg/cv002_17424.txt',
'neg/cv003_12683.txt',
'neg/cv004_12641.txt',
'neg/cv005_29357.txt',
'neg/cv006_17022.txt',
'neg/cv007_4992.txt',
'neg/cv008_29326.txt',
'neg/cv009_29417.txt',
...)
توجه داشته باشید: اگر کد را به روش دیگری اجرا می کنید، به عنوان مثال، در a terminal یا IDE، شما می توانید print پاسخ با اجرا print(movie_reviews.fileids())
.
با نگاه کردن به نفی در نام فایل، می توان فرض کرد که لیست با بررسی های منفی شروع می شود و با بررسی های مثبت به پایان می رسد. با نمایه سازی از انتهای لیست می توانیم به بررسی مثبت نگاه کنیم. در اینجا، ما 1989مین بررسی را انتخاب می کنیم:
movie_reviews.fileids()(-10)
این منجر به:
'pos/cv990_11591.txt'
برای بررسی جملات مروری، میتوانیم نام نقد را به آن منتقل کنیم .sents()
متد، که لیستی از تمام جملات بازبینی را خروجی می دهد:
movie_reviews.sents('pos/cv990_11591.txt')
(('the', 'relaxed', 'dude', 'rides', 'a', 'roller', 'coaster',
'the', 'big', 'lebowski', 'a', 'film', 'review', 'by', 'michael',
'redman', 'copyright', '1998', 'by', 'michael', 'redman', 'the',
'most', 'surreal', 'situations', 'are', 'ordinary', 'everyday',
'life', 'as', 'viewed', 'by', 'an', 'outsider', '.'), ('when',
'those', 'observers', 'are', 'joel', 'and', 'ethan', 'coen', ',',
'the', 'surreal', 'becomes', 'bizarre', '.'), ...)
بیایید این لیست را در متغیری به نام ذخیره کنیم pos_review
:
pos_review = movie_reviews.sents("pos/cv990_11591.txt")
len(pos_review)
در اینجا می بینیم که 63 جمله وجود دارد. اکنون میتوانیم یک جمله را برای کلمهسازی انتخاب کنیم، به عنوان مثال، جمله پانزدهم:
sentence = pos_review(16)
type(sentence)
ایجاد یک شیء TextBlob
پس از انتخاب جمله، باید یک شی TextBlob ایجاد کنیم تا بتوانیم به آن دسترسی داشته باشیم .lemmatize()
روش. اشیاء TextBlob باید از رشته ها ایجاد شوند. از آنجایی که ما یک لیست داریم، می توانیم آن را به یک رشته تبدیل کنیم string.join()
روش، پیوستن بر اساس روی فضاهای خالی:
sentence_string = ' '.join(sentence)
اکنون که رشته جمله خود را داریم، می توانیم آن را به سازنده TextBlob ارسال کنیم:
blob_object = TextBlob(sentence_string)
هنگامی که شی TextBlob را داشته باشیم، می توانیم عملیات مختلفی مانند lemmatization را انجام دهیم.
خلاصه سازی یک جمله
در نهایت، برای به دست آوردن واژههای واژهبندی، به سادگی عبارت را بازیابی میکنیم words
ویژگی ایجاد شده blob_object
. این لیستی حاوی اشیاء Word به ما می دهد که بسیار شبیه به اشیاء رشته ای عمل می کنند:
corpus_words = blob_object.words
print('sentence:', corpus_words)
number_of_tokens = len(corpus_words)
print('\nnumber of tokens:', number_of_tokens)
دستورات خروجی باید موارد زیر را به شما بدهد:
sentence: ('the', 'carpet', 'is', 'important', 'to', 'him', 'because', 'it', 'pulls', 'the', 'room', 'together', 'not', 'surprisingly', 'since', 'it', 's', 'virtually', 'the', 'only', 'object', 'there')
number of tokens: 22
برای مفهوم سازی کلمات، فقط می توانیم از آن استفاده کنیم .lemmatize()
روش:
corpus_words.lemmatize()
این به ما یک شی WordList اصطلاحی می دهد:
WordList(('the', 'carpet', 'is', 'important', 'to', 'him', 'because', 'it', 'pull', 'the',
'room', 'together', 'not', 'surprisingly', 'since', 'it', 's', 'virtually', 'the', 'only',
'object', 'there'))
از آنجایی که خواندن این ممکن است کمی دشوار باشد، می توانیم یک حلقه و انجام دهیم print هر کلمه قبل و بعد از کلمه نویسی:
for word in corpus_words:
print(f'{word} | {word.lemmatize()}')
این منجر به:
the | the
carpet | carpet
is | is
important | important
to | to
him | him
because | because
it | it
pulls | pull
the | the
room | room
together | together
not | not
surprisingly | surprisingly
since | since
it | it
s | s
virtually | virtually
the | the
only | only
object | object
there | there
توجه کنید که چگونه “کشش” به “کشش” تغییر کرد. کلمات دیگر، علاوه بر “آن است”، نیز همانطور که انتظار می رفت، به صورت لماتیک شدند. همچنین میتوانیم ببینیم که «آن» به دلیل آپستروف از هم جدا شده است. این نشان می دهد که ما می توانیم بیشتر پیش ازprocess جمله به طوری که «آن» به جای «آن» و «س» یک کلمه در نظر گرفته شود.
تفاوت بین Lemmatization و Stemming
Lemmatization اغلب با تکنیک دیگری به نام stemming اشتباه گرفته می شود. این سردرگمی به این دلیل رخ می دهد که هر دو تکنیک معمولاً برای کاهش کلمات به کار می روند. در حالی که واژه سازی از فرهنگ لغت و تمرکز استفاده می کند روی بافت کلمات در یک جمله، تلاش برای حفظ آن، ریشه یابی از قوانین برای حذف پسوندهای کلمه استفاده می کند، تمرکز روی به دست آوردن ریشه یک کلمه
بیایید به سرعت حلقه for خود را تغییر دهیم تا به این تفاوت ها نگاه کنیم:
print('word | lemma | stem\n')
for word in corpus_words:
print(f'{word} | {word.lemmatize()} | {word.stem()}')
این خروجی:
the | the | the
carpet | carpet | carpet
is | is | is
important | important | import
to | to | to
him | him | him
because | because | becaus
it | it | it
pulls | pull | pull
the | the | the
room | room | room
together | together | togeth
not | not | not
surprisingly | surprisingly | surprisingli
since | since | sinc
it | it | it
s | s | s
virtually | virtually | virtual
the | the | the
only | only | onli
object | object | object
there | there | there
وقتی به خروجی بالا نگاه می کنیم، می توانیم ببینیم که چگونه stemming می تواند مشکل ساز باشد. «مهم» را به «import”، از دست دادن تمام معنی کلمه، که حتی می توان آن را اکنون یک فعل در نظر گرفت؛ “زیرا” به “چون”، که کلمه ای است که وجود ندارد، همان “با هم”، “سورپرایزینگلی”، “سینک” ، “onli”.
تفاوت های واضحی بین ریشه یابی و ریشه یابی وجود دارد. درک زمان استفاده از هر تکنیک کلید اصلی است. فرض کنید در حال بهینه سازی جستجوی کلمه هستید و تمرکز روی آن است روی اگر بتوانید حداکثر تعداد کلمات مشابه را پیشنهاد دهید، از کدام تکنیک استفاده می کنید؟ وقتی بافت کلمه مهم نیست، و میتوانیم «مهم» را با «بازیابی کنیم.import”، انتخاب واضح است. از طرف دیگر، اگر شما کار می کنید روی مقایسه متن سند، که در آن موقعیت کلمات در یک جمله مهم است، و سیاق “اهمیت” باید حفظ شود و با فعل اشتباه گرفته نشود.import”، بهترین انتخاب لمات سازی است.
در آخرین سناریو، فرض کنید در حال کار هستید روی یک جستجوی کلمه و سپس مقایسه متن سند بازیابی شده، از چه چیزی استفاده خواهید کرد؟ هم ریشه و هم ریشه یابی.
ما تفاوت های بین ریشه یابی و اصطلاح سازی را درک کرده ایم. حالا بیایید ببینیم چگونه میتوانیم به جای یک جمله، کل بررسی را به صورت مفهومی بیان کنیم.
خلاصه سازی یک بررسی
برای بیان مفهومی کل بررسی، فقط باید آن را اصلاح کنیم .join()
. به جای پیوستن کلمات در یک جمله، جملات را در یک مرور میپیوندیم:
corpus_words = '\n'.join(' '.join(sentence) for sentence in pos_review)
پس از تبدیل پیکره به یک رشته، میتوانیم به همان روشی که برای جملهای بود، آن را به صورت کلمهبندی کنیم:
blob_object = TextBlob(pos_rev)
corpus_words = blob_object.words
corpus_words.lemmatize()
این یک شی WordList با متن بررسی کامل ایجاد می کند. در اینجا، ما برخی از قسمت ها را با بیضی حذف می کنیم (...)
از آنجایی که بررسی بزرگ است، اما شما می توانید آن را به شکل یکپارچه آن ببینید. می توانیم جمله خود را در وسط آن ببینیم:
WordList(('the', 'relaxed', 'dude', 'rides', 'a', 'roller', 'coaster', 'the', 'big',
'lebowski', 'a', 'film', 'review', 'by', 'michael', 'redman', 'copyright', '1998', 'by',
'michael', 'redman', 'the', 'most', 'surreal', 'situations', 'are', 'ordinary', 'everyday',
'life', 'as', 'viewed', 'by', 'an', 'outsider', 'when', 'those', 'observers', 'are', 'joel',
(...)
'the', 'carpet', 'is', 'important', 'to', 'him', 'because', 'it', 'pulls', 'the', 'room',
'together', 'not', 'surprisingly', 'since', 'it', 's', 'virtually', 'the', 'only', 'object',
'there'
(...)
'com', 'is', 'the', 'eaddress', 'for', 'estuff'))
نتیجه
پس از واژه سازی جمله و بررسی، می بینیم که هر دو ابتدا کلمات پیکره را استخراج می کنند. این بدان معناست که واژهسازی در سطح کلمه اتفاق میافتد، که همچنین به این معنی است که میتوان آن را به یک کلمه، یک جمله یا یک متن کامل اعمال کرد. برای یک کلمه یا هر مجموعه ای از کلمات کار می کند.
این همچنین نشان می دهد که ممکن است کندتر باشد زیرا لازم است ابتدا متن را به نشانه ها تقسیم کنید تا بعداً آن را اعمال کنید. و از آنجایی که واژهسازی مختص به زمینه است، همانطور که دیدیم، پیشپردازش خوب متن قبل از استفاده از آن، حصول اطمینان از تفکیک صحیح به نشانهها و بخش مناسب برچسبگذاری گفتار نیز بسیار مهم است. هر دو نتایج را افزایش می دهند.
اگر با برچسب گذاری بخشی از گفتار (برچسب گذاری POS) آشنا نیستید، راهنمای پایتون ما را برای NLP: قسمت هایی از برچسب زدن گفتار و راهنمای تشخیص نهاد نامگذاری شده بررسی کنید.
ما همچنین دیدهایم که چگونه واژهسازی با ریشه کردن، تکنیک دیگری برای کاهش کلمات که بافت آنها را حفظ نمیکند، متفاوت است. به همین دلیل معمولاً سریعتر است.
راه های زیادی برای انجام واژه سازی وجود دارد و TextBlob یک کتابخانه عالی برای شروع کار با NLP است. این یک API ساده ارائه می دهد که به کاربران اجازه می دهد تا به سرعت شروع به کار کنند روی وظایف NLP اگر در پروژهای از واژهسازی استفاده کردهاید یا قصد استفاده از آن را دارید، نظر بدهید.
کد نویسی مبارک!
(برچسبها به ترجمه)# python
منتشر شده در 1402-12-31 08:41:04