Повторение — счётчик частоты слов
Часть раздела Логика и управление потоком путешествия по GO на Coddy. Урок 30 из 68.
Задание
ЛегкоСоздайте инструмент для анализа текста, который подсчитывает частоту слов в документе. Это задание показывает, как словари эффективно агрегируют данные, отслеживая, сколько раз каждое уникальное слово встречается в тексте.
Вам будут переданы два входных значения:
- Строка с текстом для анализа (например,
"the quick brown fox jumps over the lazy dog the fox is quick") - Строка с минимальным порогом частоты (например,
"2")
Важно: входной текст может содержать пробелы, поэтому необходимо читать всю строку с помощью bufio.NewReader и ReadString('\n') или bufio.Scanner: не используйте fmt.Scanln для ввода текста, поскольку он прекращает чтение на первом пробеле.
Ваша задача:
- Создать функцию
countWords, которая принимает строку текста и возвращаетmap[string]int, где:- Ключи — отдельные слова (строки)
- Значения — количество вхождений каждого слова (целые числа)
- Разобрать входной текст, разделив его на отдельные слова с помощью
strings.Fields(эта функция разделяет текст по любым пробельным символам) - Подсчитать частоту каждого слова в тексте:
- Перевести все слова в нижний регистр для единообразного подсчёта
- Для каждого слова увеличить его счётчик в словаре
- Если слова ещё нет в словаре, его значение будет равно 0, после чего счётчик увеличится до 1
- Отфильтровать результаты, оставив только слова, которые встречаются не реже, чем указано в пороговом значении
- Вывести результаты в следующем формате:
- Заголовок:
"Word Frequency Analysis:" - Для каждого подходящего слова:
"[word]: [count]" - Вывести слова в алфавитном порядке
- Заголовок:
- Вычислить и вывести сводную статистику:
"Total unique words: [total_unique_count]""Words above threshold: [filtered_count]""Most frequent word: [word] ([count] times)"- Если несколько слов имеют наибольшую частоту, вывести то, которое стоит первым в алфавитном порядке. Если каждое слово встречается один раз, это будет просто первое слово в отсортированном списке.
Например, если входной текст — "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 для сортировки слов в алфавитном порядке. Это задание показывает, как словари позволяют элегантно решать задачи подсчёта и агрегирования данных, а поведение нулевых значений в словарях делает логику подсчёта простой и эффективной.
Попробуйте сами
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. Используйте функцию для подсчёта частоты слов
// 3. Отберите слова, которые встречаются не менее 'threshold' раз
// 4. Отсортируйте отобранные слова по алфавиту и выведите их
// 5. Вычислите и выведите сводную статистику
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}Все уроки раздела Логика и управление потоком
1Продвинутое управление потоком
Оператор switch с `fallthrough`Выход из вложенных цикловПереход к следующей итерации конкретного циклаОператор `goto`Повторение: расширенное управление циклами4Проект: простой список задач
Настройка проектаДобавление задачи2Структуры и методы
Определение методов для структурПолучатели-значенияПолучатели-указателиВыбор получателейМетоды и функцииПовторение: поведение структур5Карты: подробный разбор
Карты структурУказатели как значения картПроверка карт на nilСравнение картПовторение — счётчик частоты слов8Проект: простой складской учёт
Обзор проектаПроверка запасов3Интерфейсы (основы)
Что такое интерфейс?Определение интерфейсаРеализация интерфейсаИспользование типов интерфейсовПустой интерфейсУтверждения типовПереключатель типовПовторение — формы и поведениеПотренируйтесь самостоятельно: Онлайн-компилятор Go