C++ Academy · レッスン

単語頻度カウンター

std::mapを使って、テキストファイル内の各単語の出現回数を数えます。

レッスン 4/414 ステップ

「単語頻度カウンター」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

プロジェクトの目標

テキストファイルを読み取り、各単語とその出現回数を、重複なしで出力します。これは std::map または std::unordered_map で簡潔に解決できる典型的な問題です。

必要なヘッダー

ファイル入出力、文字列、連想コンテナーに使用します。

#include <fstream>
#include <map>
#include <string>
#include <iostream>

単語を1つずつ読み取る

>> 抽出演算子は、空白で区切られたトークンを読み取ります。生の単語を扱うのに最適です。

std::ifstream file("book.txt");
std::map<std::string, int> counts;
std::string word;
while (file >> word) {
    counts[word]++;
}

単語を正規化する

各単語を小文字に変換し、「Hello」と「hello」を同じものとして数えます。

#include <algorithm>
std::transform(word.begin(), word.end(), word.begin(),
    [](unsigned char c) { return std::tolower(c); });

句読点を取り除く

各単語の先頭と末尾から句読点を取り除きます。

while (!word.empty() && !std::isalpha(word.front())) word.erase(0,1);
while (!word.empty() && !std::isalpha(word.back())) word.pop_back();

出現回数を出力する

map を反復処理し、各キーと値の組を出力します。std::map はキーの昇順で反復処理されます。

for (const auto& [w, n] : counts) {
    std::cout << w << ": " << n << "\n";
}

頻度順に並べ替える

アルファベット順ではなく頻度順に出力するには、エントリを vector にコピーしてソートします。

std::vector<std::pair<std::string, int>> entries(counts.begin(), counts.end());
std::sort(entries.begin(), entries.end(),
    [](auto& a, auto& b) { return a.second > b.second; });

最頻出上位 N 件

ソート済みの vector から、上位10件(または任意の N 件)だけを出力します。

for (size_t i = 0; i < 10 && i < entries.size(); ++i) {
    std::cout << entries[i].first << ": " << entries[i].second << "\n";
}

map と unordered_map

大きなファイルでは、std::unordered_map の方が平均的に高速です(検索は O(1))。ただし、反復順序は任意です。ソート済みの出力には std::map を使用します。

ストップワード

ストップワードの集合を使って、「the」、「and」、「of」のような、よく使われる短い単語を除外します。

static const std::set<std::string> stop = {"the","and","of","to","a"};
if (stop.count(word)) continue;

行または文字を数える

同じパターンの応用として、std::getline で総行数を、std::ifstream と std::istreambuf_iterator で総文字数を数えられます。

パフォーマンスに関する考慮事項

非常に大きなファイルでは、string_view をキーにした unordered_map を使い、ファイルを mmap し、単語ごとのヒープ割り当てを避けます。

クイックチェック

自動的にアルファベット順で反復処理されるコンテナーはどれですか。

まとめ

単語の頻度カウンターでは、ストリーム、文字列、連想コンテナー、アルゴリズムを組み合わせます。ソート済みの出力には map、速度を重視する場合は unordered_map を選択してください。結果を整えるため、正規化、句読点の除去、ストップワードの利用も検討します。

無料で開始

AI チューターと学ぶ C++ — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「単語頻度カウンター」レッスンは無料ですか?

はい。「単語頻度カウンター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「単語頻度カウンター」で何を学びますか?

std::mapを使って、テキストファイル内の各単語の出現回数を数えます。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「単語頻度カウンター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. シンプルな電卓CLIの構築
  2. CSVファイルの読み書き
  3. 数当てゲーム
  4. 単語頻度カウンター
← C++ Academyに戻る