وبلاگ رسانگار
با ما حرفه ای باشید

سرور مجازی NVMe

پیاده سازی Word2Vec با کتابخانه Gensim در پایتون

0 31
زمان لازم برای مطالعه: 10 دقیقه


معرفی

انسان ها دارای توانایی طبیعی برای درک آنچه دیگران می گویند و آنچه در پاسخ به آن می گویند، دارند. این توانایی با تعامل مداوم با افراد دیگر و جامعه در طول سالیان متمادی ایجاد می شود. زبان نقش بسیار مهمی در روش تعامل انسان ها دارد. زبان هایی که انسان ها برای تعامل از آنها استفاده می کنند، زبان های طبیعی نامیده می شوند.

قواعد زبان های مختلف طبیعی متفاوت است. با این حال، یک چیز مشترک در زبان های طبیعی وجود دارد: انعطاف پذیری و تکامل.

زبان های طبیعی بسیار انعطاف پذیر هستند. فرض کنید شما در حال رانندگی هستید و دوستتان یکی از این سه جمله را می گوید: “بکش، ماشین را متوقف کن”، “ایست”. بلافاصله متوجه می شوید که او از شما می خواهد ماشین را متوقف کنید. این به این دلیل است که زبان های طبیعی بسیار انعطاف پذیر هستند. راه های مختلفی برای گفتن یک چیز وجود دارد.

یکی دیگر از جنبه های مهم زبان های طبیعی این واقعیت است که آنها به طور مداوم در حال تکامل هستند. به عنوان مثال، چند سال پیش هیچ اصطلاحی مانند “Google it” وجود نداشت که به جستجوی چیزی اشاره دارد روی موتور جستجوی گوگل زبان های طبیعی همیشه در حال تکامل هستند.

برعکس، زبان های کامپیوتری از یک نحو دقیق پیروی می کنند. اگر می خواهید به یک کامپیوتر بگویید print چیزی روی صفحه نمایش، دستور خاصی برای آن وجود دارد. وظیفه پردازش زبان طبیعی این است که کامپیوترها زبان انسان را به روشی مشابه انسان درک کرده و تولید کنند.

این یک کار بزرگ است و موانع زیادی در آن وجود دارد. این سخنرانی تصویری از دانشگاه میشیگان توضیح بسیار خوبی در مورد اینکه چرا NLP بسیار سخت است، ارائه شده است.

در این مقاله به پیاده سازی می پردازیم Word2Vec تکنیک جاسازی کلمه برای ایجاد بردار کلمات با پایتون استفاده می شود جنسیم کتابخانه با این حال، قبل از اینکه مستقیماً به بخش کدنویسی بپردازیم، ابتدا برخی از رایج ترین تکنیک های جاسازی کلمه را به همراه مزایا و معایب آنها به طور خلاصه مرور می کنیم.

رویکردهای جاسازی کلمه

یکی از دلایلی که پردازش زبان طبیعی مشکلی برای حل آن است این واقعیت است که برخلاف انسان ها، رایانه ها فقط می توانند اعداد را درک کنند. ما باید کلمات را در قالب عددی نشان دهیم که توسط رایانه قابل درک باشد. تعبیه کلمه به نمایش عددی کلمات اشاره دارد.

چندین روش جاسازی کلمه در حال حاضر وجود دارد و همه آنها جوانب مثبت و منفی خود را دارند. در اینجا به سه مورد از آنها خواهیم پرداخت:

  1. کیسه کلمات
  2. طرح TF-IDF
  3. Word2Vec

کیسه کلمات

رویکرد کیسه کلمات یکی از ساده ترین رویکردهای جاسازی کلمه است. مراحل زیر برای ایجاد جاسازی کلمات با استفاده از رویکرد کیسه کلمات است.

با استفاده از یک مثال، تعبیه‌های کلمه ایجاد شده توسط کیسه کلمات را خواهیم دید. فرض کنید شما یک مجموعه نوشته ها با سه جمله

  • S1 = من عاشق باران هستم
  • S2 = باران باران از بین می رود
  • S3 = من دور هستم

