Menu
Coddy logo textTech

Zusammenfassung – Wortfrequenz-Zähler

Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy — Lektion 30 von 68.

challenge icon

Aufgabe

Einfach

Erstellen Sie ein Textanalyse-Tool, das Worthäufigkeiten in einem Dokument zählt. Diese Herausforderung zeigt, wie hervorragend sich Maps für die Aggregation von Daten eignen, indem sie verfolgen, wie oft jedes eindeutige Wort in einem Text vorkommt.

Sie erhalten zwei Eingaben:

  • Einen String, der den zu analysierenden Text darstellt (z. B. "the quick brown fox jumps over the lazy dog the fox is quick")
  • Einen String, der den Schwellenwert für die Mindesthäufigkeit darstellt (z. B. "2")

Wichtig: Der Eingabetext kann Leerzeichen enthalten, daher müssen Sie die vollständige Zeile mit bufio.NewReader und ReadString('\n') oder einem bufio.Scanner einlesen — verwenden Sie nicht fmt.Scanln für die Texteingabe, da dieses beim ersten Leerzeichen aufhört zu lesen.

Ihre Aufgabe ist es:

  1. Erstellen Sie eine Funktion namens countWords, die einen Text-String entgegennimmt und eine map[string]int zurückgibt, wobei:
    • Die Schlüssel einzelne Wörter (Strings) sind
    • Die Werte die Häufigkeitszählung jedes Wortes (Integer) sind
  2. Verarbeiten Sie den Eingabetext, indem Sie ihn mit strings.Fields (das bei jedem Leerzeichen trennt) in einzelne Wörter aufteilen
  3. Zählen Sie die Häufigkeit jedes Wortes im Text:
    • Konvertieren Sie alle Wörter in Kleinbuchstaben für eine konsistente Zählung
    • Erhöhen Sie für jedes Wort dessen Zähler in der Map
    • Wenn ein Wort noch nicht in der Map existiert, beginnt es bei 0 und wird auf 1 erhöht
  4. Filtern Sie die Ergebnisse, um nur Wörter anzuzeigen, die mindestens so oft vorkommen wie der Schwellenwert
  5. Zeigen Sie die Ergebnisse im folgenden Format an:
    • Header: "Word Frequency Analysis:"
    • Für jedes qualifizierende Wort: "[word]: [count]"
    • Zeigen Sie die Wörter in alphabetischer Reihenfolge an
  6. Berechnen und zeigen Sie Zusammenfassungsstatistiken an:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"

Zum Beispiel sollte bei dem Eingabetext "hello hello world" und dem Schwellenwert "2" die Ausgabe wie folgt aussehen:

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

Verwenden Sie das bufio-Paket, um vollständige Eingabezeilen zu lesen, das strings-Paket, um den Text zu teilen und in Kleinbuchstaben umzuwandeln, das strconv-Paket, um den Schwellenwert-String in einen Integer umzuwandeln, und das sort-Paket, um die Wörter alphabetisch zu sortieren. Diese Herausforderung zeigt, wie Maps eine elegante Lösung zum Zählen und Aggregieren von Daten bieten, wobei das Zero-Value-Verhalten von Maps die Zähllogik einfach und effizient macht.

Probier es selbst

package main

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

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

	// Die vollständige Textzeile lesen (einschließlich Leerzeichen)
	scanner.Scan()
	text := scanner.Text()

	// Den Schwellenwert lesen
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Schwellenwert in eine Ganzzahl umwandeln
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Schreiben Sie Ihren Code unten
	// 1. Erstellen Sie die Funktion countWords, die eine map[string]int zurückgibt
	//    Hinweis: Verwenden Sie strings.Fields und strings.ToLower, um Wörter zu trennen und zu normalisieren
	// 2. Verwenden Sie die Funktion, um die Wortfrequenzen zu zählen
	// 3. Filtern Sie Wörter, die mindestens 'threshold'-mal vorkommen
	// 4. Sortieren Sie die gefilterten Wörter alphabetisch und zeigen Sie diese an
	// 5. Berechnen und zeigen Sie zusammenfassende Statistiken an

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

Alle Lektionen in Logik & Ablauf