אז מה היה לנו שם

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

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

ארבע שנים – לך תזכור

בוחרים לא מעטים מצביעים פעם אחר פעם לאותה מפלגה. חלק מתוך הזדהות עם ערכיה, אחרים מתוך חיבור רגשי עמוק. אבל, מספרים שאי שם מעבר לקשת יש עוד אנשים שמתחילים מערכת בחירות עם דף חלק ומחפשים את המפלגה שתעשה הכי טוב למדינה בשנים הקרובות. הבעיה הראשונה במימוש התפישה הזאת היא כפי שאמר הפיזיקאי נילס בוהר – “קשה להתנבא, בייחוד לגבי העתיד”, ולכן במקום לנבא את מעשיה של כל מפלגה אפשר להעריך אותה ע”פ המצע שלה, נסיון מעניין אך לעיתים חסר תוחלת בשל קשר רופף בלבד בין המצע לביצוע בפועל. עוד אפשרות היא להעריך כל מפלגה על פי מעשיה בעבר וכאן מגיעה הבעיה השנייה – מי בכלל זוכר מה היה פה ב-4 שנים האחרונות?

אז למה בעצם יש בחירות?

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

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

הגרף לעיל יחסית דינאמי, והקוראים מוזמנים לבחור להציג רק חלק מהביטויים ע”י לחיצה כפולה / יחידה עליהם, לעשות zoom-in ולהתמקד באיזור מסוים ע”י סימון שלו, ו-zoom-out ע”י לחיצה כפולה על הרקע.

כשבוחנים נושאים בודדים רואים ש:

  • פרשת הצוללות פרצה לחיינו באמצע 2016 ומאז צפה שוב ב-2017, 2018 עם התקדמות שלבי החקירה
  • גבאי יו”ר העבודה מאמצע 2017
  • פסקת ההתגברות תפסה תאוצה באמצע 2018
  • נתניהו הכי פופולארי בכל רגע נתון והפופולאריות שלו ממשיכה לעלות

 

כשמצליבים זוגות של נושאים אפשר לראות קפיצה בציוצים אודות בחירות במרץ 2018 במקביל לדיונים ערים בנושא התקציב וחוק הגיוס, ולעומת זאת בסוף 2018 הזינוק במספר האיזכורים של הבחירות מופיע במקביל לעליה חדה באיזכורים של חקירות נתניהו למשל בנושא הצוללות ובמקביל עליה של נושא הגיוס.

שתי הסתייגויות חשובות – 
1. מתמטיקאים יציינו בצדק שקורלציה (“מתאם”) בין מספר המופעים לא מעידה בהכרח על קשר סיבתי ישיר. זה נכון כמובן, אבל עדיין במקרה שלנו, הדעה המקובלת היא שיש קשר נסיבתי בין הדברים.
2. העובדה שמדברים על משהו לא הופכת אותו לנכון. ספציפית, אם מדברים על בחירות בהקשר של משבר חוק הגיוס זה לא אומר שזו אכן סיבת הבחירות. במובן הזה הקורפוס שאני עובד עליו בפוסט הזה כולל פחות דעות אישיות של האוכלוסיה הכללית ויותר טוויטים חדשותיים של מקורות חדשות, עיתונאים וכו’ ולכן הוא יותר “מבוקר”. במובנים פוסט-מודרניים ניתן גם לטעון שאין אמת מוחלטת אלא אוסף של נרטיבים שמתגבש לנרטיב המרכזי בטוויטר אבל טיעונים מעין אלו מתאימים אולי לבלוג בנושא פילוסופיה.

(עוד קריקטורה מצויינת של xkcd.com)

מה עושים דגי זהב לפני בחירות?

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

בחלון למטה, מוצגים הביטויים הפופולאריים בכל חודש (מוזמנים ללחוץ על החיצים ימינה ושמאלה ולעבור לחודש הבא/הקודם בהתאמה). לתצוגה שכזו קוראים “ענן מילים” (words cloud). שימו לב שביטויים הכוללים מספר מילים מחוברים ע”י קו תחתון, למשל “בתל_אביב” בינואר 2016. כל ביטוי מקבל ציון שמבוסס על שכיחותו בקורפוס הטוויטים של אותו חודש וככל שביטוי שכיח יותר בחודש זה ציונו יהיה גבוה יותר והוא יופיע בפונט גדול יותר. למשל, “המשטרה” יותר שכיחה בינואר 2016 מ-“הפרקליטות” 

