קריאת מסמך עברי ב-OCR מחזירה ערך, ציון ביטחון ומלבן מקור. מה הציון לא מודד בעברית, איפה גרשיים ואותיות סופיות שוברים התאמה, ואיך בונים נתיב חריגים.
עיקרי הדברים
- יוניקוד שומר טקסט בסדר לוגי, וההיפוך הוא עניין של תצוגה בלבד. מחרוזת שנשמרה לפי מה שצויר על המסך ולא לפי מה שנקרא היא מחרוזת שבורה שתיראה תקינה בכל צילום מסך ולא תימצא בשום חיפוש.
- סימנים ניטרליים וחלשים - נקודה, פסיק, נקודתיים, סימני מטבע וספרות - מקבלים את מיקומם מהסביבה שלהם. שקל שמופיע בצד הלא נכון של מספר אינו טעות קריאה אלא תוצאה של אלגוריתם הדו-כיווניות.
- הגרשיים ב-מע"מ, ח"פ, ת"ז ו-בע"מ הם התו שהכי נוטה להיקרא לא נכון: פעם כמרכאה כפולה, פעם כשני גרשים ופעם כטילדה. הצורה בע~מ מופיעה בנתוני אמת ישראליים.
- בעברית אין אותיות רישיות, ולכן הרמז שעליו נשענים באנגלית לזיהוי שם פרטי, ראשי תיבות או כותרת פשוט אינו קיים. גבולות ישות נקבעים אחרת לגמרי.
- לכל שדה נשמרים ארבעה פריטים: הערך, הציון, מספר העמוד והמלבן. בלי הרביעייה הזו מסך האישור הוא ניחוש ולא בדיקה.
מנוע שקרא מסמך בעברית מחזיר שלושה דברים ולא אחד: את הטקסט, ציון ביטחון לכל שדה, ואת אזור המקור שממנו נקרא הערך. בלי הציון אין ניתוב, בלי אזור המקור אין מה להציג לאדם שבודק, ובלי נתיב חריגים הכול נשפך פנימה בביטחון גבוה ובסדר תווים שגוי.
למה טקסט בעברית נשמר נכון ומוצג הפוך
התקן של יוניקוד קובע ייצוג בזיכרון שנקרא סדר לוגי, ומסמך UAX #9 מנסח זאת במפורש: התווים עדיין מתפרשים בסדר הלוגי, ורק התצוגה מושפעת. כלומר האות הראשונה של מילה עברית היא הראשונה במחרוזת, גם כשהיא מצוירת בקצה הימני של השורה.
ההשלכה המעשית היא שקיימות שתי מחרוזות שונות לאותו מסמך, והבחירה ביניהן היא ההבדל בין תקינות לבאג:
- סדר לוגי - מה שהכותב הקליד. זה מה שנשמר בבסיס הנתונים, זה מה שמשווים מולו, וזה מה שמנוע חיפוש מוצא.
- סדר תצוגה - מה שהמסך צייר אחרי הרצת אלגוריתם הדו-כיווניות. כלי חילוץ שמייצא את מה שראה במקום את מה שנקרא מחזיר שם עברי שאותיותיו הפוכות.
הכשל הזה שקוף לבודק אנושי, מפני שדפדפן שמקבל מחרוזת הפוכה מריץ עליה שוב את האלגוריתם ועשוי להציג אותה נכון. רק השוואה ברמת קוד התו תופסת אותו, לא צילום מסך.
UAX #9 גם מסביר למה הפיסוק נוחת בצד הלא נכון. הטבלה שם מסווגת את האלפבית העברי כטיפוס R, ספרות אירופיות כטיפוס חלש EN, סימני מטבע כ-ET שהוא מסיים מספר אירופי, ונקודה, פסיק, נקודתיים ורווח קשיח כ-CS שהוא מפריד מספרים משותף. לטיפוסים החלשים והניטרליים אין כיוון משלהם, והם יורשים אותו מהשכנים. לכן מחיר בשקלים בתוך משפט עברי הוא בדיוק המקום שבו סימן המטבע או הנקודה העשרונית מוצגים היכן שלא ציפיתם, וסימוני הכיוון האפסיים U+200F ו-U+200E הם כלי לתיקון תצוגה - לעולם לא לתיקון הערך השמור.
מה ציון הביטחון לא מודד במסמך עברי?
הוא מודד עד כמה המנוע בטוח שקרא נכון את התווים, ולא עד כמה הערך שנקרא הגיוני או ראוי לאמון. Amazon Textract מחזיר שדה Confidence באחוזים לכל בלוק שזוהה, ומוסיף בתיעוד שזיהוי בביטחון נמוך עשוי לדרוש אישור ויזואלי של אדם. זה תיאור של איכות קריאה, וזה הכול.
בעברית הפער בין נקרא נכון לבין נכון גדול במיוחד:
- זוגות אותיות דומות. ד מול ר, ה מול ח, ב מול כ, ג מול נ, ו מול ן. בגופן דחוס או בסריקה עקומה ההבדל הוא כמה פיקסלים, והמנוע יחזיר ביטחון גבוה על הקריאה השגויה מפני שהצורה שזוהתה אכן הייתה ברורה.
- אותיות סופיות. ך ם ן ף ץ מול כ מ נ פ צ. חילוף ביניהן מייצר מילה סבירה שאינה קיימת, ושובר כל השוואה מדויקת מול רשומה שכבר אצלכם.
- כתיב מלא וחסר. דוד או דויד, תכנה או תוכנה. אלה אינם שגיאת קריאה אלא שני איותים תקינים, ושום סף ביטחון לא ייגע בהם.
- שדה ריק. שורת מספר עוסק ריקה אינה מחזירה ביטחון נמוך. היא לא מחזירה שדה כלל, וזהו מצב שלישי שדורש טיפול נפרד מזה של ערך חלש.
טבלת שדות: מה נכשל דווקא בעברית ולאן זה מנותב
הספים נקבעים מול המסמכים שאתם מקבלים; רק השיטה עוברת ממקום למקום.
| שדה | מה נשבר דווקא בעברית | מה הציון לא יתפוס | מה נשמר כמקור | ניתוב בכישלון |
|---|---|---|---|---|
| שם עוסק | גרשיים ב-בע"מ, כתיב מלא וחסר | שני איותים תקינים לאותו גוף | מלבן ועמוד | התאמה מול מזהה מספרי, לא מול השם |
| מספר ח"פ או ע.מ | ספרות לטיניות בתוך שורה ימין-לשמאל | היפוך תצוגה שנשמר כערך | מלבן ומחרוזת גולמית | דחייה: תשע ספרות או כלום |
| סכום ומטבע | סימן השקל הוא טיפוס ET וזז | נקודה עשרונית שנקראה כפסיק | מלבן והטקסט המלא של השורה | תור אישור, תמיד |
| תאריך | 6/9/26 הוא יום-חודש-שנה בישראל | תאריך תקין בפירוש הפוך | מלבן ומחרוזת גולמית | תור, כשהיום קטן או שווה 12 |
| כתובת | שם רחוב עברי ומספר בית לטיני | מספר בית שנדבק למילה השכנה | מלבן ועמוד | תור לוגיסטיקה |
| תיאור שורה | טקסט חופשי מעורב עברית ואנגלית | קטע שנחתך בגבול כיוון | מלבן ועמוד | ללא ניתוב: תיאור אינו מפתח |
| מספר מסמך | תווית עברית וערך לטיני באותה שורה | תווית שנספחה אל הערך | מלבן ועמוד | בדיקת ייחודיות ואז תור |
שורת התאריך היא הזולה לתיקון והיקרה להתעלמות. 6/9/26 תקין בשני פירושים, ולכן אין ציון ביטחון שיסמן אותו. רק כלל עסקי, שלפיו רכיב היום קטן או שווה 12 ולכן הפירוש דו-משמעי, מוציא אותו מהזרימה האוטומטית.
גרשיים, קיצורים ואותיות סופיות: איפה הטוקניזציה נשברת
מע"מ, ח"פ, ת"ז ו-בע"מ הם קיצורים שמכילים גרשיים, והגרשיים הם התו שהכי נוטה להשתנות בין המסמך לבין השדה. המנוע עשוי להחזיר מרכאה כפולה רגילה, שני תווי גרש עוקבים, את תו הגרשיים היוניקודי עצמו, או טילדה. הצורה בע~מ מופיעה בפועל בקבצי נתונים ישראליים, ומי שמשווה מחרוזות בלי נרמול פשוט לא ימצא את החברה.
מסמך UAX #29, שמגדיר כיצד מחלקים טקסט למילים, מראה שגבול מילה אינו רווח ותו לא. בעברית זה מתבטא בשלוש דרכים שיש לטפל בהן לפני כל השוואה:
- נרמול גרשיים. כל הווריאנטים מקובצים לצורה אחת לפני שמירה, והמקורית נשמרת בנפרד כראיה.
- אותיות שימוש מוצמדות. ו, ה, ב, ל, מ, כ ו-ש נדבקות למילה הבאה. בחשבונית וחשבונית הן אותה מילה לחיפוש, ואינן אותה מילה להשוואה מדויקת.
- מקף בין עברית ללטינית. ל-OCR הוא הכתיב הנכון, וההפרש בינו לצורה המחוברת הופך התאמה מדויקת לכישלון שקט.
קשור: עברית ו-RTL בתוכנה עסקית, הזמנות PDF במייל עם תור אישור, בדיקות איכות ל-PDF בעברית.
איך נראה נתיב חריגים שאפשר באמת לאשר בו?
מסך שמציג ערך חשוד בלי המסמך שממנו נלקח מבקש מהאדם לנחש. תגובת Document AI של Google מצמידה לכל פסקה, טוקן ובלוק אובייקט layout ובו confidence, מלבן boundingPoly עם vertices ו-normalizedVertices, ושדה orientation כמו PAGE_UP. ברמת העמוד מוחזר detectedLanguages ובו languageCode ו-confidence, ומעבד ה-OCR הארגוני מחזיר גם imageQualityScores עם qualityScore בטווח 0 עד 1 ורשימת detectedDefects עם ערכים כמו quality/defect_glare או quality/defect_text_cutoff.
מכאן נגזר מסך חריגים שאפשר לעבוד בו:
- הצגת המקור ממוקדת. העמוד נפתח על המלבן שממנו נקרא השדה החשוד, ולא בראש המסמך.
- סימון רק של מה שנפל. שדות שעברו אינם צריכים למשוך תשומת לב או להיות פתוחים לעריכה.
- המחרוזת הגולמית לצד המנורמלת. בעברית זה ההבדל בין בע~מ לבין בע"מ, והבודק חייב לראות את שתיהן.
- הפרדה בין פגם תמונה לציון נמוך. סנוור על עמוד שלם הוא בעיית סריקה, והתיקון הוא לבקש קובץ חדש ולא לשלוח אדם לפענח.
- שני מקשים בלבד. אשר כפי שנקרא, או תקן ואשר. מקש דילוג מייצר טיוטות שנשארות בתור לנצח.
מה נשמר לכל שדה כדי שאפשר יהיה לחזור למקור
רשומת ביקורת שאינה נמחקת ואינה מתעדכנת, רק נוספות לה שורות. לכל שדה:
- הקובץ המקורי כפי שהתקבל, ללא דחיסה ובלי שגרסה מעובדת החליפה אותו.
- מספר העמוד והמלבן המנורמל, כדי שההצגה תעבוד בכל רזולוציה.
- הערך הגולמי בסדר לוגי, לפני נרמול גרשיים ולפני חיתוך רווחים.
- הציון, ולצידו שם המנוע והגרסה שהחזירו אותו. ספים שכוילו על מנוע אחד אינם תקפים לאחר.
- הערך שאושר, גם כשהוא זהה לערך שנקרא, ומי אישר ומתי.
הזוג ערך שנקרא מול ערך שאושר הוא הנתון היחיד שמאפשר לכייל. אחרי כמה מאות מסמכים אפשר לשאול שאלה מדויקת: באילו שדות עבריים האדם משנה בפועל, ובאיזה טווח ציונים הוא עושה זאת. שדה שכמעט לא נוגעים בו הוא שדה שהסף שלו גבוה מדי ומעכב עבודה תקינה. שדה שמשנים בו ערכים גם מעל הסף הוא שדה שחסרה לו בדיקה עסקית, ולא סף גבוה יותר.
מקורות
שאלות נפוצות
האם כדאי לתקן היפוך עברית בעזרת היפוך המחרוזת בקוד?
לא. היפוך ידני מייצר מחרוזת שנראית נכון במקום אחד ושבורה בכל מקום אחר, כולל בחיפוש ובייצוא. הפתרון הוא לשמור תמיד בסדר לוגי ולסמן כיוון ברמת התצוגה בלבד. אם הכלי שלכם מייצא סדר תצוגה, החליפו אותו או הריצו זיהוי היפוך על הפלט שלו.
איך בודקים שהערך שנשמר אינו הפוך?
משווים ברמת קוד התו ולא בעין. בדיקה מעשית: קחו שדה עברי ידוע מהמסמך, הקלידו אותו ידנית, והשוו בייטים מול מה שנשמר. צילום מסך אינו ראיה, מפני שממשק שמקבל מחרוזת הפוכה עלול להציג אותה נכון אחרי הרצת אלגוריתם הדו-כיווניות.
מה עושים כשהמסמך הוא צילום מהטלפון של הלקוח?
מטפלים בו באותו מסלול בדיוק, אך מצפים לציונים נמוכים יותר ולשיעור גבוה יותר של פריטים בתור. אם המנוע מחזיר מדד איכות תמונה ורשימת פגמים, כדאי לחסום מראש עמוד עם פגם חמור ולבקש קובץ מחדש, במקום לשלוח אדם לפענח סריקה גרועה.
האם ציון ביטחון גבוה מאפשר לוותר על שמירת המלבן?
לא, מפני שהמלבן אינו קיים בשביל השדות שנכשלו. הוא קיים בשביל אלה שיתגלו כשגויים בעוד חודשיים. כשלקוח טוען שהסכום שגוי, היכולת לפתוח את העמוד המקורי על האזור המדויק היא ההבדל בין בירור של דקה לבין ויכוח שאין בו הכרעה.
להמשך קריאה
שירות רלוונטי
אוטומציה לעסקים
אני בונה אוטומציות מותאמות שמורידות עבודה חוזרת מקצה לקצה.
על הכותב
יהונתן סעדיה
מפתח פרילנסר לאוטומציה, אתרים ו-MVP
אני יהונתן סעדיה, מפתח בכיר שבונה אוטומציה עסקית, אתרים מותאמים ומוצרי MVP לעסקים קטנים ובינוניים בארה"ב, אירופה וישראל. המדריכים האלה נכתבים מתוך עבודה אמיתית עם לקוחות, לא מתיאוריה.
בוא נעבוד יחדיש לך פרויקט דומה?
ספר לי מה אתה רוצה לבנות או איזה תהליך להפוך לאוטומטי. אני חוזר תוך 24 שעות עסקים עם כמה שאלות ממוקדות, ואז עוברים על זה יחד בשיחת היכרות חינמית של 30 דקות, בלי התחייבות. בסוף יש לך היקף עבודה, לוח זמנים ומחיר קבוע - או תשובה כנה שלא שווה לבנות את זה.
