מבוא לעיבוד שפה באמצעות Gensim ו-Word2Vec

מחבר:
בתאריך:

Gensim היא חבילה של פייתון לעיבוד שפה (Natural Language processing) באמצעות למידת מכונה. Natural Language processing ,NLPׁ מיישם למידת מכונה על טקסט.

הבעיה העיקרית שהמחשב צריך לפתור כדי לבצע למידת מכונה על טקסט היא שהתהליך דורש ביצוע פעולות חשבוניות על וקטורים. לכן הדבר הראשון שהמחשב עושה הוא להמיר את הטקסט לוקטורים שמתארים מילים. התוצאה של התהליך היא word embedding רשימה שממפה מילים לוקטורים.

Word embeddings היא רשימה שממפה מילים לוקטורים.

 

Word2Vec הם אלגוריתמים שמייצרים Word embeddings

Word2Vec הם אלגוריתמים שמייצרים Word embeddings.

משימה מעניינת ש- Word2Vec מאפשר היא מציאת מילים דומות. לדוגמה, למצוא את המילים הדומות ל"תפוח" בתוך טקסטים. לבני האדם קל לעשות את הקשר ולהבין שהמילים "אגס", "פרי" ו"מתוק" קשורים לתפוח אבל למחשב המשימה אינה פשוטה והיא מצריכה אימון על מסד נתונים ענק שהעיבוד שלהם דורש משאבי מחשוב גדולים.

הדרך הפשוטה ביותר להפוך מילים לוקטורים הוא על סמך ההקשר שבו הם נמצאות מתוך הנחה שמילים המופיעות בסמיכות הם דומות יותר. לדוגמה, ניתן לספור את השכיחות של מילים שונות בספר כלכלה ובספר מתמטיקה, ולקבל רשימה כזו:

מילה

ספר כלכלה

ספר מתמטיקה

וקטור

80

120

תפוקה

120

12

אמצעי ייצור

50

0

פיתגורס

1

78

נעלם

2

250

משוואה

70

90

כל שורה בטבלה מקבילה לוקטור שמתאר מילה אחת ייחודית.

מזה גם אנחנו יכולים לראות שהמילים "נעלם" ו"פיתגורס" קרובים יותר כי הם מרבים להופיע בספר המתמטיקה ואינם שכיחים בספר הכלכלה.

באופן דומה, מחשב יכול לתאר מילה באמצעות וקטור המכיל מספר רב של קטגוריות. את הקטגוריות קובע המחשב באופן שלא תמיד ברור לנו.

האלגוריתמים יכולים להגיע לרמת גבוהה של הבנת הקשרים בין מילים. דוגמה קלאסית היא ביצוע פעולות מתמטיות על וקטורים של מילים שמראה ש "מלך" פחות "גבר" ועוד "אישה" שווה "מלכה".

word2vec מוצא קשר בין מילים לדוגמה מלך פחות גבר ועוד אישה שווה למלכה

שלושת האלגוריתמים העיקריים המשמשים ל-word embedding הם : Word2Vec, GLoVe, FastText. במדריך זה נפתח מודל מבוסס אלגוריתם Word2Vec באמצעות ספריית Gensim.

 

ייבוא הספריות שישמשו במדריך

הקוד במדריך פותח על גבי פלטפורמת colab של גוגל.

from gensim.models.word2vec import Word2Vec
from multiprocessing import cpu_count
import gensim.downloader as api

 

2. ייבוא מסד הנתונים שעליו נאמן את המודל

# Download the dataset
dataset = api.load("text8")
data = [d for d in dataset]

מסד הנתונים text8 כולל את מיליארד הבייטים הראשונים של וויקיפדיה באנגלית.

 

3. נחשב את המודל

# Train Word2Vec model
model = Word2Vec(data, min_count = 0, workers=cpu_count())

המודל מבוסס על אלגוריתם Word2Vec.

 

4. הערכת המודל ומציאת מילים דומות

לפני שנעריך את המודל ונראה דוגמה למה שניתן לעשות איתו, מעניין לצפות בוקטור שפיתח המודל עבור מילים מסויימות, לדוגמה:

# What is the vector for a specific word
model['computer']
array([-0.4556992 , -1.3862419 , -1.8048558 , -0.99020433, -1.8391104 ,
       -1.2232118 ,  1.6570348 , -0.5733954 ,  1.301653  ,  0.7046181 ,
        3.5673776 ,  1.4294931 ,  1.7671193 ,  2.9676414 , -1.0262669 ,
       -0.5415519 ,  1.5530779 , -0.31864733,  2.1040018 ,  2.4623108 ,
        0.1254964 ,  0.14440827, -1.022954  , -0.49929366,  1.2939268 ,
        0.48723364, -0.08392578, -0.4165755 ,  1.6926756 , -0.8817703 ,
       -2.5548038 , -1.6914276 ,  2.784908  ,  3.1269388 , -2.4126492 ,
       -0.3693157 ,  1.984339  ,  0.61644703, -4.5196004 , -1.9094042 ,
        0.6563388 ,  0.21732877, -0.47493523, -0.33547932, -0.9218038 ,
        1.8590525 ,  1.9552816 ,  2.9326048 , -2.5484583 , -0.9174693 ,
       -0.9689221 ,  3.6791236 , -0.76825094,  0.39009356,  0.14539249,
        0.09960414,  0.24469626, -0.29692438,  0.31805772, -0.15215315,
        0.46852365, -0.9507698 , -1.0477052 ,  2.5365412 , -0.53734595,
       -0.06571991, -0.7088819 ,  0.01710024,  1.8660653 ,  1.0688304 ,
        1.1716064 ,  0.26592818, -2.1123452 , -1.5442512 ,  2.626128  ,
        1.8971505 ,  0.7942581 ,  0.10705332, -2.5659127 , -0.62169796,
       -3.7376935 , -2.4376974 ,  1.5072051 ,  0.25494763,  4.2154155 ,
        1.2217032 , -0.02796807, -2.158551  , -2.5484815 , -1.5887915 ,
       -0.6711285 ,  0.22806092, -1.4221463 ,  2.538666  ,  0.8001251 ,
       -1.3699907 , -0.85555667,  2.5453928 , -1.7741997 ,  2.1562831 ],
      dtype=float32)

מה זה? כנראה הדרך של word2vec להגיד computer.

ננסה למצוא מילים דומות ל-computer:

model.most_similar('computer')
[('computing', 0.7343160510063171),
 ('computers', 0.733823299407959),
 ('programmer', 0.7003257870674133),
 ('digital', 0.6923951506614685),
 ('console', 0.6823383569717407),
 ('hardware', 0.676087498664856),
 ('programmable', 0.6677011251449585),
 ('calculator', 0.6599054932594299),
 ('handheld', 0.6573418378829956),
 ('mainframe', 0.6570556163787842)]

לא רע בכלל.

ננסה לבדוק את המודל על מילה שבטוח שאין בוויקיפדיה באנגלית:

model.most_similar('לא שייך')

והתוצאה היא הודעת שגיאה:

KeyError: "word 'לא שייך' not in vocabulary"

לכל המדריכים בנושא של למידת מכונה

 

אהבתם? לא אהבתם? דרגו!

0 הצבעות, ממוצע 0 מתוך 5 כוכבים

 

הוסף תגובה חדשה

 

= 5 + 6