Podsumowanie — licznik częstości słów
Część sekcji Logika i przepływ sterowania ścieżki GO w Coddy. Lekcja 30 z 68.
Wyzwanie
ŁatwyZbuduj narzędzie do analizy tekstu, które zlicza częstotliwość występowania słów w dokumencie. To wyzwanie pokazuje, jak dobrze mapy sprawdzają się w agregowaniu danych, śledząc, ile razy każde unikalne słowo pojawia się w tekście.
Otrzymasz dwa wejścia:
- Ciąg znaków reprezentujący tekst do analizy (np.
"the quick brown fox jumps over the lazy dog the fox is quick") - Ciąg znaków reprezentujący minimalny próg częstotliwości (np.
"2")
Ważne: Tekst wejściowy może zawierać spacje, więc musisz odczytać cały wiersz za pomocą bufio.NewReader z ReadString('\n') lub bufio.Scanner: nie używaj fmt.Scanln do odczytu tekstu, ponieważ przestaje on czytać przy pierwszej spacji.
Twoje zadanie:
- Utwórz funkcję o nazwie
countWords, która przyjmuje ciąg znaków z tekstem i zwracamap[string]int, gdzie:- Kluczami są poszczególne słowa (ciągi znaków)
- Wartościami są liczby wystąpień każdego słowa (liczby całkowite)
- Przetwórz tekst wejściowy, dzieląc go na poszczególne słowa za pomocą
strings.Fields(które dzieli tekst przy dowolnych białych znakach) - Zlicz częstotliwość występowania każdego słowa w tekście:
- Zamień wszystkie słowa na małe litery, aby zliczanie było spójne
- Dla każdego słowa zwiększ jego licznik w mapie
- Jeśli słowa nie ma jeszcze w mapie, jego wartość początkowa wyniesie 0 i zostanie zwiększona do 1
- Odfiltruj wyniki, aby wyświetlić tylko słowa występujące co najmniej tyle razy, ile wynosi próg
- Wyświetl wyniki w następującym formacie:
- Nagłówek:
"Word Frequency Analysis:" - Dla każdego słowa spełniającego warunek:
"[word]: [count]" - Wyświetl słowa w kolejności alfabetycznej
- Nagłówek:
- Oblicz i wyświetl statystyki podsumowujące:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"- Jeśli kilka słów ma tę samą najwyższą liczbę wystąpień, podaj to, które jest pierwsze w kolejności alfabetycznej. Jeśli każde słowo występuje raz, będzie to po prostu pierwsze słowo z posortowanej listy.
Na przykład dla tekstu wejściowego "hello hello world" i progu "2" wynik powinien wyglądać tak:
Word Frequency Analysis: hello: 2 Total unique words: 2 Words above threshold: 1 Most frequent word: hello (2 times)
Użyj pakietu bufio, aby odczytywać całe wiersze wejściowe, pakietu strings, aby podzielić tekst i zamienić go na małe litery, pakietu strconv, aby przekonwertować ciąg znaków z progiem na liczbę całkowitą, oraz pakietu sort, aby posortować słowa alfabetycznie. To wyzwanie pokazuje, jak mapy zapewniają eleganckie rozwiązanie do zliczania i agregowania danych, a zachowanie wartości zerowej map upraszcza i usprawnia logikę zliczania.
Spróbuj swoich sił
package main
import (
"bufio"
"fmt"
"os"
"strconv"
)
func main() {
scanner := bufio.NewScanner(os.Stdin)
// Wczytaj całą linię tekstu (wraz ze spacjami)
scanner.Scan()
text := scanner.Text()
// Wczytaj wartość progu
scanner.Scan()
thresholdStr := scanner.Text()
// Przekonwertuj threshold na liczbę całkowitą
threshold, _ := strconv.Atoi(thresholdStr)
// TODO: Napisz swój kod poniżej
// 1. Utwórz funkcję countWords, która zwraca map[string]int
// Wskazówka: użyj strings.Fields i strings.ToLower do dzielenia tekstu na słowa i ujednolicania ich zapisu
// 2. Użyj funkcji do policzenia częstości występowania słów
// 3. Odfiltruj słowa, które występują co najmniej 'threshold' razy
// 4. Posortuj odfiltrowane słowa alfabetycznie i je wyświetl
// 5. Oblicz i wyświetl statystyki podsumowujące
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}Wszystkie lekcje w sekcji Logika i przepływ sterowania
1Zaawansowane sterowanie przepływem
Instrukcja switch z `fallthrough`Przerywanie zagnieżdżonych pętliKontynuowanie określonej pętliInstrukcja `goto`Podsumowanie — zaawansowane sterowanie pętlami4Projekt: Prosta lista zadań
Konfiguracja projektuDodawanie zadania2Struktury i metody
Definiowanie metod dla strukturOdbiorniki przez wartośćOdbiorniki przez wskaźnikWybór odbiornikówMetody a funkcjePodsumowanie — działanie struktur5Mapy w szczegółach
Mapy strukturWskaźniki jako wartości mapSprawdzanie, czy mapy są nilPorównywanie mapPodsumowanie — licznik częstości słów3Interfejsy (podstawy)
Czym jest interfejs?Definiowanie interfejsuImplementowanie interfejsuUżywanie typów interfejsowychPusty interfejsAsercje typuPrzełącznik typówPodsumowanie – kształty i zachowaniaPoćwicz samodzielnie: Kompilator Go online