برای تبدیل جملات بالا به نمایش های تعبیه کلمه متناظر با استفاده از رویکرد کیسه کلمات، باید مراحل زیر را انجام دهیم:

  1. یک فرهنگ لغت از کلمات منحصر به فرد از مجموعه ایجاد کنید. در مجموعه فوق کلمات منحصر به فرد زیر را داریم: (من، عشق، باران، برو، دور، هستم)
  2. جمله را تجزیه کن برای هر کلمه در جمله، 1 به جای کلمه در فرهنگ لغت اضافه کنید و برای همه کلمات دیگری که در فرهنگ لغت وجود ندارد، صفر اضافه کنید. به عنوان مثال، کیسه کلمات نمایش جمله S1 (من عاشق باران هستم)، به این صورت است: (1، 1، 1، 0، 0، 0). به طور مشابه برای S2 و S3، مجموعه ای از نمایش های کلمه به ترتیب (0، 0، 2، 1، 1، 0) و (1، 0، 0، 0، 1، 1) هستند.

توجه داشته باشید که برای S2 ما 2 را به جای “باران” در فرهنگ لغت اضافه کردیم. این به این دلیل است که S2 دو بار حاوی “باران” است.

مزایا و معایب کیسه کلمات

رویکرد کیسه کلمات هم مزایا و هم معایب دارد. مزیت اصلی رویکرد کیسه کلمات این است که برای به دست آوردن نتایج خوب به مجموعه بسیار عظیمی از کلمات نیاز ندارید. می بینید که ما یک مدل کیسه کلمات بسیار ابتدایی با سه جمله می سازیم. از نظر محاسباتی، مدل یک کیسه کلمات خیلی پیچیده نیست.

یک اشکال عمده رویکرد کیسه کلمات این واقعیت است که ما نیاز به ایجاد بردارهای بزرگ با فضاهای خالی داریم تا عددی (ماتریس پراکنده) را نشان دهیم که حافظه و فضا را مصرف می کند. در مثال قبلی فقط 3 جمله داشتیم. با این حال می توانید سه صفر را در هر بردار ببینید.

مجموعه ای با هزاران مقاله را تصور کنید. در چنین حالتی، تعداد کلمات منحصر به فرد در یک فرهنگ لغت می تواند هزاران کلمه باشد. اگر یک سند حاوی 10٪ از کلمات منحصر به فرد باشد، بردار جاسازی مربوطه همچنان حاوی 90٪ صفر خواهد بود.

یکی دیگر از مسائل مهم با رویکرد کیسه کلمات این واقعیت است که هیچ اطلاعات زمینه ای را حفظ نمی کند. به ترتیب ظاهر شدن کلمات در یک جمله اهمیتی نمی دهد. به عنوان مثال، با جملات “بطری در ماشین است” و “ماشین در بطری است” به طور مساوی رفتار می کند که جملات کاملاً متفاوتی هستند.

یک نوع رویکرد کیسه ای از کلمات، معروف به n-gram، می تواند به حفظ رابطه بین کلمات کمک کند. N-gram به دنباله ای از n کلمه اشاره دارد. به عنوان مثال، 2 گرم برای جمله “شما خوشحال نیستید”، “شما هستید”، “نید” و “خوشحال نیستید” است. اگرچه رویکرد n-gram می تواند روابط بین کلمات را ثبت کند، اندازه مجموعه ویژگی ها با n-گرم بسیار زیاد به طور تصاعدی رشد می کند.

طرح TF-IDF

طرح TF-IDF نوعی رویکرد کلمات کیسه ای است که در آن به جای اضافه کردن صفر و یک در بردار جاسازی، اعداد شناور را اضافه می کنید که حاوی اطلاعات مفیدتری در مقایسه با صفر و یک هستند. ایده پشت طرح TF-IDF این واقعیت است که کلماتی که در یک سند فراوانی فراوانی دارند و در سایر اسناد فراوانی کمتری دارند، برای طبقه بندی بسیار مهم هستند.

TF-IDF حاصلضرب دو مقدار است: فرکانس مدت (TF) و فرکانس سند معکوس (IDF).

فراوانی اصطلاح به تعداد دفعاتی که یک کلمه در سند ظاهر می شود اشاره دارد و می تواند به صورت زیر محاسبه شود:

Term frequence = (Number of Occurences of a word)/(Total words in the document)

به عنوان مثال، اگر به جمله S1 از بخش قبلی یعنی “من عاشق باران هستم” نگاه کنیم، هر کلمه در جمله یک بار رخ می دهد و بنابراین دارای فرکانس 1 است. برعکس، برای S2 یعنی “باران باران می رود”، فراوانی “باران” دو است در حالی که برای بقیه کلمات 1 است.

IDF به گزارش تعداد کل اسناد تقسیم بر تعداد اسنادی که کلمه در آنها وجود دارد اشاره دارد و می تواند به صورت زیر محاسبه شود:

