Menu
Coddy logo textTech

まとめ - 単語出現頻度カウンター

CoddyのGOジャーニー「論理とフロー」セクションの一部。レッスン 30/68。

challenge icon

チャレンジ

簡単

ドキュメント内の単語の頻度を数えるテキスト分析ツールを構築してください。この課題では、テキスト中に各一意の単語が何回 appear するかを追跡することで、map がデータの集計にいかに優れているかを示します。

次の2つの入力を受け取ります。

  • 分析するテキストを表す文字列(例:"the quick brown fox jumps over the lazy dog the fox is quick"
  • 最小頻度のしきい値を表す文字列(例:"2"

重要: 入力テキストには spaces が含まれる可能性があるため、bufio.NewReaderReadString('\n')、または bufio.Scanner を使用して full line を読み取る必要があります。テキスト入力に fmt.Scanln を使用してはいけません。最初の space で読み取りが停止するためです。

あなたの課題は次のとおりです。

  1. countWords という名前の function を作成します。この function はテキストの文字列を受け取り、map[string]int を返します。
    • キーは個々の単語(文字列)です
    • 値は各単語の頻度のカウント(整数)です
  2. strings.Fields(任意の空白文字で split します)を使用して、入力テキストを個々の単語に split します
  3. テキスト内の各単語の頻度を数えます。
    • 一貫したカウントのため、すべての単語を小文字に Convert します
    • 各単語について、map 内のそのカウントを増やします
    • 単語がまだ map に存在しない場合は、0 から始まり、1 に増加します
  4. results を Filter し、threshold 以上の回数 appear する単語だけを表示します
  5. results を次の形式で display します。
    • Header: "Word Frequency Analysis:"
    • 条件を満たす各単語: "[word]: [count]"
    • 単語は alphabetical order で display します
  6. summary statistics を Calculate して display します。
    • "Total unique words: [total_unique_count]"
    • "Words above threshold: [filtered_count]"
    • "Most frequent word: [word] ([count] times)"
    • 複数の単語が最大のカウントを共有する場合は、alphabetically で最初に来る単語を報告します。すべての単語が1回ずつ appear する場合は、単純に Sort 済みリストの最初の単語になります。

たとえば、入力テキストが "hello hello world" で threshold が "2" の場合、出力は次のようになります。

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

bufio package を使用して入力の full line を読み取り、strings package を使用してテキストを split し小文字に Convert し、strconv package を使用して threshold の文字列を integer に Convert し、sort package を使用して単語を alphabetically に Sort してください。この課題では、map がデータのカウントと集計に対してどのように洗練された解決策を提供するかを示します。また、map の zero-value の動作により、カウントのロジックがシンプルかつ効率的になります。

自分で試してみよう

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, _ := strconv.Atoi(thresholdStr)

	// TODO: 以下にコードを書いてください
	// 1. map[string]int を返す countWords 関数を作成する
	//    Hint: 単語の分割と正規化には strings.Fields と strings.ToLower を使用する
	// 2. Use the function to count word frequencies
	// 3. 'threshold' 回以上出現する単語をフィルタリングする
	// 4. フィルタリングした単語をアルファベット順にソートして表示する
	// 5. 要約統計を計算して表示する

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

論理とフローのすべてのレッスン

自分で練習してみよう: Goオンラインコンパイラ