Сделать статистику слов в тексте
Есть текст. Нужно посчитать сколько было использовано слов. Пример:
Слово "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 шт):
Привожу свою реализацию данной задачи. При желании ее достаточно просто модифицировать в соответствии со своими потребностями. Для решения я использовал контейнер 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 считались, как одно слово, но это уже совсем другая задача =)