Hspell -
בודק איות עברי חופשי
 
ivrix.org.il/projects/spell-checker

 

נדב הראל
דן קניגסברג

מיזם Hspell

הצורך:

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

הפתרון:

  • מיזם Hspell הותחל בינואר 2000, אבל נזנח עד אוקטובר 2002.
  • גרסה 0.1 יצאה בדצמבר 2002, גרסה 0.7 יצאה בדצמבר 2003.

עקרונות הפיתוח:

  • פיתוח "חדר נקי": אין העתקת רשימות מילים.
  • שאיפות מעשיות בשלב ראשון: בדיקת איות לכתיב חסר-ניקוד.
  • אפשרות לשימושים מתקדמים יותר בעתיד הקרוב והרחוק.
    מנתח צורני קיים מגרסה 0.7.

מבנה ההרצאה

  • הדגמת יכולות Hspell ושימושים בו
  • עקרונות הפעולה של Hspell
  • מהו כתיב לא-מנוקד נכון
  • תוכן רשימת המילים, ואופן ובנייתה
  • טעימה מאלגוריתמים: הטיית שמות עצם

הדגמת יכולות Hspell ושימושים בו

מציאת שגיאות כתיב ותיקוניהן המומלצים (מנשק טקסטואלי)

57 גרדנר  ->
32 פונקצית  ->  פונקציית, פונקציות
25 קדקד  ->  קדקוד
    לפי כללי הכתיב חסר הניקוד ("כתיב מלא") של האקדמיה ללשון העברית, תנועת "o"
    שמקורה בחולם תיכתב בוי"ו. אולם זה לא המצב במקרה של קמץ קטן או חטף-קמץ - אז
    תיכתב וי"ו רק אם במילה הבסיסית היה חולם.
    לפיכך במילים שנכתבות בקמץ קטן או בחטף-קמץ בכל צורות המילה, אין להוסיף וי"ו.
    לדוגמה: "תכנית", "קרבן", "חכמה", "אנייה", "נכרי", וכן "קדקוד".
    יש לציין שלמרות שכלל זה נתקבל ע"י האקדמיה, הוא אינו מקובל על מקצת הבלשנים,
    שמעדיפים היו לסמן וי"ו בכל מקום בו נהגית תנועה "o", כולל הקמץ הקטן וחטף הקמץ.
10 מימדית  ->  ממדית
7 כרצונינו  ->  כרצוננו
3 הפונציה  ->
3 בוקטור  ->  בווקטור
2 המדידיות  ->  המדידות
2 השיוויון  ->  השוויון

הדגמת יכולות Hspell ושימושים בו (המשך)

מנשקי תכנות (APIs): C, ispell.

שולב ע"י מפתחים אחרים עם:

  • מעבדי תמלילים: OpenOffice, Abiword, LyX, Mellel
  • שולחנות עבודה: KDE
  • עורכי טקסט: Emacs, Vim, Geresh
  • מערכות הפעלה: Linux (Redhat, Debian, ...), FreeBSD, Mac OS X

לדוגמה, גרסה עברית של OpenOffice באה עם Hspell:

הדגמת יכולות Hspell ושימושים בו (המשך)

שילוב Hspell במקינטוש (מעבד תמלילים Mellel):

הדגמת יכולות Hspell ושימושים בו (המשך)

מנתח צורני (מורפולוגי):

כלבים הרכבת משטרה
כלבים:
  כלב(ע,ז,רבים)
הרכבת:
  הרכיב (פ,נ,2,יחיד,עבר)
  הרכיב (פ,ז,2,יחיד,עבר)
  הרכבה (ע,נ,יחיד,סמיכות)
ה+רכבת:
  רכבת (ע,נ,יחיד)
