מבוא לעיבוד שפה באמצעות 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 את המשמעות הסמנטית של המילה (=היחס של המילה לשאר המילים במילון שעליו אימנו את האלגוריתם) ב-100 ממדים שונים.

len(model['computer'])
100

מציאת המשמעות הסמנטית מאפשרת ל-word2vec לחשב את מידת הדמיון של מילה מסוימת לשאר המילים. לדוגמה, נמצא מילים דומות ל-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"

מהסיבה שהאלגוריתם אומן על מילון שלא כולל את הביטוי המבוקש, ולכן הוא לא קיים ביקום שלו.

אפשר ללכת הפוך ולברר את מידת הדמיון בין שתי מילים:

model.similarity('computer','digital')
0.6843948

האם מידת הדמיון היא רבה או מועטה?

model.similarity('computer','stone')
-0.020096581

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

model.most_similar(positive=['woman','king'], negative=['man'])
[('queen', 0.7080748081207275),
 ('prince', 0.6726657748222351),
 ('throne', 0.6644429564476013),
 ('princess', 0.6607816219329834),
 ('empress', 0.6437385678291321),
 ('son', 0.6313564777374268),
 ('isabella', 0.6212198138237),
 ('emperor', 0.6151455044746399),
 ('kings', 0.6105024814605713),
 ('daughter', 0.6076632738113403)]

ואפילו ניתן למצוא את המילה יוצאת הדופן מתוך רשימה של מילים:

model.doesnt_match("train auto car vehicle software".split())
'software'

 

סיכום

word2vec הוא אלגוריתם שמשמש במשימות של עיבוד שפה טבעית כדי ללמוד את המשמעות הסמנטית של מילים דרך הפיכת מילים לוקטורים של מספרים שאיתם המחשב יכול לעבוד (Embedding). חסרון גדול של השיטה שהיא מנפיקה וקטור אחד לכל מילה, והוקטור הזה אמור לתפוס את המשמעויות השונות של המילה ללא תלות בתפקיד שהיא ממלאת במשפט. זה יכול להיות בעייתי כי משפט כמו "אישה נעלה נעלה נעלה נעלה את הדלת בפני בעלה" יראה כמו ג'יבריש למודל. מודלים חדישים יותר כדוגמת ELMO ו-BERT מצליחים לייצר וקטורים שונים לאותה מילה בהתאם לתפקיד שהמילה ממלאת במשפט, ולכן הם מצליחים יותר במשימות של עיבוד שפה.

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

 

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

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