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

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

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

Можно пользоваться чем угодно (STL)! Товарищи подскажите :D
  • Вопрос задан
  • 2903 просмотра
Пригласить эксперта
Ответы на вопрос 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;
}

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

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

Похожие вопросы