# פרויקט מסכם — מסווג Naive Bayes📖 שיעור

## הגדרת הפרויקט

זהו הפרויקט המסכם של שלוש היחידות הראשונות של הקורס — OOP, SOLID, ו-Exceptions/IO/JSON/LINQ יחד: בונים מסווג טקסט פשוט (Naive Bayes) שקורא הודעות מתויגות מקובץ CSV ("ספאם"/"תקין"), לומד מהן תדירויות מילים לפי קטגוריה, ומסווג הודעה חדשה על סמך מה שלמד. זו הפעם הראשונה בקורס שבה כל הכלים שנלמדו — File I/O, LINQ, מחלקות, SOLID — צריכים להתחבר לפרויקט אחד שלם ואמיתי, בלי הדרכה שלב-אחר-שלב.

הרעיון של האלגוריתם: Naive Bayes מסווג הודעה חדשה לפי תדירויות המילים שראה בכל קטגוריה בזמן האימון — הנחת ה"תמימות" (Naive) היא שכל מילה בהודעה בלתי-תלויה בשאר, הנחה לא מדויקת לחלוטין אך שעובדת טוב בפועל במסנני ספאם אמיתיים.

## מה צריך להיות מוכן בסוף

**דרישות:**
1. קובץ CSV עם לפחות 20 הודעות מתויגות (`text,label`, spam/ham), עם מגוון מילים חוזרות בכל קטגוריה
2. פונקציה שקוראת את ה-CSV לרשימת רשומות (טיפול נכון בשורת הכותרת)
3. חישוב תדירויות מילים לכל קטגוריה מנתוני האימון, באמצעות LINQ (`GroupBy`, `SelectMany`, `ToDictionary`)
4. מחלקת `NaiveBayesClassifier` עם הפרדה ברורה לפי SRP — למשל מתודות נפרדות ל-`Train` (למידה) ול-`Classify` (חיזוי), ולא הכל בגוש אחד
5. סיווג 3 הודעות חדשות (לא מנתוני האימון) והדפסת התוצאה (`spam`/`ham`) לכל אחת

**קריטריוני הצלחה:**

• הודעה עם מילים אופייניות ל-spam (כמו "חינם", "זכית") מסווגת כ-`spam`; הודעה רגילה מסווגת כ-`ham`

• מילה חדשה שלא הופיעה באימון כלל לא גורמת לציון כולו להתאפס (יש לחשוב על ברירת מחדל סבירה לתדירות לא-מוכרת)

• שינוי סדר השורות בקובץ ה-CSV לא משנה את תוצאת הסיווג הסופית

• קריאת ה-CSV, ספירת התדירויות והסיווג עצמו נמצאים בשלושה מקומות נפרדים וברורים בקוד — לא מעורבבים במתודה אחת

## דוקומנטציה רשמית מותרת

[Wikipedia — Naive Bayes classifier](https://en.wikipedia.org/wiki/Naive_Bayes_classifier)

[Microsoft Learn — SelectMany](https://learn.microsoft.com/dotnet/api/system.linq.enumerable.selectmany)

[Microsoft Learn — File.ReadAllLines](https://learn.microsoft.com/dotnet/api/system.io.file.readalllines)
