از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون برای NLP: توسعه یک پرکننده متن خودکار با استفاده از N-Gram
سرفصلهای مطلب
این پانزدهمین مقاله از سری مقالات من است روی پایتون برای NLP. در مقاله قبلی ام روش پیاده سازی را توضیح دادم TF-IDF رویکرد از ابتدا در پایتون قبل از آن، روش پیادهسازی رویکرد کیسهای کلمات را از ابتدا در پایتون مطالعه کردیم.
امروز، رویکرد N-Grams را مطالعه خواهیم کرد و خواهیم دید که چگونه می توان از رویکرد N-Grams برای ایجاد یک پرکننده متن خودکار ساده یا موتور پیشنهاد استفاده کرد. پرکننده متن خودکار یک برنامه بسیار کاربردی است و به طور گسترده توسط گوگل و گوشی های هوشمند مختلف استفاده می شود که در آن کاربر مقداری متن را وارد می کند و متن باقیمانده به طور خودکار توسط برنامه تکمیل یا پیشنهاد می شود.
مشکلات با روش TF-IDF و کیسه کلمات
قبل از اینکه بخواهیم مدل N-Grams را پیاده سازی کنیم، اجازه دهید ابتدا اشکالات کیسه کلمات و رویکردهای TF-IDF را مورد بحث قرار دهیم.
در کیسه کلمات و رویکرد TF-IDF، کلمات به صورت جداگانه بررسی می شوند و هر کلمه به همتای عددی خود تبدیل می شود. اطلاعات متن کلمه حفظ نمی شود. دو جمله «ماشین و فرش قرمز بزرگ» و «فرش قرمز بزرگ و ماشین» را در نظر بگیرید. اگر از رویکرد یک کیسه کلمات استفاده کنید، بردارهای یکسانی را برای این دو جمله دریافت خواهید کرد. با این حال، به وضوح می توان دریافت که در جمله اول ما در مورد یک “ماشین قرمز بزرگ” صحبت می کنیم، در حالی که جمله دوم حاوی اطلاعاتی در مورد “فرش قرمز بزرگ” است. از این رو، اطلاعات زمینه بسیار مهم است. مدل N-Grams اساساً به ما کمک می کند تا اطلاعات زمینه را ضبط کنیم.
نظریه مدل N-Grams
ویکیپدیا N-Gram را بهعنوان «توالی پیوسته از N مورد از یک نمونه معین از متن یا گفتار» تعریف میکند. در اینجا یک آیتم می تواند یک کاراکتر، یک کلمه یا یک جمله باشد و N می تواند هر عدد صحیحی باشد. وقتی N 2 باشد، دنباله را بیگرام می نامیم. به طور مشابه، دنباله ای از 3 مورد را یک تریگرام می نامند و به همین ترتیب روی.
برای درک مدل N-Grams، ابتدا باید بفهمیم که زنجیره های مارکوف چگونه کار می کنند.
اتصال N-Gram با زنجیره مارکوف
آ زنجیر مارکوف دنباله ای از حالات است. یک سیستم مارکوف با 2 حالت X و Y را در نظر بگیرید. در زنجیره مارکوف، می توانید در یک حالت بمانید یا به حالت دیگر بروید. در مثال ما، ایالت های ما رفتار زیر را دارند:
- احتمال جابجایی از X به Y 50٪ و به طور مشابه، احتمال ماندن در X 50٪ است.
- به همین ترتیب، احتمال ماندن در Y 50٪ است در حالی که احتمال بازگشت به X نیز 50٪ است.
به این ترتیب می توان یک دنباله مارکوف مانند XXYX و غیره تولید کرد.
در مدل N-Grams، یک آیتم در یک دنباله را می توان به عنوان یک حالت مارکوف در نظر گرفت. بیایید یک مثال ساده از بیگرام های کاراکتر را ببینیم که در آن هر شخصیت یک حالت مارکوف است.
Football is a very famous game
بیگرام کاراکترهای جمله بالا به صورت زیر خواهد بود: fo
، oo
، ot
، tb
، ba
، al
، ll
، l
، i
، is
و غیره روی. می توانید ببینید که بیگرام ها اساساً دنباله ای از دو کاراکتر متوالی هستند.
به طور مشابه، تریگرام ها دنباله ای از سه کاراکتر به هم پیوسته هستند، همانطور که در زیر نشان داده شده است:
foo
، oot
، otb
، tba
و غیره روی.
در دو مثال قبلی، بیگرام و تریگرام کاراکترها را دیدیم. ما همچنین می توانیم بیگرام و سه ضلعی از کلمات.
بیایید به مثال قبلی خود یعنی «ماشین و فرش قرمز بزرگ» برگردیم. بیگرام این جمله «قرمز بزرگ»، «ماشین قرمز»، «ماشین و»، «و فرش» خواهد بود. به همین ترتیب، بیگرام های جمله «فرش قرمز بزرگ و ماشین» «قرمز بزرگ»، «فرش قرمز»، «فرش و»، «و ماشین» خواهد بود.
در اینجا در این مورد با بیگرام ها، یک نمایش برداری متفاوت برای هر دو جمله دریافت می کنیم.
در بخش بعدی، مدل N-Grams را از ابتدا در پایتون پیاده سازی می کنیم و خواهیم دید که چگونه می توانیم با استفاده از N-Gram مانند این یک پرکننده متن خودکار ایجاد کنیم.
N-Grams از ابتدا در پایتون
ما در این بخش دو نوع مدل N-Gram ایجاد می کنیم: یک مدل N-Grams با کاراکتر و یک مدل N-Gram کلمه.
کاراکترها مدل N-Grams
در این قسمت روش ایجاد یک مدل کاراکتر ساده N-Gram را توضیح خواهم داد. در قسمت بعدی روش پیاده سازی مدل N-Gram را خواهیم دید.
برای ایجاد مجموعه خود، مقاله ویکیپدیا را خراش میدهیم روی تنیس. اول بیایید import کتابخانه هایی که برای دانلود و تجزیه مقاله ویکی پدیا نیاز داریم.
import nltk
import numpy as np
import random
import string
import bs4 as bs
import urllib.request
import re
ما استفاده خواهیم کرد سوپ زیبا4 کتابخانه برای تجزیه داده های ویکی پدیا. علاوه بر این، کتابخانه regex پایتون، re
، برای برخی از کارهای پیش پردازش استفاده خواهد شد روی متن.
همانطور که قبلا گفتیم از مقاله ویکی پدیا استفاده خواهیم کرد روی تنیس برای ایجاد مجموعه ما. اسکریپت زیر مقاله ویکیپدیا را بازیابی میکند و تمام پاراگرافها را از متن مقاله استخراج میکند. در نهایت، متن برای پردازش آسان تر به حروف کوچک تبدیل می شود.
raw_html = urllib.request.urlopen('https://en.wikipedia.org/wiki/Tennis')
raw_html = raw_html.read()
article_html = bs.BeautifulSoup(raw_html, 'lxml')
article_paragraphs = article_html.find_all('p')
article_text = ''
for para in article_paragraphs:
article_text += para.text
article_text = article_text.lower()
بعد، همه چیز را از مجموعه داده خود حذف می کنیم به جز حروف، نقطه و فاصله:
article_text = re.sub(r'(^A-Za-z. )', '', article_text)
ما مجموعه داده خود را از قبل پردازش کرده ایم و اکنون زمان ایجاد یک مدل N-Gram است. ما یک مدل تریگرام کاراکتر ایجاد خواهیم کرد. اسکریپت زیر را اجرا کنید:
ngrams = {}
chars = 3
for i in range(len(article_text)-chars):
seq = article_text(i:i+chars)
print(seq)
if seq not in ngrams.keys():
ngrams(seq) = ()
ngrams(seq).append(article_text(i+chars))
در اسکریپت بالا یک دیکشنری ایجاد می کنیم ngrams
. کلیدهای این فرهنگ لغت، تریگرام های کاراکتر در مجموعه ما و مقادیر، کاراکترهایی خواهند بود که در کنار تریگرام ها قرار می گیرند. بعد، از آنجایی که ما یک N-Gram از سه کاراکتر ایجاد می کنیم، یک متغیر را اعلام می کنیم chars
. پس از آن، از کاراکتر چهارم شروع می کنیم، همه کاراکترهای مجموعه خود را تکرار می کنیم.
سپس در داخل حلقه، با فیلتر کردن سه کاراکتر بعدی، تریگرام را استخراج می کنیم. تریگرام در ذخیره می شود seq
متغیر. سپس بررسی می کنیم که آیا سه خط در فرهنگ لغت وجود دارد یا خیر. اگر در آن وجود نداشته باشد ngrams
فرهنگ لغت ما تریگرام را به فرهنگ لغت اضافه می کنیم. پس از آن، یک لیست خالی به عنوان مقدار به trigram اختصاص می دهیم. در نهایت، کاراکتری که بعد از تریگرام وجود دارد به عنوان یک مقدار به لیست اضافه می شود.
اگر دیکشنری را باز کنید ngrams
در اکسپلورر متغیر Spyder. شما باید چیزی شبیه به این را ببینید:
شما میتوانید سهگرامها را بهعنوان کلید، و کاراکترهای مربوطه را که بعد از سهگوشها در متن رخ میدهند، بهعنوان مقادیر ببینید. ممکن است کلیدهایی را با دو کاراکتر در فرهنگ لغت ببینید اما در واقع دو کاراکتر نیستند. شخصیت سوم در واقع یک فضا است.
بیایید اکنون سعی کنیم متن را با استفاده از سه کاراکتر اول مجموعه خود به عنوان ورودی تولید کنیم. سه شخصیت اول مجموعه ما “ده” هستند. به اسکریپت زیر نگاه کنید:
curr_sequence = article_text(0:chars)
output = curr_sequence
for i in range(200):
if curr_sequence not in ngrams.keys():
break
possible_chars = ngrams(curr_sequence)
next_char = possible_chars(random.randrange(len(possible_chars)))
output += next_char
curr_sequence = output(len(output)-chars:len(output))
print(output)
در اسکریپت بالا ما ابتدا اولین تریگرام یعنی ذخیره می کنیم ten
به درون curr_sequence
متغیر. ما یک متن از دویست کاراکتر تولید می کنیم، بنابراین یک حلقه را راه اندازی می کنیم که 200 بار تکرار می شود. در طول هر تکرار، بررسی می کنیم که آیا curr_sequence
یا تریگرام در ngrams
فرهنگ لغت. اگر تریگرام در یافت نشد ngrams
فرهنگ لغت، ما به سادگی از حلقه خارج می شویم.
بعد، curr_sequence
تریگرام به عنوان کلید به ngrams
فرهنگ لغت، که لیستی از کاراکترهای احتمالی بعدی را برمی گرداند. از لیست کاراکترهای احتمالی بعدی، یک شاخص به طور تصادفی انتخاب می شود که به آن ارسال می شود possible_chars
لیستی برای بدست آوردن کاراکتر بعدی برای سه خط فعلی. سپس کاراکتر بعدی به علامت اضافه می شود output
متغیری که حاوی خروجی نهایی است.
در نهایت، curr_sequence
با سه گرام بعدی از مجموعه متن به روز می شود. اگر شما print را output
متغیری که شامل دویست کاراکتر تولید شده به صورت خودکار است، باید چیزی شبیه به این را ببینید (لازم به ذکر است که از آنجایی که کاراکتر بعدی به صورت تصادفی انتخاب می شود، خروجی شما می تواند متفاوت باشد):
خروجی:
tent pointo somensiver tournamedal pare the greak in the next peak sweder most begal tennis sport. the be has siders with sidernaments as was that adming up is coach rackhanced ball of ment. a game and
خروجی در اینجا در این مورد چندان معنی ندارد. اگر ارزش آن را افزایش دهید chars
متغیر به 4. شما باید نتایج مشابه خروجی های زیر را ببینید:
tennis ahead with the club players under.most coaching motion us . the especific at the hit and events first predomination but of ends روی the u.s. cyclops have achieved the end or net inches call over age
می بینید که نتایج کمی بهتر از نتایجی است که با استفاده از 3 گرم به دست آوردیم. با افزایش تعداد N-Gram، پیشنهاد/پر کردن متن ما همچنان بهبود می یابد.
در قسمت بعدی مدل Words N-Grams را پیاده سازی می کنیم. خواهید دید که متن تولید شده در مورد مدل Words N-Grams بسیار معنادار خواهد بود.
مدل N-Grams کلمات
در مدل Words N-Grams، هر کلمه در متن به عنوان یک مورد جداگانه در نظر گرفته می شود. در این قسمت مدل Words N-Grams را پیاده سازی کرده و از آن برای ایجاد پرکننده متن خودکار استفاده می کنیم.
مجموعه داده ای که می خواهیم استفاده کنیم همان مجموعه ای است که در بخش گذشته استفاده کردیم.
بیایید ابتدا یک فرهنگ لغت بسازیم که حاوی تریگرام های کلمه به عنوان کلید و لیستی از کلماتی است که بعد از سه خط به عنوان مقادیر وجود دارد.
ngrams = {}
words = 3
words_tokens = nltk.word_tokenize(article_text)
for i in range(len(words_tokens)-words):
seq = ' '.join(words_tokens(i:i+words))
print(seq)
if seq not in ngrams.keys():
ngrams(seq) = ()
ngrams(seq).append(words_tokens(i+words))
در اسکریپت بالا، یک مدل تریگرام Words ایجاد می کنیم. این process مشابه موردی است که برای استفاده از تریگرام های کاراکتر دنبال می شود. با این حال، در اسکریپت بالا، ابتدا مجموعه خود را به کلمات نشانه گذاری می کنیم.
در مرحله بعد، تمام کلمات را تکرار می کنیم و سپس سه کلمه فعلی را به هم می پیوندیم تا یک سه خط تشکیل دهیم. پس از آن، بررسی می کنیم که آیا کلمه trigram در آن وجود دارد یا خیر ngrams
فرهنگ لغت. اگر تریگرام از قبل وجود نداشته باشد، ما به سادگی آن را در آن قرار می دهیم ngrams
فرهنگ لغت به عنوان یک کلید
در نهایت، فهرستی از کلماتی را که از سه خط پیروی می کنند در کل مجموعه به عنوان مقدار در فرهنگ لغت اضافه می کنیم.
حالا اگر به ngrams
دیکشنری، در اکسپلورر متغیر، به شکل زیر خواهد بود:
شما می توانید تریگرام ها را به عنوان کلیدهای فرهنگ لغت و کلمات مربوطه را به عنوان مقادیر فرهنگ لغت مشاهده کنید.
بیایید اکنون با استفاده از کلمه trigrams که ایجاد کردیم، یک پرکننده متن خودکار ایجاد کنیم.
curr_sequence = ' '.join(words_tokens(0:words))
output = curr_sequence
for i in range(50):
if curr_sequence not in ngrams.keys():
break
possible_words = ngrams(curr_sequence)
next_word = possible_words(random.randrange(len(possible_words)))
output += ' ' + next_word
seq_words = nltk.word_tokenize(output)
curr_sequence = ' '.join(seq_words(len(seq_words)-words:len(seq_words)))
print(output)
در اسکریپت بالا، مقدار را مقداردهی اولیه می کنیم curr_sequence
متغیر با سه گرام اول در بدنه. اولین تریگرام “تنیس یک است” است. ما 50 کلمه را با استفاده از سه خط اول به عنوان ورودی تولید خواهیم کرد. برای انجام این کار، یک حلقه for را اجرا می کنیم که 50 بار اجرا می شود. در طول هر تکرار، ابتدا بررسی می شود که آیا کلمه trigram در آن وجود دارد یا خیر ngrams
فرهنگ لغت. اگر نه، حلقه می شکند. در غیر این صورت، فهرست کلماتی که احتمالاً پس از سهگرام دنبال میشوند، از قسمت بازیابی میشوند ngrams
فرهنگ لغت با عبور از سه خط به عنوان مقدار. از لیست کلمات ممکن، یک کلمه به صورت تصادفی انتخاب شده و در انتهای out اضافه می شود. در نهایت، curr_sequence
متغیر با مقدار سه گرام بعدی در فرهنگ لغت به روز می شود.
متن تولید شده به این شکل است. میتوانید ببینید که در مورد سهگرامهای کلمه، متنی که بهطور خودکار تولید میشود بسیار معنادارتر است.
خروجی:
tennis is a racket sport that can be played individually against a single opponent singles or between two teams of two players each doubles. each player uses a tennis racket include a handle known as the grip connected to a neck which joins a roughly elliptical frame that holds a matrix of
اگر مقدار متغیر کلمات را بر روی 4 تنظیم کنید (از 4 گرم استفاده کنید) برای تولید متن، خروجی شما مانند شکل زیر قوی تر به نظر می رسد:
tennis is a racket sport that can be played individually against a single opponent singles or between two teams of two players each doubles . each player uses a tennis racket that is strung with cord to strike a hollow rubber ball covered with felt over or around a net and into the opponents
می توانید ببینید که خروجی با 4 گرم منطقی تر است. این عمدتاً به این دلیل است که مولد ما عمدتاً همان متن را از مقاله ویکیپدیا بازسازی میکند، اما با برخی پیشرفتهای جزئی در مولد، و مجموعه بزرگتر، مولد ما میتواند به راحتی جملات جدید و منحصربهفرد را نیز تولید کند.
نتیجه
مدل N-Grams یکی از پرکاربردترین مدلهای جمله به برداری است زیرا زمینه بین N-کلمات را در یک جمله نشان میدهد. در این مقاله نظریه مدل N-Grams را مشاهده کردید. همچنین روش پیاده سازی کاراکترهای N-Grams و Words N-Grams را مشاهده کردید. در نهایت، روش ایجاد پرکننده متن خودکار با استفاده از هر دو روش را مطالعه کردید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-21 15:35:50