IDF(word) = Log((Total number of documents)/(Number of documents containing the word))

به عنوان مثال، مقدار IDF برای کلمه “باران” 0.1760 است، زیرا تعداد کل اسناد 3 است و باران در 2 مورد از آنها ظاهر می شود، بنابراین log(3/2) 0.1760 است. از طرف دیگر، اگر در جمله اول به کلمه “عشق” نگاه کنید، در یکی از سه سند آمده است و بنابراین مقدار IDF آن است. log(3)که 0.4771 است.

مزایا و معایب TF-IDF

اگرچه TF-IDF پیشرفتی نسبت به رویکرد کیسه کلمات ساده است و نتایج بهتری را برای کارهای رایج NLP به ارمغان می آورد، مزایا و معایب کلی یکسان باقی می مانند. ما هنوز نیاز به ایجاد یک ماتریس پراکنده بزرگ داریم، که همچنین محاسبات بسیار بیشتری نسبت به رویکرد کیسه کلمات ساده نیاز دارد.

Word2Vec

رویکرد جاسازی Word2Vec که توسط توماس میکولوف، به عنوان وضعیت هنر در نظر گرفته می شود. رویکرد Word2Vec از یادگیری عمیق و تکنیک‌های مبتنی بر شبکه‌های عصبی برای تبدیل کلمات به بردارهای متناظر استفاده می‌کند به گونه‌ای که بردارهای مشابه معنایی در فضای N بعدی به یکدیگر نزدیک باشند، جایی که N به ابعاد بردار اشاره دارد.

Word2Vec نتایج شگفت انگیزی را ارائه می دهد. توانایی Word2Vec برای حفظ رابطه معنایی با یک مثال کلاسیک منعکس شده است که در آن اگر بردار کلمه “پادشاه” داشته باشید و بردار نشان داده شده توسط کلمه “Man” را از “King” حذف کنید و “Women” را به آن اضافه کنید، شما بردار نزدیک به بردار ملکه بدست آورید. این رابطه معمولاً به صورت زیر نمایش داده می شود:

King - Man + Women = Queen

مدل Word2Vec در دو نوع ارائه می شود: مدل Skip Gram و Continuous Bag of Words Model (CBOW).

در مدل Skip Gram، کلمات زمینه با استفاده از کلمه پایه پیش بینی می شوند. به عنوان مثال، با توجه به جمله “I love to dance in the rain”، مدل skip gram “عشق” و “رقص” را با توجه به کلمه “to” به عنوان ورودی پیش بینی می کند.

برعکس، مدل CBOW «به» را پیش‌بینی می‌کند، اگر کلمات متنی «عشق» و «رقص» به عنوان ورودی به مدل داده شوند. مدل این روابط را با استفاده از شبکه های عصبی عمیق یاد می گیرد.

مزایا و معایب Word2Vec

Word2Vec دارای چندین مزیت نسبت به مجموعه کلمات و طرح IF-IDF است. Word2Vec معنای معنایی کلمات مختلف در یک سند را حفظ می کند. اطلاعات زمینه از بین نمی رود. یکی دیگر از مزایای بزرگ رویکرد Word2Vec این است که اندازه بردار جاسازی بسیار کوچک است. هر بعد در بردار جاسازی حاوی اطلاعاتی در مورد یک جنبه از کلمه است. ما برخلاف کیسه کلمات و رویکردهای TF-IDF به بردارهای پراکنده عظیم نیاز نداریم.

توجه داشته باشید: جزئیات ریاضی روش کار Word2Vec شامل توضیحی در مورد شبکه های عصبی و احتمال نرم افزار مکس می باشد که از حوصله این مقاله خارج است. اگر می خواهید پایه های ریاضی Word2Vec را درک کنید، لطفاً این مقاله را بخوانید: https://arxiv.org/abs/1301.3781

Word2Vec در پایتون با کتابخانه Gensim

در این قسمت مدل Word2Vec را با کمک پایتون پیاده سازی می کنیم جنسیم کتابخانه این مراحل را دنبال کنید:

ایجاد Corpus

