none
חיפוש בטקסט מנוקד RRS feed

  • שאלה

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

    תודה

    אריה


    אריה שטרן
    יום שני 07 נובמבר 2011 15:05

תשובות

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

    ניתן לראות את המצגת המקורית בקישור הבא:
    2Practical Hebrew search – Open2011 presentation

    דוגמה חיה של השימוש בחיפוש מלא בעברית ניתן לראות בקישור הבא: http://hebmorph.code972.com/

    כמה מילים:

    - פרוייקט Hspell הוא פרוייקט קוד פתוח ששם לו כמטרה לפתח מחלקה המאפשרת לבצע בדיקות איות בעברית. פרוייקט זה שימוש כמקור למילון לפרוייקט HebMorph

    - Apache Lucene הוא פרוייקט קוד פתוח של full-featured text search engine library המשמש כמנוע חיפוש יעיל ומהווה את הבסיס למנוע החיפוש של פרוייקט HebMorph

    - HebMorph הוא פרוייקט פתוח של חיפוש full text search בעברית.


    signature
    יום שלישי 08 נובמבר 2011 07:49
    מנחה דיון

כל התגובות

  • ניקוד הוא בסך הכל תווים נוספים בשרשרת :-)

    למעשה אם תתייחס לשרשרת התווים כפי שהיא באמת שזה מערך של תווים הרי שהדבר יקל על המחשבה לדעתי (מפתחים יסבירו פשטות ששרשרת היא מופע של מחלקת STRING שהיא אוסף של תווים CHAR).

    -- דוגמה פשוטה של שימוש בניקוד ניתן לראות
    כאן כאשר מוסיפים תוו של ניקוד לאות א --
    SELECT CHAR(224)+ CHAR(193)

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

    * ב C SHARP יש מתודה מובנית של STRING בשם Normalize שניתן לעבוד איתה ישירות לניקוי הניקוד. אתה יכול להישתמש ב CLR פשוט ולכתוב פונקציה עם שורה אחת שתבצע את הפעולה של ניקוי הניקוד.

    ** הקישור הבא יכול קצת לעזור בהבנה של הנושא (התייחסות לשרשרת כמערך של תווים)
    http://ariely.info/dnn/Blog/tabid/83/EntryId/60/Null-character.aspx

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

    select xx where ClearNik(xx) like 'שלום'

    ** אם אתה מחפש פתרון הרבה מורכב והרבה יותר טוב לחיפוש בעברית הכולל Full Text Search אני אוכל להעביר לך. זה יאפשר לך גם חיפוש של מילים דומות ולא רק מילים מדוייקות למשל (באנגלית זה מובנה בשרת אבל בעברית יש בעיות במה שמובנה בשרת).


    signature
    • נערך על-ידי pituachMVP, Moderator יום שני 07 נובמבר 2011 21:22 - הוספתי דוגמה קטנה להודעה
    יום שני 07 נובמבר 2011 20:42
    מנחה דיון
  • זו בעייה של Collation.
    הייתי מנסה לשנות את ה-Collation ל-Accent Insesitive (כלומר- יש AI בשם שלו).
    אני לא מתכוון לשינוי הגדרות המערכת, אלא להוסיף את האופרטור Collate לאחר הטקסט המנוקד. 

    כתבתי פעם פוסט לגבי זה: http://gerireshef.wordpress.com/2010/05/09/%d7%9e%d7%a9%d7%9e%d7%a2%d7%95%d7%aa-%d7%94%d7%a9%d7%99%d7%9e%d7%95%d7%a9-%d7%91-collation-%d7%95%d7%91%d7%97%d7%99%d7%a8%d7%94-%d7%91%d7%90%d7%95%d7%a4%d7%a6%d7%99%d7%94-%d7%94%d7%9e%d7%aa%d7%90/ 


    Geri Reshef http://gerireshef.wordpress.com
    יום שני 07 נובמבר 2011 20:44
  • לא חייבים לעבוד עם Collation מסויים גרי
    אני אוסיף כמה מילים ודוגמה להודעה שלי מעל (בסך הכל צריך לנקות תווים של ניקוד וזה מאוד פשוט וניתן להיות בכל Collation עקרונית שנתמך..)

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

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

    ** תוספת: אני לא יודע בדיוק מה המספרים של תווי הניקוד אבל הם סביב 193. ניתן לבדוק אם צריך בעזרת פונקציית אסקי של SQL או בגוגל.


    signature

    יום שני 07 נובמבר 2011 21:22
    מנחה דיון
  • ניקוי כל הניקוד בשורת קוד אחת עם ביטוי רגולרי ב C# (ניתן להעתיק לכל CLR אם רוצים): http://ariely.info/QQ_Download/CleanStringWithC.txt

    הקובץ שמור בפורמט יוניקוד. פשוט להעתיק ישירות ל VS וזה עובד.


    signature
    יום שני 07 נובמבר 2011 22:20
    מנחה דיון
  • תודה לכולם

    אשמח לקבל את הפתרון המורכב הכולל חיפוש בעברית עם Full Text Search

    אריה


    אריה שטרן
    יום שלישי 08 נובמבר 2011 06:35
  • ההסבר המקוצר כאן מבוסס על הרצאה שהועברה בקבוצת הדוט-נט של מייקרוסופט ועל מעט המשחקים שלי והנסיון המועט שלי בשלב זה הכולל שילוב חיפוש בעברית בהתבסס על הקוד הפתוח במערכת שלי.

    ניתן לראות את המצגת המקורית בקישור הבא:
    2Practical Hebrew search – Open2011 presentation

    דוגמה חיה של השימוש בחיפוש מלא בעברית ניתן לראות בקישור הבא: http://hebmorph.code972.com/

    כמה מילים:

    - פרוייקט Hspell הוא פרוייקט קוד פתוח ששם לו כמטרה לפתח מחלקה המאפשרת לבצע בדיקות איות בעברית. פרוייקט זה שימוש כמקור למילון לפרוייקט HebMorph

    - Apache Lucene הוא פרוייקט קוד פתוח של full-featured text search engine library המשמש כמנוע חיפוש יעיל ומהווה את הבסיס למנוע החיפוש של פרוייקט HebMorph

    - HebMorph הוא פרוייקט פתוח של חיפוש full text search בעברית.


    signature
    יום שלישי 08 נובמבר 2011 07:49
    מנחה דיון
  • ושוב תודה לכולם.

    אתגרתם את החבר שלי.


    אריה שטרן
    • סומן כתשובה על-ידי אריה שטרן יום שלישי 08 נובמבר 2011 13:07
    • סימון כתשובה בוטל על-ידי אריה שטרן יום שלישי 08 נובמבר 2011 15:34
    יום שלישי 08 נובמבר 2011 13:07
  • תודה על התודה :-)
    • סומן כתשובה על-ידי אריה שטרן יום שלישי 08 נובמבר 2011 15:34
    • סימון כתשובה בוטל על-ידי אריה שטרן יום שלישי 08 נובמבר 2011 15:34
    • נערך על-ידי pituachMVP, Moderator יום שלישי 08 נובמבר 2011 21:33
    יום שלישי 08 נובמבר 2011 13:53
    מנחה דיון