הפרוטוקולים של הכנסת ה-19: ניתוח

מאת נביא שקר

האם יש מילה לתחביב שאתה סובל ממנו?

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

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

הפוסט הזה יראה 3 סוגי ניתוחים שונים של הטקסטים האלה: 1) התפלגות פשוטה של שימוש במילים 2) ענני מילים לפי ייחודיות ופופולריות 3) ניתוח צבירי היררכי לח״כים ומפלגות.

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

ניתוח ראשון: התפלגות פשוטה (אני, אנחנו, כאילו)

אפשר לקחת כל מילה ולראות מה תדירות השימוש בה. למשל, אם תדירות השימוש במילה ״אני״ של חבר-הכנסת איקס היא 0.02, פירוש הדבר שחבר הכנסת איקס אומר את המילה ״אני״ פעם ב-50 מילים בערך.

ברור שחברי כנסת אחדים יעשו יותר שימוש במילה, ואחרים פחות. הנה למשל התפלגות המילה ״אני״ עבור כל חברי הכנסת:

התפלגות אני

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

הנה עוד דוגמא, ״אנחנו״:

התפלגות אנחנושוב, מה שהגרף הזה מראה זה הוא שחברי הכנסת רזבוזוב וליפמן משתמשים במילה ׳אנחנו׳ הרבה יותר מהממוצע.

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

הבה ננסה ״כאילו״:

התפלגות כאילו

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

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

ניתוח שני: ענני מילים, פופולריות וייחודיות

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

׳ייחודיות׳ של מילה אצל חבר-כנסת איקס תוגדר בתור היחס בין תדירות השימוש של איקס במילה, לבין ממוצע תדירות השימוש בה באופן כללי בכנסת. אם למשל שאול מופז משתמש במילה ׳אני׳ בתדירות של 1 ל-25 מילים והממוצע הוא 1 ל-50 מילים, המילה ׳אני׳ תקבל ציון 2 אצל מופז.

עכשיו אפשר לייצר ענני מילים לכל חבר-כנסת שיראו את שני המימדים – פופולריות וייחודיות. ציר ה-x מראה את הפופולריות, ציר ה-y מראה את הייחודיות. ככל שמילה היא יותר ימינה, הדובר משתמש בה יותר. ככל שהיא יותר למעלה, המילה הזו יותר ייחודית לאותו דובר. מילה שהיא גם ימינה וגם למעלה היא מאפיינת ביותר.

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

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

אצל מיכל בירן רואים את ה׳כאילו׳ כמתבקש (בשימוש בערך פי 4 מהממוצע, זכרו שזה ציר לוגריתמי).

wordCloudBiranאצל טיבי החתימה נראית גם סבירה(?)

wordCloudTibi

wordCloudRegevwordCloudHorowitz

wordCloudGafni wordCloudBennet

זה נחמד, אבל אם מישהו לא באמת רוצה לקרוא בצחקוק 120 ענני מילים, האם יש דרך להשוות בין כל חברי הכנסת בתמונה אחת?

ניתוח שלישי: צבירים, יחידים וסיעות

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

תיאור הניתוח באופן פשוט: תארו לעצמכם שאפשר להשתמש בכל המילים שאמר חבר הכנסת A כדי למקם אותו בנקודה במרחב (נקרא לזה ׳מרחב השפה׳). אם חבר כנסת אחר B השתמש בהרבה מאותן מילים, הנקודה שמצייגת את B תהיה קרובה יחסית ל-A. למשל, חבר כנסת שאמר רק ״אני אוהב בטטות״ יהיה קרוב לחבר כנסת שאמר רק ״אני אוהב בורקסים״ (הם חולקים 2 מתוך 3 מילים) אבל רחוק מחבר כנסת שאמר רק ״יש לי לימון״ (לא חולק אף מילה עם הקודמים).

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

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

חכים דנדרוגרמה

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

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

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

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

הנה התוצאה:

דנדרוגרמה סיעות

או. זה כבר מעניין:

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

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

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

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

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

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

===

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

===

תיאור טכני יותר של הניתוח האחרון: לקחתי את כל המילים שחברי הכנסת אמרו, N. אני מייצג כל דובר j כווקטור במרחב ה-N-מימדי, כאשר הערך ה-i של הוקטור הוא כמות הפעמים שהדובר j אמר את המילה i. על זה אני מריץ hierarchical clustering (חסר לי המונח בעברית…מצבור היררכי?) עם מתודת Ward ומטריקה אוקלידית. העץ הוא דנדרוגרמה של הצבירים שנוצרים כתוצאה, והמטריצה היא מטריצת מרחקים.

עדכון לגבי מינוח: הקורא ארנון מעיר ומתקן – המונח הנכון בעברית הוא ״אשכול היררכי״. תודה.

עדכון לגבי התיאור הטכני: הקורא שחר מנדל העיר בפייסבוק שעל-פי התיאור הטכני נראה שאין נורמליזציה לכמות המלל, באופן שיכול לגרום למרחקים גדולים בצורה מוזרה בין סיעות ואנשים. אם הבנתי את ההערה בצורה נכונה, הדאגה היא ממצב בו אדם א׳ אמר למשל ״בננה, תפוח, אגס״ (וקטור [1,1,1]), אדם ב׳ אמר ״תפוח״ (וקטור [1,0,0]) ואדם אחר אמר ״תפוח, אגס, בננה, תפוח, אגס, בננה, בננה, תפוח, אגס״ (וקטור [3,3,3]. נראה שאדם א׳ ואדם ג׳ הם קרובים יותר, אך ללא נורמליזציה כלשהי אנחנו דווקא נחשוב שאדם א׳ ו-ב׳ קרובים יותר.

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

מודעות פרסומת