ملکه=زن+مرد-پادشاه
مدلهای Word2vec و GloVe در زمینه نمایش برداری کلمات در حوزه پردازش زبان طبیعی مشهور هستند. سایتها و منابع مناسب مختلفی همچون دو مورد زیر برای یادگیری Word2vec موجود هستند:
https://www.kaggle.com/c/word2vec-nlp-tutorial
https://www.tensorflow.org/tutorials/representation/word2vec
هدف این پست آموزش این دو مورد نیست، فقط یک مثال کوچک مشهور را خواهیم دید. در بسیاری از موارد آموزشی، مثال {«زن» + «مرد» – «پادشاه»} را میبینیم که نتیجه آن «ملکه» میشود:
King – man + woman → Queen
برای اجرای آن باید یک مدل آموزش دیده داشته باشیم، یکی از این مدلها، فایل یک و نیم گیگابایتی گوگل (مبتنی بر مدل Word2vec) است؛ که حجم زیاد آن، ممکن است مانعی برای اجرای مثال مربوطه باشد. برای تست لازم نیست این فایل را داشته باشیم و میتوان از فایلهایی با حجم کمتر مانند glove-wiki-gigaword-100 (مبتنی بر مدل GloVe) استفاده کرد. این دو مدل با هم متفاوت هستند، اما فعلاً فقط مایلم یک مثال اجرا کنم. مثال ۴ خطی زیر نحوه کار را نشان میدهد:
[python] import gensim.downloader as api word_vectors = api.load("glove-wiki-gigaword-100") result = word_vectors.most_similar(positive=['king','woman'], negative=['man']) print(result[0][0]) [/python]
خروجی قطعه کد بالا «queen» خواهد بود.
فایل glove-wiki-gigaword-100 که مشتمل بر ۴۰۰ هزار بردار از ویکی پدیا بوده و ۱۲۸ مگابایت حجم دارد، با اجرای مثال فوق به صورت خودکار دانلود میشود. مشخصات این فایل و چندین مدل دیگر را میتوانید دراین مقاله و اینجــــــا ملاحظه فرمایید.
مثال بالا در آناکوندا نسخه 1.9.2 و gensim نسخه 3.6.0 اجرا شده است.
شکل زیر نمایش برداری مثال بالا را نشان میدهد:
مدل برداری کلمات فارسی
اجرای این مثال در فارسی هم درصورت داشتن یک مدل مناسب امکانپذیر است. مدل با حجم نسبتا کم پیشنهادی در این پست، این مدل اشاره شده در سایت دانشگاه قم با نام FinalModel است. این مدل، مدل برداری کلمات فارسی بر اساس ویکیپدیای فارسی (تا تاریخ ۲۰ اکتبر ۲۰۱۶، ۲۶۰ مگابایت) میباشد. با این فرض که این فایل را دارید، کد مربوطه برای نمایش مثال فوق به صورت زیر خواهد بود:
[python] import gensim model = gensim.models.KeyedVectors.load_word2vec_format('PATH/TO/FinalModel') result = model.most_similar(positive=['پادشاه','زن'],negative=['مرد']) [/python]
خروجی کد بالا «ملکه» میباشد 🙂
کد زیر اولین چند کلمه خروجی مدل را به ما میدهد:
که خروجی آن موارد زیر است:
- ملکه
- شاهنشاه
- فرمانروای
- ولیعهد
- شهبانوی
- امپراتور
- نایبالسلطنه
- امپراتریس
- وشتی
- شاهان
همانگونه که ملاحظه میشود، خروجیها تقریبا مورد قبول میباشند.
(وشتی، نام همسر خشایارشا بوده است)