Menu
Coddy logo textTech

סיכום - מונה תדירות מילים

חלק מהיחידה לוגיקה וזרימת התוכנית במסלול ה-GO של Coddy. שיעור 30 מתוך 68.

challenge icon

אתגר

קל

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

תקבלו שתי קלטים:

  • מחרוזת שמייצגת את הטקסט לניתוח (למשל, "the quick brown fox jumps over the lazy dog the fox is quick")
  • מחרוזת שמייצגת את סף השכיחות המינימלי (למשל, "2")

חשוב: טקסט הקלט עשוי להכיל רווחים, לכן עליכם לקרוא את השורה המלאה באמצעות bufio.NewReader עם ReadString('\n') או באמצעות bufio.Scanner: אל תשתמשו ב-fmt.Scanln עבור קלט הטקסט, מכיוון שהוא מפסיק לקרוא ברווח הראשון.

המשימה שלכם היא:

  1. ליצור פונקציה בשם countWords שמקבלת מחרוזת טקסט ומחזירה map[string]int שבו:
    • המפתחות הם מילים בודדות (מחרוזות)
    • הערכים הם מספר ההופעות של כל מילה (מספרים שלמים)
  2. לנתח את טקסט הקלט על ידי פיצולו למילים בודדות באמצעות strings.Fields (שמפצלת לפי כל תו רווח לבן)
  3. לספור את השכיחות של כל מילה בטקסט:
    • להמיר את כל המילים לאותיות קטנות כדי לספור אותן באופן עקבי
    • עבור כל מילה, להגדיל את המונה שלה במפה
    • אם מילה עדיין לא קיימת במפה, הערך שלה יתחיל ב-0 ויוגדל ל-1
  4. לסנן את התוצאות כך שיוצגו רק מילים שמופיעות לפחות במספר הפעמים שנקבע בסף
  5. להציג את התוצאות בפורמט הבא:
    • כותרת: "Word Frequency Analysis:"
    • עבור כל מילה שעומדת בתנאי: "[word]: [count]"
    • להציג את המילים בסדר אלפביתי
  6. לחשב ולהציג נתונים סטטיסטיים מסכמים:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • כאשר לכמה מילים יש את המספר הגבוה ביותר, יש לדווח על המילה שמופיעה ראשונה בסדר האלפביתי. אם כל מילה מופיעה פעם אחת, זו פשוט המילה הראשונה ברשימה הממוינת.

לדוגמה, עבור טקסט הקלט "hello hello world" והסף "2", הפלט צריך להיות:

Word Frequency Analysis:
hello: 2
Total unique words: 2
Words above threshold: 1
Most frequent word: hello (2 times)

השתמשו בחבילת bufio כדי לקרוא שורות קלט מלאות, בחבילת strings כדי לפצל את הטקסט ולהמירו לאותיות קטנות, בחבילת strconv כדי להמיר את מחרוזת הסף למספר שלם, ובחבילת sort כדי למיין את המילים בסדר אלפביתי. האתגר הזה מדגים כיצד מפות מספקות פתרון אלגנטי לספירה ולצבירת נתונים, וכיצד התנהגות ערך ברירת המחדל של מפות הופכת את לוגיקת הספירה לפשוטה ויעילה.

נסו בעצמכם

package main

import (
	"bufio"
	"fmt"
	"os"
	"strconv"
)

func main() {
	scanner := bufio.NewScanner(os.Stdin)

	// קראו את שורת הטקסט המלאה (כולל רווחים)
	scanner.Scan()
	text := scanner.Text()

	// קראו את ערך הסף
	scanner.Scan()
	thresholdStr := scanner.Text()

	// המירו את threshold למספר שלם
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: כתבו את הקוד שלכם למטה
	// 1. צרו את הפונקציה countWords שמחזירה map[string]int
	//    רמז: השתמשו ב-strings.Fields וב-strings.ToLower כדי לפצל מילים ולנרמל אותן
	// 2. השתמשו בפונקציה כדי לספור את שכיחות המילים
	// 3. סננו מילים שמופיעות לפחות 'threshold' פעמים
	// 4. מיינו את המילים שסוננו לפי סדר אלפביתי והציגו אותן
	// 5. חשבו והציגו נתונים סטטיסטיים מסכמים

	_ = text
	_ = threshold
	fmt.Println("Word Frequency Analysis:")
}

כל השיעורים ביחידה לוגיקה וזרימת התוכנית

תרגלו בעצמכם: קומפיילר Go אונליין