قبلاً بحث کردیم که برای ایجاد یک مدل Word2Vec، به یک پیکره نیاز داریم. در برنامه های کاربردی واقعی، مدل های Word2Vec با استفاده از میلیاردها سند ایجاد می شوند. برای مثال مدل Word2Vec گوگل با استفاده از 3 میلیون کلمه و عبارت آموزش داده شده است. با این حال، برای سادگی، یک مدل Word2Vec را با استفاده از یک مقاله منفرد ویکی‌پدیا ایجاد می‌کنیم. مدل ما به خوبی مدل گوگل نخواهد بود. اگرچه، توضیح اینکه چگونه مدل Word2Vec را می توان با استفاده از کتابخانه Gensim پیاده سازی کرد، به اندازه کافی خوب است.

قبل از اینکه بتوانیم مقالات ویکی پدیا را خلاصه کنیم، باید آنها را واکشی کنیم. برای این کار از چند کتابخانه استفاده خواهیم کرد. اولین کتابخانه ای که باید دانلود کنیم این است سوپ زیبا کتابخانه، که یک ابزار بسیار مفید پایتون برای اسکرپینگ وب است. برای دانلود ابزار Beautiful Soup دستور زیر را در خط فرمان اجرا کنید.

$ pip install beautifulsoup4

کتابخانه مهم دیگری که برای تجزیه XML و HTML به آن نیاز داریم، کتابخانه است lxml کتابخانه برای دانلود lxml دستور زیر را در خط فرمان اجرا کنید:

$ pip install lxml

مقاله ای که میخواهیم بنویسیم مقاله ویکی پدیا است روی هوش مصنوعی. بیایید یک اسکریپت پایتون بنویسیم تا مقاله را از ویکی‌پدیا پاک کنیم:

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

در اسکریپت بالا، ابتدا مقاله ویکی پدیا را با استفاده از urlopen روش از request کلاس از urllib کتابخانه سپس محتوای مقاله را می خوانیم و آن را با استفاده از یک شی از the تجزیه می کنیم BeautifulSoup کلاس ویکی پدیا محتوای متنی مقاله را در داخل ذخیره می کند p برچسب ها ما استفاده می کنیم find_all عملکرد از BeautifulSoup برای واکشی تمام محتویات از برچسب های پاراگراف مقاله شی کنید.

در نهایت، تمام پاراگراف ها را به هم متصل می کنیم و مقاله خراشیده شده را در آن ذخیره می کنیم article_text متغیر برای استفاده بعدی

پیش پردازش

در این مرحله ما اکنون مقاله را وارد کرده ایم. مرحله بعدی پیش پردازش محتوا برای مدل Word2Vec است. اسکریپت زیر متن را پیش پردازش می کند:


processed_article = article_text.lower()
processed_article = re.sub('(^a-zA-Z)', ' ', processed_article )
processed_article = re.sub(r'\s+', ' ', processed_article)


all_sentences = nltk.sent_tokenize(processed_article)

all_words = (nltk.word_tokenize(sent) for sent in all_sentences)


from nltk.corpus import stopwords
for i in range(len(all_words)):
    all_words(i) = (w for w in all_words(i) if w not in stopwords.words('english'))

در اسکریپت بالا، تمام متن را به حروف کوچک تبدیل می کنیم و سپس تمام ارقام، کاراکترهای خاص و فاصله های اضافی را از متن حذف می کنیم. پس از پیش پردازش، فقط کلمات باقی می مانند.

مدل Word2Vec آموزش داده شده است روی مجموعه ای از کلمات ابتدا باید مقاله خود را به جملات تبدیل کنیم. ما استفاده می کنیم nltk.sent_tokenize ابزاری برای تبدیل مقاله ما به جملات. برای تبدیل جملات به کلمات استفاده می کنیم nltk.word_tokenize سودمندی به عنوان آخرین مرحله پیش پردازش، تمام کلمات توقف را از متن حذف می کنیم.

پس از اینکه اسکریپت اجرای خود را کامل کرد، all_words شی شامل لیستی از تمام کلمات در مقاله است. ما از این لیست برای ایجاد مدل Word2Vec خود با کتابخانه Gensim استفاده خواهیم کرد.

ایجاد مدل Word2Vec

با Gensim، ایجاد مدل Word2Vec بسیار ساده است. لیست کلمات به Word2Vec کلاس از gensim.models بسته بندی باید مقدار را برای the مشخص کنیم min_count پارامتر. مقدار 2 برای min_count مشخص می کند که فقط آن دسته از کلمات را در مدل Word2Vec که حداقل دو بار در بدنه ظاهر می شوند شامل شود. اسکریپت زیر مدل Word2Vec را با استفاده از مقاله ویکی‌پدیایی که خراش دادیم ایجاد می‌کند.

