از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
پایتون برای NLP: ایجاد مدل کیسه کلمات از ابتدا
سرفصلهای مطلب
این سیزدهمین مقاله از سری مقالات من است روی پایتون برای NLP. در مقاله قبلی روش ایجاد یک چت بات ساده مبتنی بر قانون را دیدیم که از آن استفاده می کند شباهت کسینوس بین TF-IDF بردارهای کلمات موجود در پیکره و ورودی کاربر، برای تولید پاسخ. مدل TF-IDF اساساً برای تبدیل کلمه به اعداد استفاده شد.
در این مقاله مدل بسیار مفید دیگری را که متن را به عدد تبدیل می کند، یعنی کیسه کلمات (BOW) را بررسی خواهیم کرد.
از آنجایی که بیشتر الگوریتم های آماری، به عنوان مثال، تکنیک های یادگیری ماشین و یادگیری عمیق، با داده های عددی کار می کنند، بنابراین باید متن را به اعداد تبدیل کنیم. چندین رویکرد در این زمینه وجود دارد. با این حال، معروف ترین آنها Bag of Words، TF-IDF و word2vec هستند. اگرچه چندین کتابخانه مانند Scikit-Learn و NLTK وجود دارد که می توانند این تکنیک ها را در یک خط کد پیاده سازی کنند، درک اصل کار در پشت این تکنیک های جاسازی کلمه مهم است. بهترین راه برای انجام این کار پیاده سازی این تکنیک ها از ابتدا در پایتون است و این همان کاری است که ما امروز می خواهیم انجام دهیم.
در این مقاله روش پیاده سازی رویکرد Bag of Words را از ابتدا در پایتون خواهیم دید. در مقاله بعدی روش پیاده سازی رویکرد TF-IDF را از ابتدا در پایتون خواهیم دید.
قبل از کدنویسی، اجازه دهید ابتدا نظریه پشت رویکرد کیسه کلمات را ببینیم.
نظریه پشت کیسه کلمات رویکرد
برای درک رویکرد کیسه کلمات، ابتدا با کمک یک مثال شروع می کنیم.
فرض کنید یک پیکره با سه جمله داریم:
- “من دوست دارم فوتبال بازی کنم”
- “برای بازی تنیس بیرون رفتی”
- “من و جان تنیس بازی می کنیم”
حال اگر باید طبقه بندی متن یا هر کار دیگری را انجام دهیم، روی داده های فوق با استفاده از تکنیک های آماری، ما نمی توانیم این کار را انجام دهیم زیرا تکنیک های آماری فقط با اعداد کار می کنند. بنابراین باید این جملات را به اعداد تبدیل کنیم.
مرحله 1: جملات را نشانه گذاری کنید
اولین قدم در این زمینه تبدیل جملات موجود در مجموعه ما به نشانه یا کلمات فردی است. به جدول زیر نگاه کنید:
جمله 1 | جمله 2 | جمله 3 |
---|---|---|
من | انجام داد | جان |
پسندیدن | شما | و |
به | برو | من |
بازی | خارج از | بازی |
فوتبال | به | تنیس |
بازی | ||
تنیس |
مرحله 2: یک فرهنگ لغت فرکانس کلمات ایجاد کنید
گام بعدی ایجاد دیکشنری است که تمام کلمات موجود در مجموعه ما را به عنوان کلید و فراوانی وقوع کلمات را به عنوان مقادیر در بر دارد. به عبارت دیگر، ما باید یک هیستوگرام از کلمات موجود در مجموعه خود ایجاد کنیم. به جدول زیر نگاه کنید:
کلمه | فرکانس |
---|---|
من | 2 |
پسندیدن | 1 |
به | 2 |
بازی | 3 |
فوتبال | 1 |
انجام داد | 1 |
شما | 1 |
برو | 1 |
خارج از | 1 |
تنیس | 2 |
جان | 1 |
و | 1 |
در جدول بالا می توانید هر کلمه را به همراه تعداد دفعات وقوع آن مشاهده کنید. به عنوان مثال، شما می توانید آن را از زمان کلمه مشاهده کنید play
سه بار در پیکره رخ می دهد (یک بار در هر جمله) فراوانی آن 3 است.
در مجموعه ما، ما فقط سه جمله داشتیم، بنابراین ایجاد یک فرهنگ لغت که شامل همه کلمات باشد برای ما آسان است. در سناریوهای دنیای واقعی، میلیون ها کلمه در فرهنگ لغت وجود خواهد داشت. برخی از کلمات فرکانس بسیار کمی خواهند داشت. کلمات با فرکانس بسیار کم کاربرد چندانی ندارند، بنابراین چنین کلماتی حذف می شوند. یکی از راههای حذف کلمات با بسامد کمتر این است که فرهنگ لغت فرکانس کلمات را به ترتیب کاهش فرکانس مرتب کنیم و سپس کلماتی را که فرکانس بالاتر از آستانه مشخصی دارند فیلتر کنیم.
بیایید فرهنگ لغت فرکانس کلمات خود را مرتب کنیم:
کلمه | فرکانس |
---|---|
بازی | 3 |
تنیس | 2 |
به | 2 |
من | 2 |
فوتبال | 1 |
انجام داد | 1 |
شما | 1 |
برو | 1 |
خارج از | 1 |
پسندیدن | 1 |
جان | 1 |
و | 1 |
مرحله 3: ایجاد مدل کیسه کلمات
برای ایجاد مدل کیسه کلمات، ما باید یک ماتریس ایجاد کنیم که در آن ستونها با پرتکرارترین کلمات در فرهنگ لغت ما مطابقت دارند که در آن ردیفها با سند یا جملات مطابقت دارند.
فرض کنید 8 کلمه رایج را از فرهنگ لغت خود فیلتر می کنیم. سپس ماتریس فرکانس سند به شکل زیر خواهد بود:
بازی | تنیس | به | من | فوتبال | انجام داد | شما | برو | |
---|---|---|---|---|---|---|---|---|
جمله 1 | 1 | 0 | 1 | 1 | 1 | 0 | 0 | 0 |
جمله 2 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 1 |
جمله 3 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
درک چگونگی ایجاد ماتریس فوق مهم است. در ماتریس بالا، ردیف اول با جمله اول مطابقت دارد. در اولی کلمه “play” یک بار وجود دارد، بنابراین در ستون اول 1 اضافه کردیم. کلمه در ستون دوم “Tennis” است، در جمله اول وجود ندارد، بنابراین در ستون دوم برای جمله 1 یک عدد 0 اضافه کردیم. به طور مشابه، در جمله دوم، هر دو کلمه “Play” و “Tennis” وجود دارد. ” یک بار رخ می دهد، بنابراین ما 1 را در دو ستون اول اضافه کردیم. با این حال، در ستون پنجم، 0 را اضافه می کنیم، زیرا کلمه “فوتبال” در جمله دوم وجود ندارد. به این ترتیب، بسته به وقوع کلمه، تمام سلولهای ماتریس بالا با 0 یا 1 پر میشوند. ماتریس نهایی مربوط به مدل کیسه کلمات است.
در هر ردیف می توانید نمایش عددی جمله مربوطه را مشاهده کنید. به عنوان مثال، ردیف اول نمایش عددی را نشان می دهد جمله 1. اکنون می توان از این نمایش عددی به عنوان ورودی مدل های آماری استفاده کرد.
به اندازه کافی نظریه، بیایید مدل کیسه کلمات خودمان را از ابتدا پیاده سازی کنیم.
مدل کیسه کلمات در پایتون
اولین چیزی که برای ایجاد مدل Bag of Words خود نیاز داریم یک مجموعه داده است. در قسمت قبل به صورت دستی یک مدل کیسه کلمات با سه جمله ایجاد کردیم. با این حال، مجموعه داده های دنیای واقعی با میلیون ها کلمه بسیار بزرگ هستند. بهترین راه برای یافتن پیکره تصادفی ویکی پدیا است.
در مرحله اول مقاله ویکی پدیا را خراش می دهیم روی پردازش زبان طبیعی. اما اول، اجازه دهید 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/Natural_language_processing')
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
در اسکریپت بالا، ما import HTML خام برای مقاله ویکی پدیا. از HTML خام، متن را در متن پاراگراف فیلتر می کنیم. در نهایت با به هم پیوستن تمام پاراگراف ها یک پیکره کامل ایجاد می کنیم.
مرحله بعدی این است که بدنه را به جملات فردی تقسیم کنید. برای انجام این کار، ما از sent_tokenize
تابع از کتابخانه NLTK.
corpus = nltk.sent_tokenize(article_text)
متن ما حاوی علائم نگارشی است. ما نمی خواهیم علائم نگارشی بخشی از فرهنگ لغت بسامد کلمات ما باشد. در اسکریپت زیر ابتدا متن خود را به حروف کوچک تبدیل می کنیم و سپس علائم نگارشی را از متن خود حذف می کنیم. حذف علائم نگارشی می تواند باعث ایجاد چندین فضای خالی شود. با استفاده از regex فضاهای خالی را از متن حذف می کنیم.
به اسکریپت زیر نگاه کنید:
for i in range(len(corpus )):
corpus (i) = corpus (i).lower()
corpus (i) = re.sub(r'\W',' ',corpus (i))
corpus (i) = re.sub(r'\s+',' ',corpus (i))
در اسکریپت بالا، هر جمله را در پیکره تکرار می کنیم، جمله را به حروف کوچک تبدیل می کنیم و سپس نقاط نگارشی و فضاهای خالی را از متن حذف می کنیم.
بیایید تعداد جملات موجود در مجموعه خود را دریابیم.
print(len(corpus))
خروجی 49 را نشان می دهد.
اجازه دهید print یک جمله از مجموعه ما:
print(corpus(30))
خروجی:
in the 2010s representation learning and deep neural network style machine learning methods became widespread in natural language processing due in part to a flurry of results showing that such techniques 4 5 can achieve state of the art results in many natural language tasks for example in language modeling 6 parsing 7 8 and many others
می بینید که متن حاوی هیچ کاراکتر خاصی یا چندین فضای خالی نیست.
حالا ما مجموعه خودمان را داریم. مرحله بعدی توکنیزه کردن جملات موجود در مجموعه و ایجاد دیکشنری است که حاوی کلمات و بسامدهای متناظر آنها در مجموعه است. به اسکریپت زیر نگاه کنید:
wordfreq = {}
for sentence in corpus:
tokens = nltk.word_tokenize(sentence)
for token in tokens:
if token not in wordfreq.keys():
wordfreq(token) = 1
else:
wordfreq(token) += 1
در اسکریپت بالا یک دیکشنری به نام ایجاد کردیم wordfreq
. بعد، ما از طریق هر جمله در پیکره تکرار می کنیم. جمله به کلمات تبدیل می شود. بعد، ما از طریق هر کلمه در جمله تکرار می کنیم. اگر کلمه در وجود ندارد wordfreq
دیکشنری، کلمه را به عنوان کلید اضافه می کنیم و مقدار کلمه را 1 می کنیم. در غیر این صورت، اگر کلمه از قبل در فرهنگ لغت وجود داشته باشد، به سادگی تعداد کلیدها را 1 افزایش می دهیم.
اگر موارد فوق را در اسپایدر ویرایشگر مانند من، شما می توانید به کاوشگر متغیر بروید روی سمت راست و کلیک کنید wordfreq
متغیر. شما باید دیکشنری مانند این را ببینید:
می توانید کلمات را در ستون “کلید” و فراوانی وقوع آنها را در ستون “Value” مشاهده کنید.
همانطور که در بخش تئوری گفتم، بسته به وظیفه ای که در دست دارید، همه کلمات مفید نیستند. در مجموعه های بزرگ، می توانید میلیون ها کلمه داشته باشید. ما میتوانیم پرتکرارترین کلمات را فیلتر کنیم. مجموعه ما در کل 535 کلمه دارد. اجازه دهید 200 کلمه پرتکرار را فیلتر کنیم. برای انجام این کار، می توانیم از Python استفاده کنیم heap
کتابخانه
به اسکریپت زیر نگاه کنید:
import heapq
most_freq = heapq.nlargest(200, wordfreq, key=wordfreq.get)
حالا ما most_freq
فهرست شامل 200 کلمه پرتکرار به همراه فراوانی وقوع آنهاست.
مرحله آخر تبدیل جملات موجود در مجموعه ما به نمایش برداری متناظر آنهاست. ایده ساده است، برای هر کلمه در most_freq
فرهنگ لغت اگر کلمه در جمله وجود داشته باشد، یک 1 برای کلمه اضافه می شود، در غیر این صورت 0 اضافه می شود.
sentence_vectors = ()
for sentence in corpus:
sentence_tokens = nltk.word_tokenize(sentence)
sent_vec = ()
for token in most_freq:
if token in sentence_tokens:
sent_vec.append(1)
else:
sent_vec.append(0)
sentence_vectors.append(sent_vec)
در اسکریپت بالا یک لیست خالی ایجاد می کنیم sentence_vectors
که بردارها را برای تمام جملات موجود در پیکره ذخیره می کند. در مرحله بعد، هر جمله را در پیکره تکرار می کنیم و یک لیست خالی ایجاد می کنیم sent_vec
برای جملات فردی به همین ترتیب، جمله را نشانه گذاری می کنیم. در مرحله بعد، ما از طریق هر کلمه در عبارت تکرار می کنیم most_freq
لیست کنید و بررسی کنید که آیا کلمه در نشانه های جمله وجود دارد یا خیر. اگر کلمه بخشی از جمله باشد، 1 به بردار جمله فردی اضافه می شود sent_vec
، در غیر این صورت 0 اضافه شده است. در نهایت بردار جمله به لیست اضافه می شود sentence_vectors
که شامل بردار برای تمام جملات است. اساساً این sentence_vectors
مدل کیسه کلمات ما است.
اما مدل کیسه کلماتی که در قسمت تئوری دیدیم به صورت ماتریسی بود. مدل ما به صورت لیستی از لیست ها است. ما می توانیم مدل خود را با استفاده از این اسکریپت به فرم ماتریسی تبدیل کنیم:
sentence_vectors = np.asarray(sentence_vectors)
اساساً در اسکریپت زیر لیست خود را با استفاده از یک آرایه numpy دو بعدی تبدیل کردیم. asarray
تابع. حالا اگر باز کنید sentence_vectors
متغیر در کاوشگر متغیر ویرایشگر Spyder، باید ماتریس زیر را مشاهده کنید:
می توانید مدل Bag of Words حاوی 0 و 1 را مشاهده کنید.
نتیجه
مدل Bag of Words یکی از سه روش پرکاربرد جاسازی کلمه است که TF-IDF و Word2Vec دو روش دیگر هستند.
در این مقاله روش پیاده سازی رویکرد Bag of Words را از ابتدا در پایتون دیدیم. نظریه رویکرد همراه با دست توضیح داده شده است.روی کد برای پیاده سازی رویکرد در مقاله بعدی روش پیاده سازی رویکرد TF-IDF را از ابتدا در پایتون خواهیم دید.
(برچسبها به ترجمه)# python
منتشر شده در 1403-01-21 21:59:06