אלף מילים

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

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

תוצאות? מיד אחרי הסקריפט שמחשב את הנתונים...

1. איך למשוך את כל מבחני הבגרות הישנים בשפת Python

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

index_url = 'https://meyda.education.gov.il/bagmgr/Ajax.ashx?search=1&sheelon=&miktzoa=16&safa=1&pagesize=20&page=1'

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

2. איך למצוא כמה מילים שונות יש בכל שאלון

כל שאלון הוא קובץ PDF. ב Python הספריה textract יודעת להוציא את הטקסט מהמון קבצים שונים ובין השאר מ PDF-ים. השימוש בספריה הוא בסך הכל:

text = textract.process(filename).decode('utf8')

אחרי שיש לנו את הקטסט אנחנו יכולים לשבור אותו למילים עם ביטוי רגולארי:

words = [w.lower() for w in re.findall(r'\b[a-zA-Z_]+\b', text)]

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

3. הסקריפט המלא והתוצאות

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

import requests, textract, re

index_url = 'https://meyda.education.gov.il/bagmgr/Ajax.ashx?search=1&sheelon=&miktzoa=16&safa=1&pagesize=20&page=1'

r = requests.get(index_url)
urls = [q["question"] for q in r.json()]
total_words = set()

s = requests.Session()
for url in urls:
    m = re.search(r'([^/]+\.pdf)', url)
    if m is None: continue
    r = s.get(url)

    filename = m[0]
    with open(filename, 'wb') as f:
        f.write(r.content)

    text = textract.process(filename).decode('utf8')
    words = [w.lower() for w in re.findall(r'\b[a-zA-Z_]+\b', text)]
    print(f"Test {filename} has {len(words)} different words")
    total_words.update(words)

print(f"All tests had a total of {len(total_words)} different words")

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

Test 16381.pdf has 721 different words
Test 16382.pdf has 674 different words
Test 16384.pdf has 760 different words
Test 16471.pdf has 855 different words
Test 16481.pdf has 885 different words
Test 16484.pdf has 622 different words
Test 16582.pdf has 812 different words
Test 16584.pdf has 759 different words
Test 16381.pdf has 755 different words
Test 16382.pdf has 632 different words
Test 16384.pdf has 691 different words
Test 16471.pdf has 961 different words
Test 16481.pdf has 900 different words
Test 16484.pdf has 710 different words
Test 16582.pdf has 840 different words
Test 16584.pdf has 810 different words
Test 16381.pdf has 772 different words
Test 16382.pdf has 661 different words
Test 16384.pdf has 660 different words
Test 16471.pdf has 933 different words
All tests had a total of 1232 different words

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