from gensim.models import Word2Vec

word2vec = Word2Vec(all_words, min_count=2)

برای مشاهده فرهنگ لغات منحصر به فرد که حداقل دو بار در مجموعه وجود دارد، اسکریپت زیر را اجرا کنید:

vocabulary = word2vec.wv.vocab
print(vocabulary)

هنگامی که اسکریپت بالا اجرا می شود، لیستی از تمام کلمات منحصر به فرد را می بینید که حداقل دو بار اتفاق می افتد.

تحلیل مدل

ما مدل Word2Vec خود را در بخش آخر با موفقیت ایجاد کردیم. اکنون زمان آن است که آنچه را که ایجاد کرده ایم کشف کنیم.

پیدا کردن وکتور برای یک کلمه

می دانیم که مدل Word2Vec کلمات را به بردارهای متناظر آنها تبدیل می کند. بیایید ببینیم چگونه می‌توانیم نمایش برداری هر کلمه خاص را مشاهده کنیم.

v1 = word2vec.wv('artificial')

بردار v1 حاوی نمایش برداری برای کلمه “مصنوعی”. به طور پیش فرض، بردار صد بعدی توسط Gensim Word2Vec ایجاد می شود. این یک بردار بسیار بسیار کوچکتر در مقایسه با آنچه که با کیسه کلمات تولید می شد است. اگر از رویکرد کیسه کلمات برای جاسازی مقاله استفاده کنیم، طول بردار برای هر یک 1206 خواهد بود زیرا 1206 کلمه منحصر به فرد با حداقل فراوانی 2 وجود دارد. اگر حداقل فراوانی وقوع روی 1 تنظیم شود، اندازه وکتور کیسه کلمات بیشتر افزایش خواهد یافت. از سوی دیگر، بردارهای تولید شده از طریق Word2Vec تحت تأثیر اندازه واژگان قرار نمی گیرند.

پیدا کردن کلمات مشابه

قبلاً گفتیم که اطلاعات متنی کلمات با استفاده از رویکرد Word2Vec از بین نمی رود. ما می توانیم با یافتن تمام کلمات مشابه کلمه “هوش” این موضوع را تأیید کنیم.

به اسکریپت زیر دقت کنید:

sim_words = word2vec.wv.most_similar('intelligence')

اگر شما print را sim_words متغیر به console، شبیه ترین کلمات به “هوش” را همانطور که در زیر نشان داده شده است خواهید دید:

('ai', 0.7124934196472168)
('human', 0.6869025826454163)
('artificial', 0.6208730936050415)
('would', 0.583903431892395)
('many', 0.5610555410385132)
('also', 0.5557990670204163)
('learning', 0.554862380027771)
('search', 0.5522681474685669)
('language', 0.5408136248588562)
('include', 0.5248900055885315)

از خروجی می توانید کلمات مشابه “هوش” را به همراه شاخص شباهت آنها مشاهده کنید. کلمه “ai” با توجه به مدل مشابه ترین کلمه به “هوش” است که در واقع معنی دارد. به همین ترتیب، کلماتی مانند «انسان» و «مصنوعی» اغلب با کلمه «هوش» همزیستی دارند. مدل ما تنها با استفاده از یک مقاله ویکی‌پدیا، این روابط را با موفقیت ثبت کرده است.

نتیجه

در این مقاله، ما یک مدل تعبیه کلمه Word2Vec را با کتابخانه Gensim Python پیاده سازی کردیم. ما این کار را با خراش دادن یک مقاله ویکی‌پدیا انجام دادیم و مدل Word2Vec خود را با استفاده از مقاله به عنوان یک مجموعه ساختیم. ما همچنین به طور خلاصه متداول ترین روش های جاسازی کلمه را به همراه مزایا و معایب آنها به عنوان مقایسه با Word2Vec مرور کردیم.

من به شما پیشنهاد می‌کنم با کمک هر مجموعه متنی یک مدل Word2Vec برای خودتان ایجاد کنید و ببینید آیا می‌توانید نتایج بهتری در مقایسه با رویکرد کیسه کلمات بگیرید یا خیر.

(برچسب‌ها به ترجمه)# python



منتشر شده در 1403-01-27 07:04:04

امتیاز شما به این مطلب
دیدگاه شما در خصوص مطلب چیست ؟

آدرس ایمیل شما منتشر نخواهد شد.

لطفا دیدگاه خود را با احترام به دیدگاه های دیگران و با توجه به محتوای مطلب درج کنید