Это задание, которое я даю в Learning Perl классах. Фактически, я однажды дал его студенту-стажеру, потому что у него было это задание на урок статистической механики. Большинство людей использовали короткий текст и считали вручную. Так что я попросил его написать Moby Dick , а затем Библию KJV. Мои дополнительные инструкции заключались в том, чтобы раскрыть результаты для Библии только после того, как он поразит всех Моби Диком . Хорошие времена. Зипф берет огромную книгу, чтобы объяснить все это: Человеческое поведение и принцип наименьшего усилия .
Во-первых, вы, вероятно, не захотите, чтобы это описывалось в одной строчке. Есть кое-что, что вам нужно сделать.
- Удалить весь «нетекстовый» текст. Вот что написал Герберт Уэллс, а затем метатекст, такой как «Глава».
- Нормализовать слова. «The» и «the» одинаковы, но имеют разные падежи. «Марсианин» и «марсианин» немного разные, потому что они представляют разные идеи. Как вы об этом судите, зависит от вас.
- Подсчитайте счет. Здесь вам не нужен конвейер, потому что Perl может все это делать. Использование слова в качестве ключа ha sh уже обрабатывает часть уникальности.
LINE: while( <> ) {
chomp;
my @words = map normalize($_), split /\s+/;
$Count{$_}++ for @words;
}
sub normalize {
my $s = lc shift;
$s = s/[^a-z]//ig; # might reduce too much
... whatever else you need ...
}
Как только у вас есть ha sh, вы можете выводить его любым способом. Ключи уже уникальны, и вы можете их отсортировать, я думаю, но сюжету все равно.
Оттуда вы заметите другие странности в списке слов, внизу, в хвосте. Вы можете игнорировать их из-за их небольшого количества, но если вам нужна высокая точность, вы попадете в словари, которые вы поддерживаете отдельно для особых случаев.