از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
خلاصه سازی متن با NLTK در پایتون
سرفصلهای مطلب
معرفی
در حال نوشتن این مقاله، 1,907,223,370 وب سایت فعال هستند روی اینترنت و 2,722,460 ایمیل در ثانیه ارسال می شود. این حجم غیر قابل باوری از داده است. دریافت بینش از چنین حجم عظیمی از داده برای کاربر غیرممکن است. علاوه بر این، بخش بزرگی از این داده ها یا اضافی هستند یا حاوی اطلاعات مفید زیادی نیستند. کارآمدترین راه برای دسترسی به مهم ترین بخش های داده ها، بدون نیاز به غربال کردن داده های زائد و بی اهمیت، خلاصه کردن داده ها به گونه ای است که فقط حاوی اطلاعات غیر زائد و مفید باشد. داده ها می توانند به هر شکلی مانند صدا، تصویر، تصویر و متن باشند. در این مقاله خواهیم دید که چگونه می توانیم از تکنیک های خلاصه سازی خودکار متن برای خلاصه سازی داده های متنی استفاده کنیم.
خلاصه سازی متن زیر دامنه ای از پردازش زبان طبیعی (NLP) است که با استخراج خلاصه ها از تکه های عظیم متون سروکار دارد. دو نوع تکنیک اصلی برای خلاصه سازی متن وجود دارد: تکنیک های مبتنی بر NLP و تکنیک های مبتنی بر یادگیری عمیق. در این مقاله، یک تکنیک ساده مبتنی بر NLP برای خلاصه سازی متن را خواهیم دید. ما در این مقاله از هیچ کتابخانه یادگیری ماشینی استفاده نخواهیم کرد. بلکه ما به سادگی استفاده خواهیم کرد کتابخانه NLTK پایتون برای خلاصه کردن مقالات ویکی پدیا
مراحل خلاصه سازی متن
مراحل خلاصه سازی متن را با استفاده از تکنیک های NLP با کمک یک مثال توضیح خواهم داد.
پاراگراف زیر یکی از سخنرانی های معروف دنزل واشنگتن در چهل و هشتمین مراسم اهدای جوایز تصویری NAACP است:
بنابراین، به کار خود ادامه دهید. به تلاش ادامه بده هرگز تسلیم نشوید. اگر هفت بار هم زمین خوردی، باز هم برای بار هشتم بایست. آسانی تهدیدی بزرگتر از سختی برای پیشرفت است. آسانی تهدیدی بزرگتر از سختی برای پیشرفت است. بنابراین، به حرکت ادامه دهید، به رشد خود ادامه دهید، به یادگیری ادامه دهید. می بینمت سر کار
از پاراگراف بالا می توان فهمید که او اساساً به دیگران انگیزه می دهد تا سخت کار کنند و هرگز تسلیم نشوند. برای خلاصه کردن پاراگراف بالا با استفاده از تکنیکهای مبتنی بر NLP، باید مجموعهای از مراحل را دنبال کنیم که در بخشهای بعدی توضیح داده خواهد شد.
تبدیل پاراگراف ها به جملات
ابتدا باید کل پاراگراف را به جمله تبدیل کنیم. رایج ترین روش تبدیل پاراگراف ها به جملات، تقسیم پاراگراف هر زمان که نقطه ای با آن مواجه شد، است. بنابراین اگر پاراگراف مورد بحث را به جملات تقسیم کنیم، جملات زیر به دست می آید:
- بنابراین، به کار خود ادامه دهید
- به تلاش ادامه بده
- هرگز تسلیم نشوید
- اگر هفت بار هم زمین خوردی، باز هم برای بار هشتم بایست
- آسانی تهدیدی بزرگتر از سختی برای پیشرفت است
- آسانی تهدیدی بزرگتر از سختی برای پیشرفت است
- بنابراین، به حرکت ادامه دهید، به رشد خود ادامه دهید، به یادگیری ادامه دهید
- می بینمت سر کار
پیش پردازش متن
پس از تبدیل پاراگراف به جمله، باید تمام کاراکترهای خاص را حذف کنیم، کلمات و اعداد را از تمام جملات متوقف کنیم. پس از پیش پردازش، جملات زیر را دریافت می کنیم:
- به کار ادامه دهید
- به تلاش ادامه بده
- هرگز نده
- سقوط هفت بار هشت
- کاهش سختی پیشرفت تهدید بیشتر
- کاهش سختی پیشرفت تهدید بیشتر
- به حرکت ادامه بده به رشد ادامه بده یاد بگیر
- کار را ببینید
توکن کردن جملات
ما باید تمام جملات را نشانه گذاری کنیم تا تمام کلمات موجود در جملات را بدست آوریم. پس از نشانه گذاری جملات، لیستی از کلمات زیر را دریافت می کنیم:
('keep',
'working',
'keep',
'striving',
'never',
'give',
'fall',
'seven',
'time',
'get',
'eight',
'ease',
'greater',
'threat',
'progress',
'hardship',
'ease',
'greater',
'threat',
'progress',
'hardship',
'keep',
'moving',
'keep',
'growing',
'keep',
'learning',
'see',
'work')
فراوانی وزنی وقوع را پیدا کنید
در مرحله بعد باید فراوانی وزنی وقوع همه کلمات را پیدا کنیم. ما می توانیم بسامد وزنی هر کلمه را با تقسیم بسامد آن بر فراوانی کلمه ای که بیشترین کلمه را پیدا می کند، پیدا کنیم. جدول زیر حاوی فرکانس های وزنی برای هر کلمه است:
کلمه | فرکانس | فرکانس وزنی |
---|---|---|
سهولت | 2 | 0.40 |
هشت | 1 | 0.20 |
سقوط | 1 | 0.20 |
گرفتن | 1 | 0.20 |
دادن | 1 | 0.20 |
بزرگتر | 2 | 0.40 |
در حال رشد | 1 | 0.20 |
سختی | 2 | 0.40 |
نگاه داشتن | 5 | 1.00 |
یادگیری | 1 | 0.20 |
در حال حرکت | 1 | 0.20 |
هرگز | 1 | 0.20 |
پیش رفتن | 2 | 0.40 |
دیدن | 1 | 0.20 |
هفت | 1 | 0.20 |
تلاش | 1 | 0.20 |
تهدید | 2 | 0.40 |
زمان | 1 | 0.20 |
کار کردن | 1 | 0.20 |
کار کردن | 1 | 0.20 |
از آنجایی که کلمه “keep” بیشترین فراوانی 5 را دارد، بنابراین فراوانی وزنی همه کلمات از تقسیم تعداد وقوع آنها بر 5 محاسبه شده است.
کلمات را با فرکانس وزنی در جملات اصلی جایگزین کنید
مرحله آخر این است که فرکانس وزنی را به جای کلمات مربوطه در جملات اصلی وصل کنید و مجموع آنها را بیابید. ذکر این نکته ضروری است که فرکانس وزنی برای کلمات حذف شده در حین پیش پردازش (توقف کلمات، علائم نگارشی، ارقام و غیره) صفر خواهد بود و بنابراین نیازی به اضافه کردن نیست، همانطور که در زیر ذکر شده است:
جمله | مجموع فرکانس های وزنی |
---|---|
بنابراین، به کار خود ادامه دهید | 1 + 0.20 = 1.20 |
به تلاش ادامه بده | 1 + 0.20 = 1.20 |
هرگز تسلیم نشوید | 0.20 + 0.20 = 0.40 |
اگر هفت بار هم زمین خوردی، باز هم برای بار هشتم بایست | 0.20 + 0.20 + 0.20 + 0.20 + 0.20 = 1.0 |
آسانی تهدیدی بزرگتر از سختی برای پیشرفت است | 0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0 |
آسانی تهدیدی بزرگتر از سختی برای پیشرفت است | 0.40 + 0.40 + 0.40 + 0.40 + 0.40 = 2.0 |
بنابراین، به حرکت ادامه دهید، به رشد خود ادامه دهید، به یادگیری ادامه دهید | 1 + 0.20 + 1 + 0.20 + 1 + 0.20 = 3.60 |
می بینمت سر کار | 0.20 + 0.20 = 0.40 |
مرتب سازی جملات به ترتیب نزولی از مجموع
مرحله آخر این است که جملات را به ترتیب معکوس مجموع آنها مرتب کنید. جملاتی که بیشترین فرکانس را دارند متن را خلاصه می کنند. به عنوان مثال، به جمله ای با بیشترین مجموع فرکانس های وزنی نگاه کنید:
بنابراین، به حرکت ادامه دهید، به رشد خود ادامه دهید، به یادگیری ادامه دهید
شما به راحتی می توانید قضاوت کنید که پاراگراف چیست. به همین ترتیب، می توانید جمله ای را با دومین مجموع فرکانس های وزنی اضافه کنید تا خلاصه آموزنده تری داشته باشید. به جملات زیر دقت کنید:
بنابراین، به حرکت ادامه دهید، به رشد خود ادامه دهید، به یادگیری ادامه دهید. آسانی تهدیدی بزرگتر از سختی برای پیشرفت است.
این دو جمله خلاصه بسیار خوبی از آنچه در پاراگراف گفته شد ارائه می دهد.
خلاصه مقالات ویکی پدیا
اکنون می دانیم که چگونه process خلاصه سازی متن با استفاده از یک تکنیک بسیار ساده NLP کار می کند. در این بخش، از کتابخانه NLTK پایتون برای خلاصه کردن یک مقاله ویکیپدیا استفاده میکنیم.
واکشی مقالات از ویکی پدیا
قبل از اینکه بتوانیم مقالات ویکی پدیا را خلاصه کنیم، باید آنها را از وب بیاوریم. برای این کار از چند کتابخانه استفاده خواهیم کرد. اولین کتابخانه ای که باید دانلود کنیم این است سوپ زیبا که ابزار بسیار مفید پایتون برای خراش دادن وب است. برای دانلود ابزار Beautiful Soup دستور زیر را در خط فرمان اجرا کنید.
$ pip install beautifulsoup4
کتابخانه مهم دیگری که برای تجزیه XML و HTML به آن نیاز داریم، کتابخانه است lxml کتابخانه دستور زیر را در خط فرمان برای دانلود اجرا کنید lxml
:
$ pip install lxml
اکنون به مقداری کد پایتون اجازه می دهد تا داده ها را از وب خراش دهد. مقاله ای که میخواهیم بنویسیم مقاله ویکی پدیا است روی هوش مصنوعی. اسکریپت زیر را اجرا کنید:
import bs4 as bs
import urllib.request
import re
scraped_data = urllib.request.urlopen('https://en.wikipedia.org/wiki/Artificial_intelligence')
article = scraped_data.read()
parsed_article = bs.BeautifulSoup(article,'lxml')
paragraphs = parsed_article.find_all('p')
article_text = ""
for p in paragraphs:
article_text += p.text
در اسکریپت بالا ما ابتدا import کتابخانه های مهم مورد نیاز برای خراش دادن داده ها از وب. سپس از urlopen
تابع از urllib.request
ابزار برای خراش دادن داده ها بعد، باید تماس بگیریم read
تابع روی شی برگردانده شده توسط urlopen
عملکرد به منظور خواندن داده ها. برای تجزیه داده ها از BeautifulSoup
شی و آن را به شی داده خراشیده شده منتقل کنید article
و lxml
تجزیه کننده
در مقالات ویکیپدیا، تمام متن مقاله در داخل آن قرار میگیرد <p>
برچسب ها برای بازیابی متن باید تماس بگیریم find_all
تابع روی شی برگردانده شده توسط BeautifulSoup
. نام تگ به عنوان یک پارامتر به تابع ارسال می شود. این find_all
تابع تمام پاراگراف های مقاله را در قالب یک لیست برمی گرداند. تمام پاراگراف ها برای بازسازی مقاله ترکیب شده اند.
هنگامی که مقاله خراشیده شد، باید مقداری پیش پردازش انجام دهیم.
پیش پردازش
اولین مرحله پیش پردازش حذف منابع از مقاله است. ویکیپدیا، مراجع در کروشه مربع قرار میگیرند. اسکریپت زیر براکتهای مربع را حذف میکند و فاصلههای متعدد حاصل را با یک فاصله جایگزین میکند. به اسکریپت زیر دقت کنید:
article_text = re.sub(r'\((0-9)*\)', ' ', article_text)
article_text = re.sub(r'\s+', ' ', article_text)
این article_text
شی حاوی متن بدون براکت است. با این حال، ما نمی خواهیم چیز دیگری از مقاله حذف کنیم زیرا این مقاله اصلی است. ما دیگر اعداد، علائم نگارشی و کاراکترهای خاص را از این متن حذف نخواهیم کرد زیرا از این متن برای ایجاد خلاصه استفاده می کنیم و فراوانی کلمات وزن دار در این مقاله جایگزین می شود.
برای تمیز کردن متن و محاسبه فرکانس های وزنی، یک شی دیگر ایجاد می کنیم. به اسکریپت زیر دقت کنید:
formatted_article_text = re.sub('(^a-zA-Z)', ' ', article_text )
formatted_article_text = re.sub(r'\s+', ' ', formatted_article_text)
حالا دو شی داریم article_text
، که حاوی اصل مقاله و formatted_article_text
که حاوی مقاله قالب بندی شده است. ما استفاده خواهیم کرد formatted_article_text
برای ایجاد هیستوگرام فرکانس وزنی برای کلمات و جایگزینی این فرکانس های وزنی با کلمات موجود در article_text
هدف – شی.
تبدیل متن به جمله
در این مرحله ما داده ها را از قبل پردازش کرده ایم. در مرحله بعد، باید مقاله را به جملات تبدیل کنیم. ما استفاده خواهیم کردarticle_text
شیء برای توکن کردن مقاله به جمله از آنجایی که حاوی نقطه است. این formatted_article_text
هیچ علامت نگارشی ندارد و بنابراین نمی توان آن را با استفاده از نقطه نقطه به عنوان پارامتر به جملات تبدیل کرد.
اسکریپت زیر نشانه گذاری جمله را انجام می دهد:
sentence_list = nltk.sent_tokenize(article_text)
فراوانی وزنی وقوع را پیدا کنید
برای یافتن فراوانی وقوع هر کلمه از عبارت استفاده می کنیم formatted_article_text
متغیر. ما از این متغیر برای یافتن فراوانی وقوع استفاده کردیم زیرا حاوی علائم نگارشی، اعداد یا سایر کاراکترهای خاص نیست. به اسکریپت زیر دقت کنید:
stopwords = nltk.corpus.stopwords.words('english')
word_frequencies = {}
for word in nltk.word_tokenize(formatted_article_text):
if word not in stopwords:
if word not in word_frequencies.keys():
word_frequencies(word) = 1
else:
word_frequencies(word) += 1
در اسکریپت بالا، ابتدا تمام کلمات توقف انگلیسی را ذخیره می کنیم nltk
کتابخانه به a stopwords
متغیر. در مرحله بعد، تمام جملات و سپس کلمات مربوطه را حلقه می کنیم تا ابتدا بررسی کنیم که آیا آنها کلمات توقف هستند یا خیر. اگر نه، ما به بررسی وجود کلمات در ادامه میدهیم word_frequency
دیکشنری یعنی word_frequencies
، یا نه. اگر کلمه برای اولین بار با آن مواجه شد، به عنوان کلید به فرهنگ لغت اضافه می شود و مقدار آن 1 می شود. در غیر این صورت، اگر کلمه قبلاً در فرهنگ لغت وجود داشته باشد، مقدار آن به سادگی با 1 به روز می شود.
در نهایت، برای یافتن بسامد وزنی، میتوانیم به سادگی تعداد وقوع همه کلمات را بر فراوانی بیشترین کلمه تقسیم کنیم، همانطور که در زیر نشان داده شده است:
maximum_frequncy = max(word_frequencies.values())
for word in word_frequencies.keys():
word_frequencies(word) = (word_frequencies(word)/maximum_frequncy)
محاسبه نمرات جمله
ما اکنون فرکانس های وزنی را برای همه کلمات محاسبه کرده ایم. اکنون زمان محاسبه امتیازات هر جمله با افزودن فراوانی های وزنی کلماتی است که در آن جمله خاص وجود دارد. اسکریپت زیر نمرات جملات را محاسبه می کند:
sentence_scores = {}
for sent in sentence_list:
for word in nltk.word_tokenize(sent.lower()):
if word in word_frequencies.keys():
if len(sent.split(' ')) < 30:
if sent not in sentence_scores.keys():
sentence_scores(sent) = word_frequencies(word)
else:
sentence_scores(sent) += word_frequencies(word)
در اسکریپت بالا ابتدا یک خالی ایجاد می کنیم sentence_scores
فرهنگ لغت. کلیدهای این فرهنگ لغت، خود جملات و مقادیر، نمرات متناظر جملات خواهند بود. در مرحله بعد، هر جمله را در قسمت حلقه حلقه می کنیم sentence_list
و جمله را به کلمات تبدیل کنید.
سپس بررسی می کنیم که آیا کلمه در آن وجود دارد یا خیر word_frequencies
فرهنگ لغت. این بررسی از زمانی که ما ایجاد کردیم انجام می شود sentence_list
لیست از article_text
هدف – شی؛ روی از سوی دیگر، فرکانس کلمه با استفاده از محاسبه شد formatted_article_text
شی، که حاوی هیچ کلمه توقف، اعداد و غیره نیست.
ما جملات خیلی طولانی را در خلاصه نمیخواهیم، بنابراین، امتیاز را فقط برای جملاتی با کمتر از 30 کلمه محاسبه میکنیم (اگرچه میتوانید این پارامتر را برای مورد استفاده خود تغییر دهید). بعد، بررسی می کنیم که آیا این جمله در عبارت وجود دارد یا خیر sentence_scores
فرهنگ لغت یا نه اگر جمله وجود نداشت، آن را به آن اضافه می کنیم sentence_scores
فرهنگ لغت به عنوان یک کلید و بسامد وزنی کلمه اول جمله را به عنوان مقدار آن اختصاص دهید. برعکس، اگر جمله در فرهنگ لغت وجود داشته باشد، بسادگی فراوانی وزن کلمه را به مقدار موجود اضافه می کنیم.
گرفتن خلاصه
اکنون ما آن را داریم sentence_scores
فرهنگ لغت که شامل جملات با نمره مربوط به آنها است. برای خلاصه کردن مقاله، میتوانیم N جمله برتر با بالاترین امتیاز را بگیریم. اسکریپت زیر 7 جمله برتر را بازیابی و چاپ می کند روی صفحه نمایش
import heapq
summary_sentences = heapq.nlargest(7, sentence_scores, key=sentence_scores.get)
summary = ' '.join(summary_sentences)
print(summary)
در اسکریپت بالا از heapq
کتابخانه و تماس بگیرید nlargest
عملکردی برای بازیابی 7 جمله برتر با بالاترین امتیاز.
خلاصه خروجی به صورت زیر است:
هوش مصنوعی (AI) که گاهی اوقات هوش ماشینی نامیده می شود، هوشی است که توسط ماشین ها نشان داده می شود، برخلاف هوش طبیعی نشان داده شده توسط انسان ها و سایر حیوانات. ابزارهای زیادی در هوش مصنوعی استفاده می شود، از جمله نسخه های جستجو و بهینه سازی ریاضی، شبکه های عصبی مصنوعی و روش های مبتنی بر روی آمار، احتمال و اقتصاد. مشکلات (یا اهداف) سنتی تحقیقات هوش مصنوعی شامل استدلال، بازنمایی دانش، برنامه ریزی، یادگیری، پردازش زبان طبیعی، ادراک و توانایی حرکت و دستکاری اشیا است. هنگامی که دسترسی به رایانه های دیجیتال در اواسط دهه 1950 امکان پذیر شد، تحقیقات هوش مصنوعی شروع به بررسی این امکان کرد که هوش انسانی می تواند به دستکاری نمادها کاهش یابد. یک پیشنهاد برای مقابله با این موضوع این است که اطمینان حاصل شود که اولین هوش مصنوعی به طور کلی هوشمند “هوش مصنوعی دوستانه” است و سپس قادر خواهد بود هوش مصنوعی های توسعه یافته بعدی را کنترل کند. امروزه، اکثریت قریب به اتفاق محققان فعلی هوش مصنوعی به جای آن کار می کنند روی برنامه های کاربردی “هوش مصنوعی باریک” (مانند تشخیص پزشکی یا ناوبری خودرو). یادگیری ماشینی، مفهومی اساسی از تحقیقات هوش مصنوعی از زمان پیدایش این رشته، مطالعه الگوریتم های کامپیوتری است که به طور خودکار از طریق تجربه بهبود می یابند.
به یاد داشته باشید، از آنجایی که مقالات ویکیپدیا اغلب بهروزرسانی میشوند، ممکن است بسته به زمان اجرای اسکریپت، نتایج متفاوتی دریافت کنید.
نتیجه
این مقاله توضیح می دهد process خلاصه سازی متن با کمک کتابخانه NLTK پایتون. این process خراش دادن مقالات با استفاده از BeautifulSoap
کتابخانه نیز به اختصار در مقاله مورد بررسی قرار گرفته است. من به شما توصیه میکنم هر مقاله دیگری را از ویکیپدیا پاک کنید و ببینید که آیا میتوانید خلاصه خوبی از مقاله دریافت کنید یا خیر.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-27 10:40:05