Menu
Coddy logo textTech

Итоги: счетчик частоты слов

Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 30 из 68.

challenge icon

Задание

Легко

Создайте инструмент анализа текста, который подсчитывает частоту слов в документе. Это задание демонстрирует, как карты эффективно агрегируют данные, отслеживая, сколько раз каждое уникальное слово appear в тексте.

Вы получите два входных значения:

  • строку, представляющую текст для анализа (например, "the quick brown fox jumps over the lazy dog the fox is quick")
  • строку, представляющую минимальный порог частоты (например, "2")

Важно: Входной текст может содержать пробелы, поэтому необходимо прочитать всю строку с помощью bufio.NewReader и ReadString('\n') или bufio.Scanner: не используйте fmt.Scanln для ввода текста, поскольку он прекращает чтение при первом пробеле.

Ваша задача:

  1. Создать function с именем countWords, которая принимает строку текста и возвращает map[string]int, где:
    • ключами являются отдельные слова (строки);
    • значениями является количество появлений каждого слова (целые числа).
  2. Разобрать входной текст, разделив его на отдельные слова с помощью strings.Fields (эта функция разделяет текст по любым пробельным символам).
  3. Подсчитать частоту каждого слова в тексте:
    • преобразовать все слова в нижний регистр для единообразного подсчёта;
    • для каждого слова увеличить его количество в карте;
    • если слова ещё нет в карте, его начальное значение будет равно 0, после чего оно увеличится до 1.
  4. Отфильтровать results, чтобы показывать только слова, которые appear не менее указанного порога.
  5. Вывести результаты в следующем формате:
    • заголовок: "Word Frequency Analysis:"
    • для каждого подходящего слова: "[word]: [count]"
    • выводить слова в alphabetical порядке.
  6. Рассчитать и вывести сводную статистику:
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • Если несколько слов имеют одинаковое наибольшее количество появлений, вывести то, которое идёт первым в alphabetical порядке. Если каждое слово появляется один раз, это просто первое слово в отсортированном списке.

Например, для входного текста "hello hello world" и порога "2" результатом должен быть:

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

Используйте пакет bufio для чтения полных строк ввода, пакет strings для разделения текста и преобразования его в нижний регистр, пакет strconv для преобразования строки с порогом в целое число и пакет sort для сортировки слов в alphabetical порядке. Это задание демонстрирует, как карты предоставляют элегантное решение для подсчёта и агрегирования данных, а поведение карт с нулевыми значениями делает логику подсчёта простой и эффективной.

Попробуйте сами

package main

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

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

	// Прочитать полную строку текста (включая пробелы)
	scanner.Scan()
	text := scanner.Text()

	// Прочитать значение порога
	scanner.Scan()
	thresholdStr := scanner.Text()

	// Преобразовать threshold в целое число
	threshold, _ := strconv.Atoi(thresholdStr)

	// TODO: Напишите ваш код ниже
	// 1. Создайте функцию countWords, которая возвращает map[string]int
	//    Подсказка: используйте strings.Fields и strings.ToLower для разделения и нормализации слов
	// 2. Use the function to count word frequencies
	// 3. Отфильтруйте слова, которые появляются как минимум 'threshold' раз
	// 4. Отсортируйте отфильтрованные слова по алфавиту и отобразите их
	// 5. Вычислите и отобразите сводную статистику

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

Все уроки раздела Логика и управление потоком

Потренируйтесь самостоятельно: Онлайн-компилятор Go