איך לבדוק אם 'קיים חלק ממחרוזת (ברצף) בתוך מסמך. בC#
-
אני מנסה לעשות חיפוש בתוך מסמכי טקסט (זה פשוט) עם קבלת תוצאה גם על חלק מהמחרוזת. אבל דוקא ברצף.
כלומר אם אני מחפש "ויאמר אלי העבד אולי"
אני רוצה לקבל תוצאות גם עבור "ויאמר אלי" וגם עבור "אלי העבד" וכו'.
לכאורה הדרך לבנות הרבה מיני מחרוזות לחיפוש. השאלה האם שי דרך יותר יעילה לעשות זאת.
contains זה לא אופציה כי אני צריך תוצאות של מילים ברצף.
מקווה שהייתי מספיק ברור. -
לא, לא היית ברור, וגם אני חושב שאתה לא יודע מה אתה רוצה.
אם למשל היית רוצה גם תוצאות של כל מילה בנפרד, אז היית מתנסח מאוד פשוט, וגם לא היית אומר שזה "כל מיני מחרוזות" כי זה סה"כ פיצול של ביטוי החיפוש למילים ואיחוד התוצאות של כל אחד מהם.הארה: הכותרת סותרת לתוכן כי בכותרת כתוב ברצף, והיא גם ארוכה ומסרובלת.
הכותרת צריכה להיות משהו כמו: "C# איתור חלקי מחרוזת" לא נורא שזה לא מבטא הכל העיקר שיש את מילות המפתח של הנושא. -
אוקיי בוא ננסה לשאול את השאלה שוב:
ו@dovid אתה צודק שאני לא בטוח במאה אחוז מה אני מנסה לעשות. ייתכן שהשאלה שלי היא בעצם איך ליצור מנוע חיפוש יותר יעיל. בוא נראה.המטרה הסופית שלי היא ליצור תוכנה שתוכל ליצור דפי מקורות עבור טקסט מסויים מתוך מאגר של טקסטים בדומה למה שיש בספריא.
הרעיון שלי היה בעצם לערוך חיפוש של טקסטים שמכילים את הטקסט שהמשתמש הזין אבל לקבל גם תוצאות חלקיות.
כרגיל כשרוצים לקבל גם תוצאות חלקיות מה שעושים זה ליצור מערך של נקודות כלומר אם המסמך מכיל X כמות של מילים מתוך המחרוזת שקיבלת אז הוא מסומן כהתאמה.
אבל מה שקורה שאז מקבלים גם תוצאות שבכלל לא רלונטיות ובפרט אם אתה המחפש בתוך מחרוזת ארוכה שעלולה להכיל את המילים שהזנת בתפזורת גדולה.
אז מה שעושים זה ליצור סדר תוצאות לפי כל מיני שיטות ניקוד.אני חשבתי אולי לסנן חלק מהתוצאות שאינן רלוונטיות על ידי הרעיון הנ"ל של חיפוש זוגות של מילים במקום מילים בודדות.
-
@dovid כתב באיך לבדוק אם 'קיים חלק ממחרוזת (ברצף) בתוך מסמך. בC#:
@pcinfogmach כן, אתה צריך לבנות אינדקס כמו שתיארתי לך בעבר.
ואז זה לא בעיה כי כל התאמת מילה מעלה את הציון של התוצאה, ואתה מציג את התוצאות הטובות ביותר.סליחה, לא הבנתי.
ברור שכל התאמת מילה מעלה את התוצאה אבל חשבתי שזה עובד על בסיס חיפוש מילים בודדות. כלומר פיצול מחרוזת החיפוש למילים בודדות.
אבל כמו שציינתי אם אני מחפש ככה אז אקבל גם דברים שלא קשורים בכלל.
לדוגמא אם אחפש "כי ביצחק יקרא לך זרע"
אקבל גם משפט שמכיל את כל המילים הנ"ל אפילו אם יש הפרש גדול בים המילים - בעצם תוצאה לא רלוונטית. איך אני מסנן תוצאות ממין זה? -
כיון שכל התאמת מילה מעלה את הציון, והתאמה של שני מילים מעלה אותו ביותר מכפול וכולי, אז התוצאות שיופיעו הם הרלוונטיות (אתה משמיט מה שמתחת לציון X).
פעם פעם כתבתי לך איך צריך לעשות אינדקס,
היה לך בעיה עם הSQLITE ובסוף לא התקדמת עם זה.
זה הדרך הנכונה לעשות כזה דבר. -
אתה מחפש למשל "ויאמר אלי העבד אולי"
אתה בונה רשימה של מיקומים שנמצאו של המילה הראשונה, ככה:
מסמך, מיקום, מילה
כעת אתה מחפש את המילה השניה, ומוסיך לרשימת המיקומים.
וכן הלאה.
בסוף אתה מקבץ את הרשימה לפי מסמך, וממיין את תת הרשימה לפי מיקום.
אתה עובר על הרשימה, וכל פעם בודק מרחק מהמילה הקודמת.
למשל:
בראשית 950 ויאמר
בראשית 1100 אלי
בראשית 1200 ויאמר
בראשית 1300 העבד
בראשית 1320 ויאמר
בראשית 1321 אלי
בראשית 1322 העבד
בראשית 1323 אליאתה עובר בלולאה על המופעים, לכל אחד מהמופעים תצמיד שני מאפיינים: ציון מספרי שיהיה 25 (למשל, כמאה לחלק למספר מילות החיפוש), ומאפיין סט שיכיל את המילים הנוספות שיכולות להיחשב כסט עם התוצאה הנוכחית.
בכל אחד, נניח בראשון, אתה בודק את המרחק בינו לזה שלאחריו, אם הוא קטן ממרחק עליו החלטת כמקסימלי למשל 20, והמילה הבאה אחריו לא מופיעה כבר בסט, אתה מוסיף לציון שלו את ציון האות שאחריו, ומוסיף את האות לסט שלו.
כעת אתה עובר למילה הבאה, ובודק אותו דבר עד שאתה חורג מהמרחק 20, שאז אתה מתחיל את התהליך שוב עם התוצאה מס' 2.
בסוף אתה יכול לחלק ציון גבוה יותר בכל תוצאה שבה צמדי מילים בסט הם בסדר המקורי של מילות השאילתה ולא להיפך, ועוד ציון לכאלה שהצמד בא רצוף.
בסופו של תהליך אתה משמיט מי שהציון שלו נמוך מ75 או 50.