Zusammenfassung – Wortfrequenz-Zähler
Teil des Abschnitts Logik & Ablauf der GO-Journey von Coddy. Lektion 30 von 68.
Aufgabe
EinfachErstelle 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:
- Eine Funktion namens
countWordszu erstellen, die eine Textzeichenkette entgegennimmt und einemap[string]intzurückgibt, wobei:- Die Schlüssel einzelne Wörter (Zeichenketten) sind
- Die Werte die Häufigkeit jedes Wortes (Ganzzahlen) sind
- Den Eingabetext zu verarbeiten, indem du ihn mit
strings.Fieldsin einzelne Wörter aufteilst (diese Funktion teilt bei beliebigen Leerzeichen auf) - 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
- Die Ergebnisse so zu filtern, dass nur Wörter angezeigt werden, die mindestens so oft wie der Schwellenwert vorkommen
- Die Ergebnisse im folgenden Format anzuzeigen:
- Kopfzeile:
"Word Frequency Analysis:" - Für jedes passende Wort:
"[word]: [count]" - Die Wörter alphabetisch sortiert anzeigen
- Kopfzeile:
- 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
1Fortgeschrittener Kontrollfluss
Switch mit `fallthrough`Abbrechen von verschachtelten SchleifenFortsetzen einer bestimmten SchleifeDie `goto`-AnweisungZusammenfassung – Fortgeschrittene Schleifensteuerung4Projekt: Einfache Aufgabenliste
Projekt-SetupEine Aufgabe hinzufügen2Structs und Methoden
Methoden für Structs definierenValue ReceiverPointer ReceiverReceiver auswählenMethoden vs. FunktionenZusammenfassung – Struct-Verhalten5Maps im Detail
Maps von StructsPointer als Map-WertePrüfen auf Nil-MapsMaps vergleichenZusammenfassung – Wortfrequenz-Zähler8Projekt: Einfache Bestandsverwaltung
ProjektübersichtLagerbestand prüfen11Abschlussherausforderungen
Einfache KontaktlisteEinfacher Zahlen-ValidatorSammler für eindeutige Elemente3Interfaces (Die Grundlagen)
Was ist ein Interface?Ein Interface definierenEin Interface implementierenInterface-Typen verwendenLeeres InterfaceType AssertionsType SwitchZusammenfassung – Formen und VerhaltenÜbe selbstständig: Online-Go-Compiler