previous arrow
next arrow
Slider

מה למשל אפשר ללמוד מענן המילים?

  • דפנה מאיר ז”ל נרצחה בפיגוע בינואר 2016
  • שמו של אלאור אזריה (“החייל היורה”) התפרסם ביולי 2016
  • שמעון פרס ז”ל נפטר בספטמבר 2016
  • חוק ההסדרה עלה לכותרות בנובמבר של אותה שנה

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

  1. הביטויים בענן עומדים כל אחד בפני עצמו בלי קיבוץ סמנטי כזה או אחר והברירות הן הקלה על המשתמש תוך דילול והתמקדות רק בביטויים הכי בולטים או לחילופין עומס של תוכן ויזואלי בכדי לתפוס יותר ביטויים ולהעביר יותר אינפורמציה.
  2. ענני מילים נועדו לתפוס מהות של רגע ולא התפתחות על ציר הזמן ולכן ברצף עננים כגון העננים החודשיים שלנו, ביטויים שחוזרים בין חודשים יופיעו כל פעם במקום אחר והעין האנושית מתקשה לתפוס את החזרתיות הזאת. הסיבה לאי שמירת הסדר היא שחבילת התוכנה בה אני עושה שימוש מנסה לדחוס את כל הביטויים פנימה ע”פ גודלם כך שכולם ייכנסו.
  3. שוב, בגלל שענני מילים בהוויתם מתארים קורפוס קפוא ולא מתפתח, ביטויים חזקים באופן קבוע בקורפוס יאפילו על ביטויים שצפים ועולים לתקופה קצרה ודווקא הם אלו שמתארים את ההתפתחות והשינוי בציר הזמן. לדוגמא, כמו ברוב החודשים גם באפריל 2016 נתניהו מאוד בולט עד כדי כך שהוא מאפיל על פרשת הפרדת היולדות שהתפוצצה באותו חודש.

קצת פרספקטיבה היסטורית לא תזיק

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

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

(מרגלית החזאית נותנת תחזית קבועה בתוכנית “שידורי המהפכה” של אסי וגורי)

איך בפועל נעשה זאת? למשל, כשאנו בוחנים את הביטויים של ינואר 2017,  “נעניש” ביטוי שפופולארי ב-12 החודשים שקדמו לחודש זה (כל שנת 2016) ונפחית מעט מציון הפופולאריות הבסיסי שלו, ולעומת זאת “נחזק” מעט את הציון הבסיסי של ביטוי שבינואר 2017 היה בעל פופולאריות בינונית, אך בכל 2016 כמעט ולא הופיע בטוויטר.

אפשר לראות בענן המילים המעודכן למטה, שבאופן זה של “נרמול” אנו מקבלים ש:

  • נוכחותה של דפנה מאיר ז”ל מתחזקת בינואר 2016
  • מאבק הגז שנעלם מעינינו בענן במקורי מופיע לפתע בפברואר 2016
  • פרשת הפרדת היולדות מתחזקת משמעותית באפריל 2016, וענבל אור יזמית הנדל”ן פתאום נכנסת לתמונה באותו החודש
  • נאום החמוצים מתגלה לעינינו באוקטובר 2017
previous arrow
next arrow
Slider

הקיבוץ המאוחד

מה אם אנחנו רוצים לדעת מה קרה כל חודש לא ברמת הביטויים הבודדים אלא עם איזו רמה של הכללה? למשל אנו שואפים לזהות את התפתחות איום הטרור בציר הזמן. כמובן ניתן לעבור על כל הביטויים הפופולאריים בכל חודש ולנסות לקבץ אותם ידנית ע”פ נושאים, אבל אנחנו מעוניינים במיזעור המאמץ הידני. למשימות מעין אלו קיימים אלגוריתמים שונים לקיבוץ (clustering) שעובדים בגדול באופן הבא – בהינתן אובייקטים שאנו יודעים למדוד דמיון (או שוני) ביניהם ברמת הזוגות, האלגוריתם יזהה ויחזיר לנו מקבצים של אובייקטים כך שהאובייקטים בכל מקבץ דומים יותר אחד לשני מאשר לאובייקטים במקבצים אחרים. במקרה שלנו, אנחנו כבר יודעים למדוד דמיון סמנטי ע”י ייצוג וקטורי של מילים (ראו פוסט קודם) כך שהמקבצים הם מקבצים סמנטיים של ביטויים בעלי משמעות קרובה בקורפוס.

