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

Erstelle ein Textanalysetool, das die Worthäufigkeiten in einem Dokument zählt. Diese Herausforderung zeigt, wie gut Maps darin sind, Daten zu aggregieren, indem sie verfolgen, wie oft jedes einzelne Wort in einem Text vorkommt.

Du erhältst zwei Eingaben:

  • Eine Zeichenkette, die den zu analysierenden Text darstellt (z. B. "the quick brown fox jumps over the lazy dog the fox is quick")
  • Eine Zeichenkette, die den Mindesthäufigkeitsschwellenwert darstellt (z. B. "2")

Wichtig: Der Eingabetext kann Leerzeichen enthalten. Daher musst du die vollständige Zeile mit bufio.NewReader und ReadString('\n') oder einem bufio.Scanner einlesen: Verwende für die Texteingabe nicht fmt.Scanln, da es das Lesen beim ersten Leerzeichen beendet.

Deine Aufgabe besteht darin:

  1. Eine Funktion namens countWords zu erstellen, die eine Textzeichenkette entgegennimmt und eine map[string]int zurückgibt, wobei:
    • Die Schlüssel einzelne Wörter (Zeichenketten) sind
    • Die Werte die Häufigkeit jedes Wortes (Ganzzahlen) sind
  2. Den Eingabetext zu verarbeiten, indem du ihn mit strings.Fields in einzelne Wörter aufteilst (diese Funktion teilt bei beliebigen Leerzeichen auf)
  3. Die Häufigkeit jedes Wortes im Text zu zählen:
    • Alle Wörter zur einheitlichen Zählung in Kleinbuchstaben umwandeln
    • Für jedes Wort seinen Zähler in der Map erhöhen
    • Wenn ein Wort noch nicht in der Map vorhanden ist, beginnt es bei 0 und wird auf 1 erhöht
  4. Die Ergebnisse so zu filtern, dass nur Wörter angezeigt werden, die mindestens so oft wie der Schwellenwert vorkommen
  5. Die Ergebnisse im folgenden Format anzuzeigen:
    • Kopfzeile: "Word Frequency Analysis:"
    • Für jedes passende Wort: "[word]: [count]"
    • Die Wörter alphabetisch sortiert anzeigen
  6. Zusammenfassende Statistiken zu berechnen und anzuzeigen:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • Wenn mehrere Wörter dieselbe höchste Häufigkeit haben, gib dasjenige aus, das alphabetisch zuerst kommt. Wenn jedes Wort einmal vorkommt, ist das einfach das erste Wort der sortierten Liste.

Wenn beispielsweise der Eingabetext "hello hello world" und der Schwellenwert "2" lautet, sollte die Ausgabe wie folgt aussehen:

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

Verwende das Paket bufio, um vollständige Eingabezeilen zu lesen, das Paket strings, um den Text aufzuteilen und in Kleinbuchstaben umzuwandeln, das Paket strconv, um die Schwellenwertzeichenkette in eine Ganzzahl umzuwandeln, und das Paket sort, 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 Verhalten des Nullwerts 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)

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

	// Lies den threshold-Wert
	scanner.Scan()
	thresholdStr := scanner.Text()

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

	// TODO: Schreibe deinen Code darunter
	// 1. Erstelle die countWords-Funktion, die eine map[string]int zurückgibt
	//    Hinweis: verwende strings.Fields und strings.ToLower, um Wörter zu trennen und zu normalisieren
	// 2. Use the function to count word frequencies
	// 3. Filtere Wörter, die mindestens 'threshold' Mal vorkommen
	// 4. Sortiere die gefilterten Wörter alphabetisch und zeige sie an
	// 5. Berechne und zeige Zusammenfassungsstatistiken an

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

Alle Lektionen in Logik & Ablauf

Übe selbstständig: Online-Go-Compiler