Сделать статистику слов в тексте

Есть текст. Нужно посчитать сколько было использовано слов. Пример:
Слово "The" использовалось 2 раза
Слово "promise" использовалось 3 раза
Слово "to" использовалось 4 раза
и т.д.
На данный момент моя программа считает только количество слов в тексте.

#include <iostream>
#include <string>
#include <fstream>
#include <stdio.h>
#include <windows.h>
#define STRLEN 255

using namespace std;

int main(char ArrWord) {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    string path = "file.txt";
    ifstream Myfile;
    Myfile.open(path);
    if (!Myfile.is_open())
    {
        cout << "Файл не открыт" << endl;
        return 0;
    }
    else
    {
        cout << "Файл успешно открыт" << endl;
    }
    char str[STRLEN];
    char * p;
    int count_all, count_word;
    count_all = count_word = 0;

    while (!Myfile.eof())
    {
        Myfile >> str;
        for (p = strtok(str, " "); p != NULL; p = strtok(NULL, " ")) {
            ++count_all;
        }
    }
    printf("Всего слов: %d\n", count_all);
    system("pause");
    return 0;
}

Ответы (1 шт):

Автор решения: 2DAY

Привожу свою реализацию данной задачи. При желании ее достаточно просто модифицировать в соответствии со своими потребностями. Для решения я использовал контейнер map. Данные считываются из текстового файла(как в Вашей программе). В качестве результата, программа выводит слово и то количество раз, которое оно встречалось в тексте, а также общее число слов.

Ниже привожу реализацию на C++, который снабжен моими комментариями:

#include <iostream>
#include <fstream>
#include <map>
#include <string>
using namespace std;


//Проверяем, является ли символ знаком пунктуации 
bool check(char s){
    return (
        s == '.' or
        s == ',' or
        s == ':' or
        s == ';' or
        s == '?' or
        s == '!' or
        s == '"' or
        s == ')' or
        s == '('
        );
}

//Вывод содержимого словаря на экран
void show(map <string, int> m, int count_all){
    map <string, int> :: iterator it = m.begin();
    for (int i = 0; it != m.end(); it++, i++) {  // выводим их
        cout << i << ". Word: " << it->first << " - used " << it->second << endl;
    }
    //cout << "========================"<< endl; 
    cout << "Total word in this text: " << count_all << endl;
}
int main() {
ifstream file("input.txt"); //считали файл, можно указать свой путь

//Используемые переменные
string temp_word;
map <string, int> word_stat; // словарь для хранения слов
int count_all = 0; //общее число слов в тексте
string text;

getline(file, text); //считываем текст из файла в строку

//Удалим все знаки пунктуации. Предполагается, что словами они не являются.
for(int i=0; i < text.length(); i++){
    if(check(text[i])) text[i] = ' ';
}
int i =0;
while(i < text.length()){

    string temp_word = "";
    //Ищем слово, ведь слова отделены теперь пробелами
    if(text[i]!= ' '){
        while(text[i] != ' ' and i < text.length()){
            temp_word = temp_word + text[i];
            i++;
        }
        word_stat[temp_word]++;
        count_all++;
    }
    
    i++;
}

show(word_stat, count_all);

}

Конечно, выше я описал довольно простой подход, который можно было бы улучшить, например, приводить слова к лемме(то есть начальной форме), чтобы слова ball & balls считались, как одно слово, но это уже совсем другая задача =)

→ Ссылка