ה+רכבת: (ה"א השאלה)
  רכב (פ,נ,2,יחיד,עבר)
  רכב (פ,ז,2,יחיד,עבר)
  רכבת (ע,נ,יחיד,סמיכות)
משטרה:
  משטרה (ע,נ,יחיד)
  משטר (ע,ז,יחיד,של/היא)
מ+שטרה:
  שטר (ע,ז,יחיד,של/היא)

מבנה הפתרון

הגישה שלנו - סינטטית (יוצרת): יצירת רשימות מילים:

איסוף: איסוף מילות בסיס
שלב קומפילציה:
(perl)
הטיה חצי-אוטומטית של מילים אלו (לא כולל תחיליות)

בדיקת איות:
(C)
בדיקת כל מילה ברשימת המילים החוקיות.

מאפשר הוספת אותיות השימוש מש"ה וכל"ב בהתאם לסוג המילה.


יתרונות/חסרונות יחסית לגזירה-לאחור:

יתרונות:

אפשרות שילוב בבודקי איות מבוססי-רשימות קיימים

הפרדה לשלבים פשוטים יותר ובלתי תלויים

קוד יותר פשוט וקריא

חסרונות:

צריכת זיכרון (ללא affix compression)

תקן האיות

  • Hspell מטפל כרגע במלל ללא ניקוד.
  • אך מהו "כתיב מלא" נכון?

  • נבחר תקן: הכתיב חסר הניקוד של האקדמיה ללשון העברית. (1949-1993)
  • התקן במלואו מופיע כנספח ברוב המילונים.

מספר דוגמאות:

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

רשימת המילים ובנייתה

מה יש ברשימת המילים?

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

רשימת המילים ובנייתה (המשך)

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

רשימת המילים ובנייתה (המשך)

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

רשימת המילים ובנייתה (המשך)

גרסה 0.7 כללה נטיות של:
8,042שמות עצם
1,783תארים
5,113פעלים
וכן
1,880מילים נוספות
ובסך הכול:
406,629נטיות ומילים


רשימת מילים זו על הדיסק מקום זניח: 130,038 bytes.
(כולל רשימת מילים ומידע על תחיליות חוקיות לכל מילה, ללא מנתח צורני מלא).

הטיית שמות עצם

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

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

הטיית שמות עצם (המשך)

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

הטיית שמות עצם (המשך)

  • צורות ריבוי נוספות:
    משנה ע,יות קצבה ע,אות גרב ע,יים עשן ע,יחיד בת ע,רבים=בנות
  • ישנם שמות-עצם עם כמה צורות ריבוי חוקיות:
    חודש ע,ים,יים
    שעה ע,ות,יים
    קבר ע,ות,ים
    איש ע,ים,רבים=אנשים
    שפה ע,ות,יים,רבים=שפתות

הטיית שמות עצם (המשך)

  • התכנית wolig מנסה לנחש את הריבוי הנכון בעזרת סיומת צורת היחיד:
    יחידרבים
    מלך מלכים
    מלכה מלכות
    כותרת כותרות
    כמות כמויות
    אחריות -אין-
  • בזכות ברירות מחדל אלו, כ- 90% משמות העצם אינם דורשים רמזי-נטייה כלל.

הטיית שמות עצם (המשך)

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

הטיית שמות עצם (המשך)

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

הטיית שמות עצם (המשך)

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

הטיית שמות עצם (המשך)

  • רמזים נוספים לנטיות:
    מגורים, מגורי-, מגוריי, ... מגור ע,אין_יחיד
    אחור, אחוריים, אחורי-, אחוריי, ... אחור ע,אין_נטיות_יחיד,יים
    סתיו, סתווי, סתווים, ... סתו ע,נפרד=סתיו,נסמך=סתיו
    גברת, גברות, גבירותיי, ... גברת ע,רבים=גברות,נסמכים=גבירות
  • טיפול אוטומטי בכללי הכתיב חסר הניקוד, תוך שימוש פנימי באותיות עזר:
    קריה ע קרyה קריה קרyת- קריית-
    עירייה ע עיריyה עירייה עיריyות עיריות
    קו ע קw קו קwים קווים
    שוwק ע,אבד_ו שוwק שוק שwקים שווקיםשוwקיכםשוקיכם