בתצוגה מתחת ניתן לראות תוצאה של חלוקת ביטויים שכיחים בקורפוס החל מינואר 2018 ל-20 מקבצים סמנטיים שזוהו אוטומטית . כל הביטויים באותו המקבץ צבועים באותו הצבע והרדיוס של כל ביטוי מבטא את השכיחות שלו באותו החודש. העברה של העכבר מעל עיגול תציג את שם הביטוי ולחיצה על השם תאתר בגוגל חדשות הקשורות לביטוי זה. לחיצה על כפתור play, תקדם את החודשים ואפשר גם לבחור חודש ספציפי. שוב, כדאי לבחור מקבץ או שניים ע”י לחיצה כפולה על שמם (למשל “חרדים” , “טרור“) ברשימה מתחת לגרף. חשוב לציין שלאחר שהמקבצים נמצאו בצורה אוטומטית אני קבעתי להם שמות אבל יש גם דרכים לתת שמות למקבץ ללא התערבות ידנית. גם פה ניתן לסמן איזור מסויים בגרף בכדי לעשות zoom-in, ולחיצה כפולה על הרקע תבצע zoom-out.

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

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

לסיכום

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


הערות והרחבות

  1. בפוסט זה בחרתי להשתמש בחבילת פייטון בשם Plotly ולא ב -matplotlib שהוא יותר סטנדרטי. הסיבה לכך היא ש-Plotly מאפשר תצוגה גרפית דינאמית בתוך אתרים ע"י ממשק JavaScript. מה שאומר שכל גרף שמוצג פה הוא תוצר של מנוע JS קרוב ל-D3 שמעבד פלט שנוצר קודם לכן ב-backend ע"י קוד פייטון. בקיצור כיף חיים ב-fullstack.
  2. הוצאת מילות מפתח (keywords-extraction) וביטויי מפתח היא בעיה קלאסית בעיבוד ספה טבעית וקיימים לה פתרונות מבוססי סטטיסטיקה, סמנטיקה, תחביר ועוד. בפוסט הזה אני מראה שיטה פשוטה לבעיה יותר מורכבת של הוצאת ביטויי מפתח מתפתחים על ציר הזמן
  3. גרף הבועות שאף השראה מהדוגמא הקלאסית של gapminder  אלא שבמקרה שלי מיקמתי באופן קבוע את המרכז של כל עיגול ע"י טרנספורמציית T-SNE על וקטור האמבדינג שלו וגם הוספתי צבעים דינאמיים וקישור לתוצאות חיפוש עדכניות בגוגל.
  4. ענני מילים מוצגים ע"י החבילה wordcloud שדורשת קצת מסאז' עדין לדאטה בכדי שתדע להציג עברית.
  5. לפני wordcloud מומלץ מאוד להעיף stopwords וכו'. אני חישבתי דינאמית מילים נפוצות בקורפוס ויצרתי רשימה שכזו במקום להסתמך על הגדרות דקדוקיות או תחביריות.
  6. wordcloud יודע גם לזהות סטטיסטית רצפי מילים המהווים ביטוי אטומי (co-locations), לפחות עד גודל 2 (bigram). אני בחרתי לחשב רצפי מילים שכאלו עד גודל 3 בתור צעד מקדים ע"י gensim גם בגלל שיש יותר שליטה על הפרמטרים וגם בגלל שהטקסט המעובד נדרש לעוד משימות מעבר לענני מילים.
  7. נרמול לפי סביבה זמנית יכול להתבצע גם ע"י וריאנט של TFIDF אבל אני בחרתי בשיטה אחרת
  8. מחקר של נושאים שונים בקורפוס יכול להתבצע גם תוך שימוש בtopic-modeling ואני מתכוון לפרסם פוסט בנושא
  9. את הקלאסטרים חישבתי ע"י ++k-means של sklearn, לא בגלל שזה בהכרח האלגוריתם הכי מתאים אלא כי הוא מאוד מוכר והיה מספיק בשביל ההדגמה. בהינתן האלגוריתם הנ"ל פתרון יותר מלא דורש חיפוש של מספר הקלאסטרים למשל ע"י שיטת הברך אבל לצורך ההדגמה בפוסט זה קיצרתי תהליכים וקבעתי שרירותית את מספר המקבצים ל-20
  10. שיטה פשוטה למתן שמות למקבצים היא בחירת הביטוי החזק במקבץ, או לחילופין הביטוי הכי קרוב למרכז המקבץ וכו'