4 мая 2010 в 14:38

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

Вы когда-нибудь задавались вопросом, какая буква русского алфавита встречается в текстах чаще остальных? Именно поиском ответа на этот вопрос я и собираюсь заняться. 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

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

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

Эту информацию, например, можно использовать, когда Леонид Якубович разрешит нам открыть любые пять букв. Я надеюсь, теперь вы знаете, какие буквы надо называть?
А если говорить серьезно, то нахождение частот встречаемости символов используется намного чаще, чем вы можете себе представить. Эта задача входит в алгоритм Хаффмана, который применяется во многих современных программах сжатия данных.
Олег Савватеев @Savvateev
карма
9,0
рейтинг 0,0
Самое читаемое

Комментарии (43)

  • +7
    о!
    • 0
      А-а-а-а-а-а-а…
      • +12
        • –1
          Х -х -х -х -х -х! З б вно =)
        • –1
          бугого=) это дооо!
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    А еще на основе частотного анализа можно много чего в криптографии сделать.
    Кстати я думаю что если по всем произведениям литературным пройтись, то общий вид графика не поменяется
    • +2
      Если на вход подать тексты песен группы «Ленинград», то я знаю, какие три буквы будут самыми популярными =)
      • 0
        А задача то, сама по себе интересная — какие буквы распространены в песнях/стихах, и сильно ли изменится график от исходных данных.
        • +1
          Частотность букв в песнях группы &#39;Ленинград&#39;

          Как побочный эффект — я, бля, начитался, бля, этих текстов, а мне сейчас, бля, деловое письмо писать.
          • +1
            А вот так будет выглядеть график если проанализировать 14 487 песен 658ми русских исполнителей

            Всего букв: 629 536
            И что интересно, частота использования букв сильно отличается от классических произведений.
            • +5
              Хм. Что-то много «п». Из текстов было вырезано слово «припев»?
              • НЛО прилетело и опубликовало эту надпись здесь
                • +1
                  Вряд ли, в письменных текстах скорее будут использовать ё*аные звёздочки или другую х##ню.
              • –3
                Да, Вы правы, «припев» забыл вырезать. Но оно встречается не так часто в текстах, которые у меня есть. Думаю большой погоды это не сделает.
    • 0
      Всё, что можно было сделать в криптографии на основе частотного анализа уже давно сделано.
  • 0
    Ух ты! Новый способ ездить на двух колесах.
  • +5
    Я один выражу мысль «велосипед»? Статистику частотности букв можно легко найти по всему Интернету. И среднюю длину слов в предложении и среднюю длину самих слов.
    • 0
      Нет, не один. Буквально перед вами я высказал ту же мысль.))
  • +9
    Исходник ваш ужасен, к сожалению:

    1) Зачем постоянно делать uc($char), да ещё и в цикле? один раз было бы достаточно.
    2) getc() — не слишком эффективное решение.
    3) Вместо того, чтобы сравнивать поступившую букву с массивом имеющихся, логично и удобно воспользоваться хэшем. Лишние символы можно красиво обойти регэкспом /\p{Cyrillic}/ — правда, тогда надо работать в UTF-8, но это тоже будет плюс.
    4) А файлы закрыть?

    и вот это, конечно…

    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);

    Просто без комментариев :)
    • 0
      Да там вообще цикл перебора букв не уперся :)

      Можно сделать сразу $out[(int)$char]++
      Ну или как там в перле получить ascii код, короче вы меня поняли )
    • –3
      Файлы действительно забыл закрыть.
  • 0
    IMHO, значительно интереснее было бы посчитать частоту употребления слов с различной длиной. Она по крайней мере 100% отличается у разных авторов
    • –1
      Вы действительно думаете она будет отличаться?
      • +1
        Тут ударила мне кровь в голову.
        — Ложи, — говорю, — взад!
        А она испужалась. Открыла рот, а во рте зуб блестит.
        Average length: 4.16


        По целым месяцам не испытывая влечения к женщине, девственный карлик переживал изредка пронзительные приступы одинокой любовной тоски, которые проходили так же внезапно, как и вспыхивали, и снова на время он не замечал ни голых плеч, белеющих за бархатным барьером, ни маленьких акробаток, ни танцовщицы испанской, чьи ляжки обнажались на миг, когда при быстром кружении всхлестывал оранжевый пух ее кудрявых исподних воланов.
        Average length: 5.83


        Где тут Зощенко, а где Набоков? ;)

    • 0
      Кстати, мне стало интересно. Напишу на досуге такое.
      • 0
        Еще один интересный момент — длина слов, в отличии от частоты букв, не зависит от языка. Так что по идее можно (с некоторыми поправками на буквосочетания) посмотреть, насколько и как отличаются языки, в том числе разной степени родства :)
        • 0
          Ещё как зависит.

          Средняя длина слова в русском языке — 5.28 символов. В английском — 5.10.

          В языке фон — 3.03 (изолирующий язык), в инуктитуте — 14.48 (агглютинативные языки).
    • +1
      Я пользуюсь вот этой базой. Правда здесь только фантастика, а так — есть всё, что нужно и даже больше: средняя длина слова, знаков; средняя длина предложения, знаков; доля диалогов в тексте; доля авторского текста в диалогах
  • НЛО прилетело и опубликовало эту надпись здесь
  • +1
    Многие занимались этим, особенно те кто пишет генераторы тексты для «не хороших сайтов» Поищите в гугле «Частотный словарь», там уже есть результаты и выводы…
  • +2
    В «Тихом Доне» была цензура на букву Ю?
  • 0
    — «Война и мир» Льва Николаевича Толстого, «Тихий Дон» Михаила Шолохова… Просто первые два — это единственные, которые я читал в школе
    — Редко, но метко, что называется :)
    — p.s. да уж, без тегов неудобно :)
  • +2
    >> В романе «Мастер и Маргарита» твердый знак встречается всего лишь один раз

    здесь я нашёл 192 твёрдых знака, проверьте расчёты ещё раз :)
    • +1
      Вы абсолютно правы. Твердых знаков там почти две сотни. Текст топика поправил. Вам большое спасибо за замечание.
      • +1
        Да не за что :)

        Ещё хорошо бы отделить «е» от «ё», хотя с современными изданиями это будет непросто. Всё-таки, это разные буквы.
        Думается что эта операция заметно пошатнёт позиции «е» на графике.
  • +1
    Помниться в свое время на одном из порталов была «виселица» на базе «шуток» Русского радио и Фоменко. От нечего делать я сделал бот, который очень быстро попал в топ :)

    Первым делом я выбирал случайные буквы по частотной таблицы типа
    %WT = (
    'О' => 10000, 'Е' => 10000, 'А' => 10000, 'Т' => 10000, 'И' => 10000, 'Н' => 10000,
    'С' => 100,   'Р' => 100,   'Л' => 100,   'В' => 100,   'К' => 100,   'М' => 100,
    'Д' => 1,     'У' => 1,     'П' => 1,     'Ь' => 1,     'Б' => 1,     'Я' => 1,
    'Ы' => 1,     'Ч' => 1,     'Г' => 1,     'З' => 1,     'Ж' => 1,     'Ш' => 1,
    'Й' => 1,     'Х' => 1,     'Ю' => 1,     'Ц' => 1,     'Щ' => 1,     'Э' => 1,
    'Ф' => 1,     'Ъ' => 1   
    );
    

    Поскольку там было позволено 3 ошибки — работало безупречно.
  • 0
    А Punto Switcher и не знает!..
  • 0
    После прочтения вашего топика вспомнил о своей давней идее написания скрипта для составления TOP используемых в тексте слов. Собственное, зачем это нужно… А для того, чтобы облегчить себе жизнь при чтении литературы на неродном языке, например, английском. Берем какой-то текст на английском, или даже книгу, прогоняем через скрипт, получаем top используемых слов в порядке убывания. Прогоняем через переводчик, ознакамливаемся и приступаем к чтению. Кстати, может такого рода велосипед уже изобрели?
  • +1
    хмм… А мне почему-то помнится из детства, что самая часто встречающаяся буква в русском языке — это «Е»… Какую-то книжку тогда читал по методам шифровки и дешифровки, и там вот эти данные были.
  • НЛО прилетело и опубликовало эту надпись здесь
  • 0
    «Зачем все это нужно?» Я сейчас пишу статью о свойствах шрифтов и мне пригождаются ваши данные. Частотность букв в языке — это важнейший параметр для оценки шрифтов, особенно текстовых. 50% букв, что мы встретим в русском, будут о, е, а, и, н, т, это очень отличается от 50% английского e, t, a, o, i, n. Это очень важно, например, для расчета размеров табличек в городской навигации и для понимания общего впечатления от любого шрифта на разном языке. Оно зависит во многом от того, сколько и каких форм (овальных, прямых, похожих ммежду собой или нет) мы встречаем при чтении.
  • 0
    Да, вот еще для чего пригождается частотность. Мы делаем распознаватель шрифтов по картинке для нашего шрифтового сервиса. И не все буквы подряд мы распознаем, а в очередности, зависящей, в том числе, от их встречаемости в языке.

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.