まとめ - 単語出現頻度カウンター
CoddyのGOジャーニー「論理とフロー」セクションの一部 — レッスン 30/68。
チャレンジ
簡単ドキュメント内の単語の出現頻度をカウントするテキスト分析ツールを構築してください。このチャレンジでは、テキスト内の各ユニークな単語が何回出現するかを追跡することで、マップがデータの集計にいかに優れているかを示します。
2つの入力を受け取ります:
- 分析対象のテキストを表す文字列(例:
"the quick brown fox jumps over the lazy dog the fox is quick") - 最小頻度のしきい値を表す文字列(例:
"2")
重要: 入力テキストにはスペースが含まれる可能性があるため、ReadString('\n') を使用した bufio.NewReader または bufio.Scanner を使用して行全体を読み取る必要があります。テキスト入力に fmt.Scanln を使用してはいけません。最初のスペースで読み取りが停止してしまうためです。
あなたのタスクは以下の通りです:
- テキストの文字列を受け取り、
map[string]intを返すcountWordsという関数を作成します。ここで:- キーは個々の単語(文字列)です
- 値は各単語の出現頻度(整数)です
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, _ := strconv.Atoi(thresholdStr)
// TODO: 以下にコードを記述してください
// 1. map[string]int を返す countWords 関数を作成する
// ヒント: 単語の分割と正規化には strings.Fields と strings.ToLower を使用してください
// 2. 関数を使用して単語の出現頻度をカウントする
// 3. 少なくとも「threshold」回出現する単語をフィルタリングする
// 4. フィルタリングされた単語をアルファベット順にソートして表示する
// 5. 要約統計を計算して表示する
_ = text
_ = threshold
fmt.Println("Word Frequency Analysis:")
}