@iwanerhov
Программист С/C++

Необходимо получить первые N наиболее встречающиеся слова в текстовом файле?

Товарищи. Задача такова. Есть текстовый файл. Нужно получить первые N наиболее часто повторяющиеся слова (в порядке убывания частоты встречаемости). При сравнении регистр не учитывать. И необходимо составить стоп словарь ! Словарь хранить в файле.... Разделителями слов считаются пробел, табуляция, символы перевода строки, знаки препинания

Можно пользоваться чем угодно (STL)! Товарищи подскажите :D
  • Вопрос задан
  • 2883 просмотра
Пригласить эксперта
Ответы на вопрос 3
@brutal_lobster
Посмотрите код uniq из coreutils ;)
Ответ написан
@Eddy_Em
Есть тупой (в лоб), но медленный вариант — сортировка и подсчет количества повторов с составлением эдакого псевдодерева. Есть сложный вариант чуть побыстрей - деревья. Можно и еще уйму более быстрых и значительно более сложных вариантов рассмотреть.
Ответ написан
Комментировать
@Koss1024
А что подсказать? В чем вопрос?

Или написать за Вас код?

Алгоритм прост:
Читаем слова из файлового потока и собираем в map примерно так

ifstream fs("filename.txt");
map freq; // частоты файлов
string word;
while(read_next_word(fs, word)) // read and skip spaces tabs etc... (тут логика пропуска ненужных символов)
{
transform(word.begin(), word.end(), word.begin(), tolower); //lowercase
freq[word]++; // увеличиваем счетчик для нашего слова
}

теперь у нас есть частоты всех слов в мапе скопируем ее в вектор и отсортируем по частотам

vector > vocabulary(freq.begin(), freq.end());
sort(vocabulary.begin(), vocabulary.end(), less_second); // можно лямбдой будет проще если можно с++11

Слова в контейнере vocabulary отсортированы по частоте и делать с ними можно что угодно

где
bool less_second(const pair& a, const pair& b)
{
return a.second < b. second;
}

Это действительно весь код. (кроме логики пропуска символов, но там все просто по моему)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы