Pull to refresh

Считаем буквы в произведениях русской литературы

Reading time 2 min
Views 5.6K
Вы когда-нибудь задавались вопросом, какая буква русского алфавита встречается в текстах чаще остальных? Именно поиском ответа на этот вопрос я и собираюсь заняться. A пока, вы не знаете результатов моего маленького исследования, я предлагаю вам угадать пять самых распространенных букв нашего алфавита. Готовы?

Итак, как говорил один мой знакомый, хватаясь за баранку своего автомобиля, поехали.
Для начала нам понадобятся тексты, на которых мы будем практиковаться. Я выбрал три литературных произведения наших классиков: «Война и мир» Льва Николаевича Толстого, «Тихий Дон» Михаила Шолохова, «Мастер и Маргарита» Михаила Булгакова. Почему эти произведения? Просто первые два — это единственные, которые я читал в школе, а «Мастер и Маргариту» мы с женой смотрели по телевизору и поэтому, я, немного разбираюсь в теме.

Теперь нам нужно каким-то образом посчитать в них количество каждой буквы алфавита и общее количество букв. Как же это сделать? Можно пойти самым простым путем, как, например, делает мой начальник. Для этого нужно пойти в библиотеку, взять четыре тома «войны и мир», придти домой и заняться пересчетом букв, затем таким же образом поступить с остальными книгами. Конечно, на это уйдет много времени, но мой начальник очень трудолюбивый человек, а еще у него есть подчиненные. Можно им по тому раздать, a, если не посчитают, или ошибутся — «премии лишу».

Этот способ мне сразу не понравился, и я решил написать программу, которая сделает всю работу за нас. Ниже прилагается код программы, написанной на perl. Она подсчитывает общее количество букв в тексте, а также количество каждой из букв алфавита и их процентное содержание.

use strict;
use locale;
use POSIX qw (locale_h);
setlocale(LC_CTYPE, 'ru_RU.CP1251');
setlocale(LC_ALL, 'ru_RU.CP1251');
my @letters = qw(А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я);
my @out = qw(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0);
open (TEXT, "<text.txt");
my $sum = 0;
while (defined(my $char = getc(TEXT))) {
if (uc($char) eq "Ё") {$char = "Е"}
for(my $i=0; $i<@letters; $i++) {
if(uc($char) eq $letters[$i]) {$out[$i]++; $sum++;}
}
}
open(OUT, ">out.txt");
print OUT "Всего букв - $sum\n\n";
for(my $i=0; $i<@out; $i++) {
print OUT "$letters[$i] - $out[$i] (".($out[$i]/$sum*100)."%)\n";
}


Для наглядности я немного доработал полученные данные в excel.
image

Как говориться, результат налицо. Самая популярная буква русского алфавита — это «О», а пятерка выглядит следующим образом: «О», «А», «Е», «И», «Н».

Теперь осталось ответить на самый главный вопрос. Зачем все это нужно?

Эту информацию, например, можно использовать, когда Леонид Якубович разрешит нам открыть любые пять букв. Я надеюсь, теперь вы знаете, какие буквы надо называть?
А если говорить серьезно, то нахождение частот встречаемости символов используется намного чаще, чем вы можете себе представить. Эта задача входит в алгоритм Хаффмана, который применяется во многих современных программах сжатия данных.
Tags:
Hubs:
+7
Comments 43
Comments Comments 43

Articles