فهرست مطالب
معرفی تکنیک قدرتمند Word Embeddings
در بخش قبلی از مجموعه مقالات آموزشی دیدیم که بردارسازی (vectorization) و بهدستآوردن بردار عددی کلمات، برای هر پروژۀ classification، از مراحل لازم و ضروری است. همچنین با روشهای Bag-of-Words (مقاله bag of words چیست) و TF-IDF (مقاله TF-IDF چیست) آشنا شدیم و دیدیم که این روشها ساده و کاربردی هستند، اما معایبی هم دارند:
- meaning و context کلمات در نظر گرفته نمیشود.
- ماتریس ویژگی بهدستآمده یعنی document-term، بزرگ و خلوت (sparse) است.
- فرایند بردارسازی کاملاً به پیکرۀ متنی (corpus) وابسته است. یعنی کلمات یکسان در corpusهای مختلف، بردارهای متفاوتی خواهند داشت.
در این بخش از مجموعه مقالات آموزشی، با روش بردارسازی دیگری به نام word embeddings آشنا میشویم که بر این معایب و کاستیها غلبه میکند!
مزایای روش Word Embedding چیست؟
در سال 2013، روش جدیدی برای vectorize کردن متن، به نام Word embeddings ارائه شد و باعث انقلاب بزرگی در حوزه NLP شد. در فاصلههای زمانی خیلی کوتاه سه تکنیک embedding با نامهای Word2vec، GloVe و fastText معرفی شدند.
- سال 2013: تکنیک word2vec توسط Thomas Mikolov در Google ارائه شد.
- سال 2014: تکنیک GloVe توسط Jeffrey Pennington در Stanford ارائه شد.
- سال 2016: تکنیک fastText توسط Piotr Bojanowski در Facebook ارائه شد.
این تکنیکهای جدید بردارسازی متن، کاستیها و معایب ذاتی tf-idf را حل میکنند. در این تکنیکها، شباهت معنایی (semantic similarity) بین کلمات حفظ میشود؛ به عبارتی دیگر، با بردارهای بهدستآمده از این تکنیکها، میتوان معنای کلمات را تشخیص داد و میزان شباهت کلمات مختلف را با یکدیگر به دست آورد.
الان که با مفاهیم پردازش زبان طبیعی آشنا شدید، میخواهید تخصصیتر وارد این حوزه شوید؟ پس دوره آموزش پردازش زبان طبیعی مقدماتی را از دست ندهید. تمامی مفاهیم را با پروژههای کاربردی یاد بگیرید.
ویژگیهای مشترک تکنیکهای word embedding چیست؟
- شباهت معنایی کلمات را حفظ میکنند.
همانطور که گفته شد، یکی از مهمترین ویژگی روشهای embeddings، قابلیت آنها برای درک رابطه معنایی بین کلمات است. بهعنوانمثال:
چکش (hammer) و انبردست (pliers) هر دو ابزار هستند. ازآنجاییکه این دوکلمه از نظر معنا مشابه و مرتبط هستند، بردارهای عددی آنها نیز به یکدیگر نزدیک خواهند بود. بهاینترتیب، بردار دوکلمه سیب (apple) و گلابی (pear) یا بردار دوکلمه کامیون (truck) و وسیله نقلیه (vehicle) نیز به همین شکل به یکدیگر نزدیک خواهند بود.
اگر بردار کلمات را در یک صفحه دوبعدی تصویرسازی کنیم، میبینیم که کلمات مشابه در مختصات نزدیک به هم گروهبندی میشوند. در شکل زیر، هر پنج کلمه مشابه در یک گروه قرار گرفتهاند. بهاینترتیب، 9 گروه 5 عضوی اعم از گروههای Paris، London، Moscow، Twitter، Facebook، pizza، fish، train و car را داریم:
شباهت کلمات (Word similarity) بر اساس تکنیک Word2vec
همانطور که مشخص است کلماتی که از نظر معنایی مشابهاند، فاصله کمی با یکدیگر دارند! یا اکثر امامزادهها!
با استفاده از تکنیک embedding، میتوان میزان شباهت یا تفاوت بین کلمهها را محاسبه کرد. بهعنوانمثال، ارتباط معنایی بین کلمه woman در مقایسه با کلمه queen، همانند ارتباط معنایی کلمه man در مقایسه با کلمه king است. یا کلمه Paris در مقایسه با کلمه France، همانند کلمه Berlin در مقایسه با کلمه Germany است. پس بهراحتی میتوان بردارهای عددی کلمات را تفریق و جمع کرد و برخلاف Tf-idf خروجیهای معنادار به دست آورد.
در این حالت، فاصله بین بردار کلمات woman و queen و فاصله بین بردار کلمات man و king مشابه است.
ازآنجاییکه embeddings، رابطه معنایی بین کلمات را در نظر میگیرد، مدلها میتوانند روی یادگیری الگوهای پیچیدهتر و مفاهیم عمیقتر مانند عبارات (phrases)، وابستگیها (dependencies)، نحو (syntax)، یا معنا (semantics) تمرکز کنند که باعث افزایش عملکرد کلی مدلها میشود.
اما مزایای embeddings فقط به شباهت معنایی کلمات، محدود نمیشود و داستان فراتر از این حرفها است:
- دارای بردارهای متراکم (Dense Vectors) هستند.
بردارهای word embeddings، متراکم (dense) هستند. به این معنی که همه مقادیر غیر صفر هستند (به جز بعضی از المانهایی که بر اساس شرایطی دارای مقدار صفر هستند). بهاینترتیب، اطلاعات بیشتری به مدل دستهبندی (classification) یا خوشهبندی (clustering) داده شده که منجر به عملکرد بهتر آنها میشود.
به زبان خودمانیتر: معمولاً در متن و پردازش متن، وقتی بردار کلمات صفر باشد، یعنی بیارزشی و بیمعنایی. پس هرچقدر بردارها شامل اعداد غیر صفر باشند، شانس ضبط و ذخیره معنی و مفاهیم زیادتر میشود.
- اندازه بردار کلمات ثابت است و اصطلاحاً Constant Vector Size دارند.
با استفاده از word embeddings، دیگر اندازه بردار کلمات، به تعداد داکیومنتهای موجود در پیکرۀ متنی وابسته نیست و ابعاد بردارها ثابت، محدود و قابلکنترل میشود.
هنگام آموزش مدلهای embedding، ابعاد بردار کلمات بهعنوان پارامترهای مدل استفاده میشود. ما از قبل تصمیم میگیریم که برای نمایش هر کلمه به چه اندازه برداری (vector size) نیاز داریم. معمولاً برای embeddings از پیش آموزشدیده (pre-trained embeddings)، از ابعاد 50، 100 و 300 استفاده میشود.
پس اندازه این بردارها، قابل تغییر است و قبل از آموزش مدل تنظیم میشود.
- بردار کلمات بهدستآمده، مستقل (Absolute) هستند.
با استفاده از word embeddings، بردار کلماتی مستقل از ماهیت و محتوای پیکره متنی است.
به زبان خودمانیتر: اگر با نظرات سایت آمازون کار کنید یا روی مقالات علمی سایت بهداشت جهانی یا حتی توییتهای روزانه مردم، باز بردارها یکسان خواهند بود. (این بده!)
word embeddings بر روی ابردیتاستها آموزش داده میشوند. بهعنوانمثال، Word2vec بر روی دیتاست Google News شامل 100 میلیارد کلمه، GloVe بر روی دیتاستی متشکل از 6 میلیارد کلمه و fastText بر روی 16 میلیارد توکن، آموزش داده شدهاند. بهاینترتیب، این مدلها کلمات زیادی را پوشش داده و برای هر کلمه بردار ایجاد میکنند. word2vec دارای 3 میلیون کلمه، GloVe دارای 400 هزار کلمه و fastText دارای 1 میلیون کلمه است.
- دارای چندین Embedding Models هستند.
آخرین مزیت این است که میتوانیم مدلهای pre-trained را دانلود کرده و مستقیماً از بردار کلمات آنها استفاده کنیم. بدون اینکه لازم باشد برای هر پیکره متنی خاص، مدل جدیدی را آموزش دهیم!
انواع مختلفی از مدلهای pre-trained embedding، بهصورت آنلاین وجود دارند. فهرستی از این مدلها در gensim-data repository موجود است. یکی دیگر از کتابخانههای مهم word embedding، کتابخانه spaCy است که کار ما در فراخوانی و استفاده از مدلهای آماده را راحت میکند.
در کنار مزایای ذکر شده، این مدلها یک سری تفاوتهای اصلی با یکدیگر دارند. این تفاوتها عبارتاند از:
- نحوه ایجاد و آموزش مدل: هرکدام از مدلهای word2vec، GloVe و fastText به روشهای مختلفی آموزش داده شدهاند (در مقاله مدل زبانی، این موضوع را بیشتر بررسی خواهیم کرد).
- متفاوت بودن اندازۀ بردارها: هر مدل یک اندازه دلخواهی برای بردارها انتخاب کرده است.
- ماهیت دادههای آموزشی و مجموعه واژگانی (vocabulary) که شامل میشوند، متفاوت هستند.
میتوانیم این تفاوتها را در این مدلها ببینیم. بهعنوانمثال:
- glove-twitter-50، یک مدل GloVe با بردارهای 50تایی است که بر روی دیتاست Twitter آموزشدادهشده است.
- glove-wiki-gigaword-100 یک مدل GloVe با اندازه 100 است که بر روی Wikipedia 2014 و Gigaword 5 آموزش داده شده است.
- word2vec-google-news-300 یک مدل word2vec با اندازه 300 است که بر روی دیتای Google News (که چیزی حدود 100 میلیارد کلمه است)، آموزشدادهشده است.
اکنون که فهمیدیم word embedding چیست و باقدرت و مزایای آن آشنا شدیم، میتوانیم بررسی دقیقتری روی بعضی از مدلهای pre-trained که در gensim-data repository آورده شدهاند، داشته باشیم!
در دوره آموزش متن کاوی فارسی با شبکههای عصبی با تمرکز روی زبان فارسی، جدیدترین تکنیکهای پردازش زبان طبیعی با کدنویسی فراوان آموزش داده میشود.
قابلیتهای کتابخانه Gensim
Genism و spaCy دو کتابخانه اصلی پایتون هستند که با مدلهای word embeddings که بهصورت pre-trained هستند، کار میکنند. کتابخانه spaCy را پیش از این در مقالههای قبلی بررسی کردیم، در این مقاله کتابخانه Gensim را بررسی میکنیم.
میتوان Gensim را با هر دو روش pip و conda نصب کنیم:
• pip: pip install --upgrade gensim
• conda: conda install -c conda-forge gensim
داکیومنت و مستندات کتابخانه Gensim نسبت به NLTK یا spaCy نامرتبتر هستند، اما چاره چیست؟! باید با آن کنار بیاییم، زیرا Gensim یکی از مهمترین کتابخانههای حوزه NLP است.
پیشازاین Gensim بهعنوان یکی از کتابخانههای مهم topic modeling (تکنیکی unsupervised برای بهدستآوردن موضوع یک پیکرۀ متنی) شناخته میشد.
علاوه بر topic modeling، Gensim به ما این امکان را میدهد که با چند مورد از تکنیکهای مختلف embeddings که تا الان معرفی کردیم، به طور مستقیم کار کنیم. در این مقاله میخواهیم با مدل اصلی word2vec با حجم Gb 1.7 به نام word2vec-google-news-300 کار کنیم.
میتوانیم این مدل را تنها با دو خط کد در Gensim، load کنیم:
import gensim.downloader as api
model = api.load("word2vec-google-news-300")
چند مورد از مهمترین توابع کتابخانه Gensim عبارت است:
- model[word]: برای بهدستآوردن بردار یک کلمه استفاده میشود.
- most_similar: کلمه موردنظر را بهعنوان ورودی به تابع میدهیم و فهرست شبیهترین کلمات به آن را، بازگرداند.
- similary: برای محاسبه میزان شباهت بین دوکلمه، استفاده میشود.
بهعنوانمثال:
model[‘book’]، برداری با 300 المان (elements) بازمیگرداند. میتوانیم 10 المان اول را ببینیم:
# 10 first elements of the book vector
model['book'][:10]
نتیجه به صورت زیر است:
> array([ 0.11279297, -0.02612305, -0.04492188, 0.06982422, 0.140625 ,
0.03039551, -0.04370117, 0.24511719, 0.08740234, -0.05053711],
dtype=float32)
تابع most_similar، ده کلمه مشابه به کلمه موردنظر را به همراه similarity score بازمیگرداند:
model.most_similar("book")
> [('tome', 0.7485830783843994),
('books', 0.7379177808761597),
('memoir', 0.7302926778793335),
('paperback_edition', 0.6868364214897156),
('autobiography', 0.6741527318954468),
('memoirs', 0.6505153179168701),
('Book', 0.6479282975196838),
('paperback', 0.6471226811408997),
('novels', 0.6341459155082703),
('hardback', 0.6283079981803894)]
model.most_similar("apple")
>[('apples', 0.720359742641449),
('pear', 0.6450697183609009),
('fruit', 0.6410146355628967),
('berry', 0.6302295327186584),
('pears', 0.613396167755127),
('strawberry', 0.6058260798454285),
('peach', 0.6025872826576233),
('potato', 0.5960935354232788),
('grape', 0.5935863852500916),
('blueberry', 0.5866668224334717)]
تابع similarity، امتیاز شباهت کسینوسی (cosine similarity score) بین دوکلمه را محاسبه میکند:
model.similarity("apple", "banana")
> 0.5318406
model.similarity("apple", "cat")
> 0.2074908
model.similarity("cat", "dog")
> 0.76094574
نتایج بهدستآمده از تکنیک word2vec به ما نشان میدهد که cat در مقایسه با dog و apple، بیشتر به dog شبیه است (که کاملاً منطقی و مورد انتظار است). قسمت جالب ماجرا اینجاست که cat و dog از apple و banana هم شباهت بیشتری به یکدیگر دارند؛ زیرا امتیازشان بالاتر است!
فهرست واژگان Word2vec
میتوانیم برخی از واژگان مدل word2vec را با دستور model.key_to_index را مشاهده کنیم. این دستور، واژگان یا vocabulary مدل را بهصورت دیتاتایپ دیکشنری، بازمیگرداند. در این دیکشنری هر کلمه بهصورت key و index ذخیره شده است. میتوانیم 5 مورد از این واژگان را بهصورت تصادفی انتخاب کنیم:
import numpy as np
vocab = model.key_to_index.keys()
np.random.choice(vocab, 5)
که خروجی آن به این شکل خواهد بود:
['Vancouver_Canucks_goaltender', 'eSound', 'DLLs', '&A;', 'Rawdha']
اگر خط آخر کد را چند مرتبه اجرا کنیم، با هر بار اجرا نتایج متفاوتی میبینیم. به طور مثال با دو بار اجرا، دو خروجی زیرا را میبینیم:
['Hodeidah', 'Cheatum', 'Mbanderu', 'common_equityholders', 'microfabricated']
['Dataflow', 'Ty_Ballou', 'Scott_RUFFRAGE','prawn_dish', 'offering']
word2vec vocabulary تنها شامل کلمات معمولی نیست و علاوه بر این کلمه، موارد زیر را نیز در بر دارد:
- گروههای دوکلمهای (Bigrams) و گروههای سه کلمهای (Trigrams)، مانند: common_equityholders ، prawn_dish و Vancouver_Canucks_goaltender
- اسامی خاص (Proper nouns)، مانند: Scott_RUFFRAGE و Ty_Ballou
- دنباله کاراکترهای خاص (Specific character sequences)، مانند: A&
توجه داشته باشید، کلماتی که شامل حروف بزرگ و یا حروف کوچک انگلیسی میشوند، با هم تفاوت دارند. یعنی دوکلمه dog و Dog بردار عددی یکسانی ندارند. بهعنوانمثال، اگر دوکلمه apple و Apple را باتوجهبه مدل word2vec مقایسه کنیم:
- apple یک میوه است (کلمات مشابه آن عبارتاند از: apples ، pear و fruit).
- Apple نیز نام یک شرکت است (کلمات مشابه آن عبارتاند از: Apple_AAPL ، Apple_Nasdaq_AAPL و Apple_NASDAQ_AAPL)
محاسبه شباهت بین کلمات با معیار شباهت کسینوسی
پیشازاین گفتیم که میتوانیم شباهت بین کلمات را حساب کنیم. احتمالاً کنجکاو شدید که چطور میتوانیم این کار را انجام دهیم. در این بخش، آن را بررسی میکنیم.
شباهت بین کلمات با استفاده از معیاری به نام cosine similarity محاسبه میشود. اگر بردار عددی دوکلمه A و B را داشته باشیم، cosine similarity آنها به این صورت تعریف میشود:
- A⃗=[a1,a2,⋯,an]و B⃗ =[b1,b2,⋯,bn]
- Norm یا نرم 2 بردار A⃗
- A⃗ ⋅B⃗ برابر است با ضرب داخلی (dot product) دو بردار A⃗ و B⃗ (یعنی مؤلفههای متناظر هر دو بردار در هم ضرب شده و در پایان با هم جمع شوند.)
به طور مثال، اگر دو بردار A⃗ و B⃗ ، بردارهای سهبعدی باشند:
A⃗ =[a1,a2,a3]
B⃗ =[b1,b2,b3]
محاسبات ذکر شده برای آنها به این صورت خواهد بود:
علاوه بر Cosine similarity معیارهای دیگری نیز برای محاسبه شباهت بین کلمات وجود دارد؛ اما وقتی که با word embeddings سروکار داشته باشیم، Cosine similarity متداولترین روش است.
معیار شباهت Edit distance یا Levenshtein distance
روش دیگری به نام Edit distance وجود دارد که با نام Levenshtein distance نیز شناخته میشود. این فاصله، حداقل تعداد کاراکتر موردنیاز برای تبدیل یکرشته به رشتۀ دیگر را نشان میدهد. این تبدیل میتواند شامل عملیات درج (insertions)، حذف (deletions) و یا جایگزینی (substitutions) باشد. (به عبارتی دیگر، به کمترین تعداد حذف، درج، یا جایگزینی حروف برای تبدیل یکرشته به رشتۀ دیگر،Levenshtein distance گفته میشود.)
بهعنوانمثال:
levenshtein('test','test') = 0
زیرا دو رشته موردنظر با هم برابرند و نیازی به درج، حذف و یا جایگزینی کاراکتر نداریم.
levenshtein('test','team') = 2
زیرا دو کاراکتر باید جایگزین شوند: s -> a و t -> m
معایب روش Word Embeddings چیست؟
مدلهایی که به دادههای آموزشی خود وابسته هستند، میتوانند دو عیب مهم داشته باشند: سوگیری فرهنگی (cultural bias) و واژگان جدیدی که در vocabulary مدلها نیستند (اصطلاحاً به این کلمات out-of-vocabulary یا OOV گفته میشود).
سوگیری فرهنگی
مدل word2vec بر روی دیتای حجیم Google News که شامل اخبار ایالات متحده است، آموزشدادهشده است. بهاینترتیب خبرهایی که داخل Google ایندکس شدهاند، در نظر گرفته شده و روابط بین کلمات آنها به مدل آموزشدادهشده است. آموزش بر روی چنین دادۀ حجیمی باعث میشود که مدل خواهناخواه، مقداری سوگیری فرهنگی داشته باشد.
میتوانیم یک مثال جالب با نام خانوادگی Alexis ببینیم. در ایالات متحده، Alexis یک نام دخترانه است، درحالیکه در بقیه جهان Alexis یک نام پسرانه است (البته تا جایی که من میدانم). اگر کلمات مشابه Alexis را در مدل word2vec به دست آوریم، میتوانیم بهراحتی bias گفته شده را مشاهده کنیم:
model.most_similar('Alexis')
> [('Nicole', 0.7480324506759644),
('Erica', 0.7453154921531677),
('Marissa', 0.7406104207038879),
('Alicia', 0.7322116494178772),
('Jessica', 0.7315416932106018),
('Amanda', 0.7279350757598877),
('Danielle', 0.7199565172195435),
('Stephanie', 0.7183051705360413),
('Brianna', 0.7114503383636475),
('Briana', 0.7054224014282227)]
همانطور که مشخص است، تمامی اسامی بهدستآمده، دخترانه هستند. این مسئله آنچنان اهمیتی ندارد؛ اما نمایانگر یادگیری مسائل فرهنگی خاص توسط مدل word2vec است. اما باید دقت کنید که این مدلها جامع (universal) و خنثی (neutral) نیستند، بلکه مستقیماً تحتتأثیر متن و پیکرۀ متنی که با آن آموزشدیدهاند، هستند.
Out-of-Vocabulary Words (OOV) چیست؟
یکی دیگر از مشکلات مدلهای GloVe و word2vec محدود بودن واژگان مدل است. در بخش word2vec vocabulary دیدیم که لیست توکنهای آن متنوع (heterogeneous) و پیچیده است. اما حتی با وجود داشتن بیش از 3 میلیون کلمه بهعنوان ورودی، یک سری کلمات خاصی وجود دارند که مدل word2vec نمیتواند آنها را شناسایی کند. به عبارتی دیگر، اینها کلماتی هستند که بردار مرتبطی برای آنها وجود ندارد. مانند:
- Covid (و همه عبارتهایی که شامل آن میشوند. با یا بدون “19-“)
- Word2vec (بله، word2vec اطلاعاتی از نام خودش ندارد).
با استفاده از کد زیر، میتوانیم تمام واژگان مدل word2vec که با رشته و یا مجموعه کاراکتر خاصی شروع میشوند را پیدا کنیم:
# find all the words starting with 'covid'
start_with = 'covid'
vocab = [tk.lower() for tk in list(model.key_to_index.keys()) if tk.lower()[:len(start_with)] == start_with]
vocab.sort()
vocab
بهاینترتیب، 15 توکن بازگردانده میشود که هیچکدام آن Covid مدنظر ما نیست:
['covidien', 'covidien', 'covidien_cov', 'covidien_imaging', 'covidien_ltd.', 'covidien_ltd_cov.n', 'covidien_mallinckrodt', 'covidien_manufactures_distributes', 'covidien_nyse_cov', 'covidien_optimark', 'covidien_plc', 'covidien_plc', 'covidien_plc', 'covidien_plc_cov', 'covidien_plc_nyse_cov']
این موضوع کاملاً طبیعی است؛ زیرا مدل word2vec در سالهای 2013/2014، چند سال پیش از دوران Covid، آموزشدادهشده است. استراتژیهای مختلفی برای مدیریت کلمات out-of-vocabulary وجود دارد. سادهترین آنها این است که برای واژگان جدیدی که در vocabulary مدلها نیستند، بردار صفر را در نظر بگیریم. یعنی برای خروجی تابع خود، از کد زیر یا شبیه به آن استفاده کنیم:
try:
return model[word]
except:
return numpy.zeros(N)
راهحل دیگر، استفاده از مدل pre-trained Word2vec و fine tune کردن آن باتوجهبه دیتاست خودمان است. بهاینترتیب برای کلمات out-of-vocabulary که در دیتاست وجود دارند، بردارهای مخصوص به خودشان محاسبه شده و نمایش برداری خودشان را خواهند داشت. به این فرایند یادگیری انتقالی (transfer learning) یا fine-tuning گفته میشود و بهویژه هنگام کار با دیتاستهایی با موضوع خاص (بهداشت و درمان (healthcare)، زیستپزشکی (biomedical)، حقوق (law)، یا نجوم (astronomy)) مفید است.
- در این مقاله فهمیدیم word embedding چیست و سه نوع تکنیک رایج word embedding عبارت است از: word2vec، GloVe و fastText.
- رویکرد word embeddings به رفع معایب و کاستیهای ذاتی رویکرد bag-of-words کمک میکند.
- شباهت معنایی (semantic relationship) بین کلمات حفظ میشود.
- دارای بردارهای متراکم (dense vectors) هستند. یعنی تقریباً تمام مقادیر آنها غیر صفر است و بهاینترتیب، اطلاعات بیشتری به مدل داده میشود.
- اندازۀ بردار کلمات ثابت و مستقل از تعداد داکیومنتهای موجود در پیکرۀ متنی است.
- نمایش برداری کلمات نیز، مستقل از ماهیت و محتوای پیکرۀ متنی است.
- میتوانیم مدلهای pre-trained را از gensim-data repository دانلود کنیم.
- البته رویکرد مبتنی بر word embeddings نیز معایب خاص خود را دارد:
- مدلها باتوجهبه دیتاست آموزشی خود، دارای سوگیری فرهنگی هستند.
- واژگان جدیدی هستند که در vocabulary مدلها نیستند (اصطلاحاً به این کلمات out-of-vocabulary یا OOV گفته میشود).
در مقاله بعدی، با مدل زبانی آشنا میشویم و مدلهای word2vec، GloVe و fastText را بهصورت جزئیتر و عمیقتر بررسی خواهیم کرد.