FUZZY LOOKUP – השוואה וחיפוש ערכי טקסט לפי התאמה חלקית
דמיינו לכם את הסיטואציה הבאה: קיבלתם שתי טבלאות נתונים, והתבקשתם לבצע חיפוש של ערך מסוים מהטבלה הראשונה, למצוא אותו בטבלה השנייה, ולהחזיר את הערך של אחת מהעמודות בשורה שבה איתרתם את הערך. עד כאן – נשמע כמו משימה קלה עבור פונקציית ה- VLOOKUP המפורסמת.
אך מה עושים כאשר הערכים בשתי הטבלאות הם לא בדיוק זהים? נניח – בטבלה הראשונה מופיע השם “יוסי כהן”, ואילו בטבלה השנייה – “יוסף כהן” (בהנחה שיוסי ויוסף הם כמו מוטי ומרדכי, רפי ורפאל ועוד שלל קיצורים ושיבושים שניתנו לשמות עבריים במרוצת השנים…)?
שימוש בפונקציית ה- VLOOKUP היה מוביל אתכם למבוי סתום. למרבה הצער, הפונקציה אינה יודעת להתמודד בצורה יעילה עם ערכים טקסטואליים שונים, והיא הייתה מחזירה חוסר התאמה. כך זה היה נראה:
האם בכל זאת יש דרך למצוא התאמה?
ובכן – התשובה חיובית. הגיע הזמן להכיר את הכלי השימושי שנקרא FUZZY LOOKUP.
הסיבה שכנראה לא שמעתם על הכלי הזה מעולם, היא שהוא לא מגיע כחלק מהאקסל שמותקן על מחשבכם. מדובר בכלי שפותח על ידי החבר’ה הגאונים של מיקרוסופט, ואשר מאפשר לנו למצוא התאמות בין ערכים דומים אך לא בהכרח זהים, ובנוסף להחזיר עבור ההתאמות שמצאנו את הערכים שאנו מעוניינים בהם, בדומה לפונקציית VLOOKUP רגילה. כדי לסבר לכם את האוזן – הכלי הזה עושה שימוש באלגוריתמים מתמטיים מורכבים שמחשבים את הדימיון בין המילים/הטבלאות שביקשתם להשוות – ומוצא התאמות לפי הגדרות הרגישות שקבעתם לו. נשמע לכם כמו סינית? המשיכו לקרוא ותראו איך הקסם הזה עובד ועד כמה הוא קל לשימוש!
איך משיגים את הכלי הזה?
- קודם כל, נוריד אותו מהאתר של מייקרוסופט (שימו לב – זה עובד החל מאקסל 2007): https://www.microsoft.com/en-us/download/details.aspx?id=15011
- שמרו וסגרו את כל חלונות האקסל הפועלים. כעת, הפעילו את ההתקנה ועקבו אחר הוראות ההתקנה.
- שימו לב שאם לא ציינתם אחרת, בתום ההתקנה תיפתח תיקייה שמכילה בתוכה מדריך מצוין באנגלית (קובץ ה- README) וכן קובץ שעמו ניתן לשחק כדי להבין את היכולות של הכלי.
- כעת הכלי מותקן ואפשר להתחיל לשחק עם היכולות שלו!
אופן השימוש ב- FUZZY LOOKUP
הערה: ניתן להוריד את קובץ הדוגמאות עמו נעבוד במהלך המדריך הזה על ידי לחיצה על הקישור.
חשוב להבהיר, בראש ובראשונה – הכלי הנ”ל הוא כלי חדש לחלוטין, הוא לא משנה את התפקוד של הפונקציות הקיימות בשום צורה שהיא.
הכלי נמצא בסרגל הכלים שלכם בלשונית חדשה שנוצרה בשם “Fuzzy Lookup”:
לפני שנפעיל אותו, בואו ניצור קודם את הנתונים שעמם נרצה לעבוד. נתחיל ברשותכם, עם דוגמא פשוטה ופטריוטית:
רמטכ”לים רבים במדינת ישראל אחזו בכינוי, בנוסף לשמם הרשמי. נתבקשנו להתאים בין רשימה שמית של הרמטכ”לים, לבין רשימה זהה שכוללת גם את הכינויים שלהם – ולהחזיר את תאריכי תחילת הכהונה שלהם. איך נעשה זאת?
קודם כל, ננסה עם VLOOKUP:
…רק כדי להיווכח שזה לא מועיל. כמו שאמרנו, VLOOKUP יודע לעבוד עם התאמות מלאות (יש כמה דרכים לעקוף את זה, אך לא נדון בזה כאן). בואו ננסה את כוחו של ה- FUZZY LOOKUP (מעתה נקרא לו בכינוי החיבה פאזי, ברשותכם…)!
שלבי הפעולה:
ראשית, כדי שפאזי יעבוד, עלינו להפוך את שני שדות הנתונים לטבלאות, כי ככה פאזי אוהב לעבוד. נעמוד על כל אחת מהטבלאות, נלחץ CTRL+T, ואז נלחץ ENTER.
לפני שממשיכים, לחצו על תא מסוים בכל אחת מהטבלאות, גשו בסרגל הכלים ללשונית “Design” הנמצאת מתחת ל”Table Tools”, ושימו לב לשם הטבלה. אנו נזדקק לכך בהמשך. כך זה אמור להיראות:
לפי הדוגמא שלנו, הטבלה עם השמות הרשמיים נקראת Table1, ואילו טבלת השמות עם הכינויים ותאריכי הכהונה – Table 2.
כעת ניגש למלאכה. נלחץ על כפתור Fuzzy Lookup שנמצא בסרגל הכלים ששמו Fuzzy Lookup.
כך זה נראה:
זוהי התצורה הראשונית בלבד. כעת נסביר מה עלינו לעשות בכל אחד מהשדות:
Left Table – ניתן להתייחס לזה כטבלת המקור שלנו. זו הטבלה שעבורה נרצה להחזיר את ההתאמות מהטבלה עם הכינויים והתאריכים.
Right Table – זוהי טבלת החיפוש שלנו. בטבלה הזו אנו נחפש את הערכים המתאימים לטבלה הראשונה, ונחזיר את ההתאמות שקיבלנו מעמודת התאריכים.
כעת שימו לב לשדות Left Columns ו- Right Columns שנמצאים ממש מתחת: כאן, עלינו להגדיר בין אילו עמודות אנחנו מעוניינים לבצע את החיפוש של ההתאמות. במקרה שלנו – אנו מעוניינים למצוא התאמות בין עמודת השמות הרגילים לבין עמודת השמות והכינויים. לשם כך, עלינו לסמן כעת את עמודת “שם+כינוי”, ומיד לאחר מכן ללחוץ על הכפתור המוקף בתמונה הבאה בעיגול אדום:
כעת, החלון ייראה כך:
עתה, נותר לנו להגדיר אילו עמודות נרצה להחזיר עבור ההתאמות שנמצא. בנקודה זו, עלינו להכריע אם אנו מעוניינים ליצור טבלה חדשה שמחברת את שתי טבלאות הנתונים ומספקת את ההתאמות, או שאנו מעוניינים אך ורק בהחזרת העמודה הרלוונטית מהטבלה השנייה. בינתיים ננסה את האפשרות הראשונה – לא ניגע באף אחד מהסימונים, כך שזה ייראה באופן הבא:
הואיל ובחרנו ליצור טבלה חדשה, לפני שנריץ את הכלי שלנו, נלחץ על תא ריק שבו נמקם את הטבלה החדשה. חשוב שיהיה לצד התא הריק הזה מספיק תאים ריקים נוספים כדי לאלכס את הטבלה החדשה שתיווצר. לאחר שלחצנו על התא הריק, נלחץ על הכפתור GO ונקבל את התוצאה המיוחלת:
מה רואים פה בעצם? לבקשתנו, פאזי יצר טבלה חדשה, שמורכבת משתי הטבלאות המקוריות, והוא ביצע עבורנו התאמה בין השמות הרגילים לשמות עם הכינויים, והחזיר עבור כל התאמה את התאריך הרלוונטי. העמודה השמאלית ביותר שנקראת “Similarity” בעצם מסבירה את רמת ההתאמה שנמצאה בין הערכים. ניתן למשל לראות שעבור רפול, הייתה התאמה של 0.9333, בעוד שעבור דן (דני) חלוץ – התאמה של 0.5417. אמנם לנו נדמה שדני חלוץ ודן חלוץ הינם כמעט זהים, עבור האלגוריתם – לא כך הדבר, משום שסך האותיות השונות מתוך סך האותיות במילים הוא די גבוה. אבל למה להלאות את עצמנו בהסברים מפרכים?
כעת, נניח שאיננו רוצים ליצור טבלה חדשה, אלא להוסיף עמודה חדשה לצד עמודת השמות הרשמיים בטבלה הראשונה…
נחזור למסך ההגדרות של פאזי, ונבקש ממנו להחזיר אך ורק את העמודה הבאה (ויתרנו על העמודות שחוזרות על עצמן, וכן על העמודה שמחזירה לנו את רמת ההתאמה):
לאחר מכן, נלחץ עם סמן העכבר שלנו על התא שנמצא משמאל לשורת הכותרת של הטבלה הראשונה (היכן שרשום “שם”). כעת, שוב נלחץ GO, וזו התוצאה שנקבל:
מגניב, נכון?
מציאת התאמות קשות יותר
עד כאן זה היה משחק ילדים. חיפשנו התאמות בין ערכים יחסית דומים. בואו נעלה רמה ונראה למה הכלי הזה מסוגל.
כעת נעבור לרשימת פוליטיקאים וכינוייהם. עתה, השמטנו את השמות הפרטיים שלהם – כך שמה שנותר לנו זה רק שמות המשפחה של הפוליטיקאים והכינויים שלהם, שכמעט ואין ביניהם לבין השמות שום דימיון… האם נצליח?
המטרה שלנו היא כמובן ליצור התאמה בין הכינוי לבין השם האמיתי, ולהחזיר את המפלגה הרלוונטית עבור כל פוליטיקאי. מטעמי פשטות, הפעם נפתור את הבעיה באמצעות טבלה חדשה שתכלול את כל העמודות…
בואו נריץ את פאזי! שוב, נהפוך את הטווחים לטבלאות (CTRL+T), ונסמן את ההגדרות הבאות (לא לשכוח ללחוץ על הכפתור ):
והנה התוצאות שנקבל:
אופס… לא קיבלנו את מה שרצינו. למה זה קרה?
ובכן, כפי שהסברנו בהתחלה – האלגוריתם של פאזי פועל לפי התאמה מתמטית בין מחרוזות טקסט. ביקשנו מפאזי למצוא התאמות, אך הביטויים שביקשנו להשוות הם ממש שונים מבחינתו ולכן הוא “ויתר עליהם”. איך נגרום לו לא לוותר? נבקש ממנו להוריד את סף ההתאמה שלו (Similarity Threshold). סף ההתאמה הראשוני הוא 0.5, שהוא סף יחסית סביר שיתאים עבור רוב הבדיקות שלנו, אך הוא לא מחייב וניתן לשנותו במידת הצורך. אז מה יקרה אם נזיז את הסף שמאלה, נניח לסף של 0.15?
נלחץ שוב על GO (ניתן ללחוץ עם סמן העכבר באותו מקום בו מיקמנו את הטבלה הקודמת, והטבלה החדשה תחליף את הטבלה הישנה שיצרנו):
עכשיו, קיבלנו התאמה עבור כל הערכים!
איך ידעתי שצריך דווקא 0.15 סף התאמה? לא ידעתי. עשיתי ניסוי וטעייה עד שקיבלתי את כל התוצאות (לא רציתי להלאות אתכם בעוד צילומי המסך…). וכך גם אתם תעשו כדי להגיע לתוצאה הרצויה.
נשמע כלי מדהים, איפה ה- CATCH?
ובכן – התאמה חלקית, כשמה כן היא – חלקית! ככל שנרד בסף ההתאמה שלנו, וככל שיהיו לנו יותר ערכים דומים, אנו עלולים להגיע למצב שבו “אביב כהן” יקבל התאמה עם “אבי כהן” (כשברור שמדובר בשני שמות שונים). לכן – חשוב מאוד להפעיל שיקול דעת עם הכלי הזה, ולדעת שלא תמיד הוא יתאים לנו.
מציאת מילים דומות
כעת נעבור לדוגמא האחרונה להיום – ונראה כיצד ניתן למצוא מילים דומות מתוך רשימה. נניח שאנחנו רוצים לאתר בתוך רשימה את המילים “כיסא” ו”כסא” או “תורקיה” ו”טורקיה”, ולקבל בעבורן התאמה – איך נעשה זאת?
ניקח את רשימת המילים הבאה:
כעת, אנו נצטרך לשחק עוד קצת עם ההגדרות של פאזי. ראשית, יש לנו רק טבלה אחת, ולכן נגדיר לפאזי את אותה הטבלה גם עבור “טבלה שמאלית” וגם עבור “טבלה ימנית”. שנית, אנו נבקש מפאזי ב- EXACT MATCHES להחזיר לנו 2 (ואם ידוע לנו שמדובר ברשימה עם הרבה וריאציות לאותה מילה, אז להגדיל את המספר עוד יותר). כך זה נראה:
חכו, לא סיימנו! כעת נלחץ על Configure, נלך ללשונית Global Settings ובשורה OutputExactMatches נסמן לו FALSE. זה בעצם אומר לפאזי שיחזיר לנו רק התאמות חלקיות (כדי לחסוך מאיתנו התאמות זהות, כמו “שולחן” שווה ל”שולחן”). כעת נאשר ונלחץ שוב GO ונקבל את הפלט הבא:
נחמד, לא? אמנם פאזי לא התאמץ והחזיר לנו כל התאמה פעמיים (פעם טורקיה בעמודה שמאל, ופעם טורקיה בעמודה ימין) – אך עדיין, הוא עזר לנו מאוד להבין אילו התאמות קיימות (וניתן לבצע הסרת כפילויות, במידת הצורך).
כמובן שניתן לשחק עוד ועוד עם ההגדרות – אך את זה אנחנו משאירים כבר לכם. מקווים שלמדתם ושתעשו שימוש טוב בכלי המגניב הזה!