Menu
Coddy logo textTech

Récapitulatif - Compteur de fréquence de mots

Fait partie de la section Logique & Flux du Journey GO de Coddy. Leçon 30 sur 68.

challenge icon

Défi

Facile

Construisez un outil d’analyse de texte qui compte la fréquence des mots dans un document. Ce défi montre comment les maps excellent dans l’agrégation de données en indiquant combien de fois chaque mot unique apparaît dans un texte.

Vous recevrez deux entrées :

  • Une chaîne représentant le texte à analyser (par exemple, "the quick brown fox jumps over the lazy dog the fox is quick")
  • Une chaîne représentant le seuil de fréquence minimal (par exemple, "2")

Important : Le texte d’entrée peut contenir des espaces ; vous devez donc lire la ligne complète à l’aide de bufio.NewReader avec ReadString('\n') ou d’un bufio.Scanner : n’utilisez pas fmt.Scanln pour l’entrée de texte, car cette fonction s’arrête au premier espace.

Votre tâche consiste à :

  1. Créer une fonction appelée countWords qui prend une chaîne de texte et renvoie une map[string]int où :
    • Les clés sont les mots individuels (chaînes)
    • Les valeurs sont le nombre d’occurrences de chaque mot (entiers)
  2. Analyser le texte d’entrée en le divisant en mots individuels à l’aide de strings.Fields (qui divise selon tout espace blanc)
  3. Compter la fréquence de chaque mot dans le texte :
    • Convertir tous les mots en minuscules pour garantir un comptage cohérent
    • Pour chaque mot, incrémenter son compteur dans la map
    • Si un mot n’existe pas encore dans la map, sa valeur commence à 0 et est incrémentée à 1
  4. Filtrer les résultats pour n’afficher que les mots qui apparaissent au moins autant de fois que le seuil
  5. Afficher les résultats au format suivant :
    • En-tête : "Word Frequency Analysis:"
    • Pour chaque mot correspondant au critère : "[word]: [count]"
    • Afficher les mots dans l’ordre alphabétique
  6. Calculer et afficher les statistiques récapitulatives :
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • Lorsque plusieurs mots ont le même nombre maximal d’occurrences, afficher celui qui vient en premier dans l’ordre alphabétique. Lorsque chaque mot apparaît une fois, il s’agit simplement du premier mot de la liste triée.

Par exemple, avec le texte d’entrée "hello hello world" et le seuil "2", la sortie devrait être :

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

Utilisez le paquet bufio pour lire les lignes complètes de l’entrée, le paquet strings pour diviser le texte et le convertir en minuscules, le paquet strconv pour convertir la chaîne du seuil en entier, et le paquet sort pour trier les mots dans l’ordre alphabétique. Ce défi montre comment les maps offrent une solution élégante pour compter et agréger des données, le comportement de valeur nulle des maps rendant la logique de comptage simple et efficace.

Essayez vous-même

package main

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

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

	// Lire la ligne complète de texte (y compris les espaces)
	scanner.Scan()
	text := scanner.Text()

	// Lire la valeur du seuil
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Convertir le seuil en entier
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Écrivez votre code ci-dessous
	// 1. Créez la fonction countWords qui retourne un map[string]int
	//    Astuce : utilisez strings.Fields et strings.ToLower pour diviser et normaliser les mots
	// 2. Use the function to count word frequencies
	// 3. Filtrez les mots qui apparaissent au moins 'threshold' fois
	// 4. Triez les mots filtrés par ordre alphabétique et affichez-les
	// 5. Calculez et affichez les statistiques récapitulatives

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

Toutes les leçons de Logique & Flux

Entraînez-vous par vous-même : Compilateur Go en ligne