Считаем буквы в произведениях русской литературы
Вы когда-нибудь задавались вопросом, какая буква русского алфавита встречается в текстах чаще остальных? Именно поиском ответа на этот вопрос я и собираюсь заняться. 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, »
while (defined(my $char = getc(TEXT))) if (uc($char) eq «Ё»)
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.
Как говориться, результат налицо. Самая популярная буква русского алфавита — это «О», а пятерка выглядит следующим образом: «О», «А», «Е», «И», «Н».
Теперь осталось ответить на самый главный вопрос. Зачем все это нужно?
Эту информацию, например, можно использовать, когда Леонид Якубович разрешит нам открыть любые пять букв. Я надеюсь, теперь вы знаете, какие буквы надо называть?
А если говорить серьезно, то нахождение частот встречаемости символов используется намного чаще, чем вы можете себе представить. Эта задача входит в алгоритм Хаффмана, который применяется во многих современных программах сжатия данных.
- perl
- алгоритм Хаффмана
- сжатие данных
Частота букв в русском языке
Написал забавный php-скрипт. Погонял через него все тексты на « Спектаторе» на предмет языка. Всего в текстах употребляется 39110 разных словоформ. Сколько именно разных слов — определить довольно сложно. Чтобы хоть как-то приблизиться к этой цифре, я брал только первые 5 букв слова и сравнивал их. Получилось 14373 таких комбинаций. С большой натяжкой это можно назвать словарным запасом « Спектатора».
Потом я взял слова и иследовал их на предмет частоты повторения букв. В идеале надо брать какой-нибудь словарь, для полноты картины. Прогонять тексты нельзя, нужно только уникальные слова. В тексте же одни слова повторяются чаще, чем другие. Итак, получились следующие результаты:
о — 9.28%
а — 8.66%
е — 8.10%
и — 7.45%
н — 6.35%
т — 6.30%
р — 5.53%
с — 5.45%
л — 4.32%
в — 4.19%
к — 3.47%
п — 3.35%
м — 3.29%
у — 2.90%
д — 2.56%
я — 2.22%
ы — 2.11%
ь — 1.90%
з — 1.81%
б — 1.51%
г — 1.41%
й — 1.31%
ч — 1.27%
ю — 1.03%
х — 0.92%
ж — 0.78%
ш — 0.77%
ц — 0.52%
щ — 0.49%
ф — 0.40%
э — 0.17%
ъ — 0.04%
Тем, кто поедет на « Поле чудес», советую заучить эту таблицу наизусть. И называть слова в таком порядке. Так, например, казалось бы, такая « привычная» буква « б» употребляется реже, чем « редкая» буква « ы». Помнить надо также и то, что в слове не одни гласные. И что если вы угадали одну гласную, то нужно начинать идти по согласным. И кроме того, слово угадывается именно по согласным. Сравните: « **а**и*е» и « ср*вн*т*». И в том и в другом случае — это слово « сравните».
И еще одно соображение. Как вы учили английский? Помните? Э пен, э пенсил, э тэйбл. Что вижу — о том и пою. А смысл. Как часто вы в нормальной жизни говорите слово « карандаш»? Если задача — научить говорить как можно быстрее и эффективнее, то и учить надо соответствующе. Проводим анализ языка, выделяем самые употребимые слова. И учить начинаем именно с них. Чтобы более-менее говорить на английском языке, достаточно всего полторы тысячи слов.
Еще одно баловство: составлять слова из букв случайным образом, но учитывая частоту появления, чтобы было похоже на нормальные слова. В первой же десятке « случайных» четырехбуквенных слов выскочило « осел». В следующей полсотне — слова « мчим» и « нато». Но, увы, очень много неблагозвучных комбинаций, таких, как « блтт» или « нрро».
Поэтому — следующий шаг. Я разбил все слова на двухбуквенные сочетания и начал случайным образом (но с учетом частоты повторения) комбинировать их. Стали в больших количествах получатся слова, похожие на « нормальные». Например: « коивдиот», « воабма», « апый», « депоид», « дебяко», « орфа», « поеснавы», « озза», « ченя», « риторя», « урдеед», « утоичи», « стых», « сапоть», « гравда», « абабап», « обарто», « еелует», « лярезы», « мыни», « бромомер» и даже « тодебыст».
Куда применить. есть варианты. Например, написать генератор красивых фирменных игривых имен. Для йогуртов. Типа, « мемолисо» или « уторорерто». Или — генератор футуристических стихов « Бурлюк-php»: « опелдиий миатон, линоаз окмиая. деесопен одесон».
И есть еще один вариант. Надо попробовать.
Некоторые статистические данные об использовании русских слов:
После заметки мне пришло вот такое письмо:
Здравствуйте, Дмитрий !
Проанализировав статью « Язык до Киева доведет» и ту ее часть, где Вы описываете свою программу, возникла идея.
Вами написанный скрипт кажется мне предназначенным абсолютно не для « Поля чудес» в большей мере, а для другого.
Первое самое разумное применение результатов работы Вашего скрипта — определение порядка букв при программировании кнопок для мобильных устройств. Да, да — именно в мобильниках и нужно все это.
Я распределил это по волнам (см. рисунок)
Далее распределение по кнопкам:
1. Все буквы из первой волны уходят на 4 кнопки в первый ряд
2. Все буквы из второй волны тоже на остальные 4 кнопки в тот же первый ряд
3. Все буквы из третьей волны туда же на оставшиеся две кнопки
4. 4,5 и 6 волны уходят во второй ряд
5. 7,8,9 волны уходят на третий ряд, причем 9-я волна уходит вся полностью (не смотря на кажущееся большое количество букв) в третий ряд 9-й кнопки, что-бы 10 кнопку оставить под всякие там знаки препинания (точка, запятая и прочее).
Я думаю все понятно и так, без детальных обьяснений. Но все же не могли бы Вы обработать Вашим скриптом (включая знаки припинания) тексты следующего содержания:
1. Л. Н. Толстой. « Анна Каренина» (лучше конечно « Войну и мир», но я не нашел на www.lib.ru) -http://www.lib.ru/LITRA/TOLSTOJ/anna_kar.txt
2. Ф. М. Достоевский. « Игрок» — www.lib.ru/LITRA/DOSTOEWSKIJ/igrok.txt
3. Леонид Филатов. « Про Федота Стрельца» — www.lib.ru/ANEKDOTY/fedot.txt
4. Вильям Шекспир. Сонеты (перевод С. Я. Маршака) www.lib.ru/SHAKESPEARE/sonets.txt
5. Б. И А.Стругацкие. Пикник на обочине. www.lib.ru/STRUGACKIE/picnic.txt
А потом выложить статистику? Мне показалось? что тексты максимально отражают нашу современную речь, а ведь мы как говорим, так и пишем sms.
Заранее большое спасибо.
Итак, анализировать частоту повторения букв можно двумя способами. Способ 1. Взять текст, найти в нем уникальные (не повторяющиеся) словоформы и анализировать их. Способ хорош для построения статистики по словам русского языка, а не по текстам. Способ 2. Не искать в тексте уникальные слова, а сразу перейти к подсчету частоты повторения букв. Получаем частоту букв в русском тексте, а не в русских словах. Для создания клавиатур и прочего нужно использовать именно этот способ: на клавиатуре набираются именно тексты.
Клавиатуры должны учитывать не только частоту букв, но и самые упортебимые слова (словоформы). Не так уж и трудно догадаться, какие именно слова самые употребимые: это, во-первых, служебные части речи, ибо роль у них такая — служить всегда и везде, и местоимения, роль у которых не менее важная: заменять в речи любую вещь/человека (это, он, она). Ну и основные глаголы (быть, сказать). По результатам анализа перечисленных выше текстов я получил такие самые « популярные» слова: « и, не, в, что, он, я, на, с, она, как, но, его, это, к, а, все, ее, было, так, же, то, сказал, за, ты, о, у, ему, мне, только, по, меня, бы, да, вы, от, был, когда, из, для, еще, теперь, они, сказала, уже, него, нет, была, ей, быть, ну, ни, если, очень, ничего, вот, себя, чтобы, себе, этого, может, того, до, мы, их, ли, были, есть, чем, или, ней» и так далее.
Возвращаясь к клавиатурам — очевидно, что в клавиатуре буквосочетания « не», « что», « он», « на» идругие должны находится как можно ближе друг к другу, или если не вплотную, то каким-то наиболее оптимальным образом. Нужно провести исследования, каким именно образом пальцы движутся по клавиатуре, найти самые « удобные» позиции и поместить в них самые употребляемые буквы, не забывая, однако, про буквосочетания.
Проблема, как всегда, одна: даже если и получиться создать Уникальную Клавиатуру, куда деть миллионы людей, которые уже привыкли к qwerty/йцукен?
Насчет же мобильных устройств. Наверное, it makes sense. По крайней мере, буквы « о», « а», « е» и « и» должны точно находиться на одной клавише. Знаки препинания в порядке частоты употребления : , . — ? ! » ; : ) (
Запятая употребляется в 2 раза чаще, чем точка. А точка на стандартной русской клавиатуре расположена удобней.
Статистика по приведенным выше текстам:
По уникальным словам:
о — 9.36%
а — 8.40%
е — 8.08%
и — 6.91%
н — 6.12%
с — 5.67%
т — 5.49%
р — 5.30%
л — 5.00%
в — 4.67%
п — 3.38%
у — 3.17%
к — 3.14%
м — 2.97%
д — 2.72%
я — 2.50%
ь — 2.08%
ы — 2.06%
з — 1.85%
б — 1.61%
г — 1.47%
ш — 1.32%
ч — 1.22%
й — 1.21%
ж — 1.01%
ю — 0.99%
х — 0.97%
щ — 0.48%
ц — 0.37%
ф — 0.20%
э — 0.06%
ъ — 0.05%
По текстам в целом:
о — 11.35%
е — 8.93%
а — 8.23%
н — 6.71%
и — 6.48%
т — 6.17%
с — 5.22%
л — 4.95%
в — 4.47%
р — 4.17%
к — 3.35%
д — 2.97%
м — 2.93%
у — 2.86%
п — 2.39%
я — 2.17%
ь — 2.09%
ы — 1.90%
г — 1.811%
б — 1.77%
ч — 1.67%
з — 1.65%
ж — 1.14%
й — 1.09%
ш — 0.89%
х — 0.79%
ю — 0.66%
э — 0.33%
ц — 0.29%
щ — 0.29%
ф — 0.10%
ъ — 0.02%
Какая буква чаще всего используется в русском языке? И как проще всего это узнать,
О, потом Е, потом И, потом А. Потом согласные Н, Т, С, Р, и т. д.
Единственный правильный ответ! В своё время это любой типограф знал по опыту, какого шрифта (литеры) больше всего расходуется при наборе.
ОлегГений (84797) 14 лет назад
Откуда такая уверенность в правильности ответа? Вы типограф?
Виктор Единович Искусственный Интеллект (156671) Нет. Просто я — бывший учёный-энциклопедист.
Остальные ответы
я думаю, что «А».
по степени затёртости на клавиатуре у литератора
букаФка ААААААААААА))))
я так считаю что буква «Х» .-доказательства? прсто прогуляйтесь по улице
чаще всего используют 3 буквы это У Й Х
наверное Ъ
это согласная в любом случае,
где то слышал что толи К толи Н
точно не помню
Как все шутят. Конечно, буква О.
О, потом Е, потом И, потом А. Потом согласные Н, Т, С, Р, и т. д.
Пришлось посчитать по большому числу текстов. А хулиганам не верьте.
Виктор ЕдиновичИскусственный Интеллект (156671) 14 лет назад
Единственный правильный ответ! В своё время это любой типограф знал по опыту, какого шрифта больше всего расходуется при наборе.
Конечно буква Р. Потому что она посередине клавиатуры находится!! ! 🙂
берём любой словарь, более всего слов на «п»,после на «р»,после на «о»,после на «Т»,в итоге самое характерное слово для русского простор и простота
inga zajontzМыслитель (9382) 14 лет назад
«с» пропустила
Попробуйте угадать, какая из букв русского языка встречается чаще всего?
Буква О. Частота появления – 0.090. Т. е. в последовательности из 1000 букв, буква О будет встречаться в среднем 90 раз.
Какие буквы занимают лидирующие позиции, встречаются чаще всего?
Гласные. Именно они чаще всего встречаются в русском языке, делаю нашу речь «певучей» . Следом за О идут буквы Е и Ё (вместе, их не разделяют, т. к. при написании, часто теряют Ё). Частота появления – 0.072. За ними – буквы А и И. Частота появления каждой из них – 0.062.
Достаточно ли этого для того, чтобы декодировать текст? В принципе да, если мы уверены, что последовательность кодов содержит текст именно на русском языке в какой-то из известных или неизвестных нам кодировок. Но всегда есть некоторая вероятность, что предъявленная последовательность кодов никакого отношения к русскому языку не имеет. Чтобы убедиться в этом, надо воспользоваться частотным словарем слов русского языка.
Как вы полагаете, какое слово встречается в русском языке чаще всего?
Союз И, затем следуют столь же краткие части речи – В, НЕ, ОН, НА. Но чаще всего, конечно, будет встречаться пробел.
Декодируемый текст надо проверить на совпадение по частотному словарю. И только при более-менее полном совпадении можно говорить о том, что мы имеем дело текстом, написанном на русском языке.
Это дает 100% результат, если текст достаточно большой. Если же речь идет о нескольких словах, то частота букв (и тем более слов) может быть нарушена. Что делать в этом случае? Надо предложить читателю несколько вариантов на выбор. Декодировать текст по одной из гласных букв, которые встречаются чаще всего. Гласные! Они всегда будут встречаться чаще других букв. Если закодирован именно текст на русском языке, то успех гарантирован.
Источник: www.ieee.ru
В английском -е-, в русском -о-.
Димитрий ХворовПрофи (934) 7 лет назад
В Поле чудес «А». Такое там было, что 3 передачи подряд «А» во всех словах, а про букву «О» скажу, что даже 2 передачи подряд не было её во всех словах. Только в одной передачи подряд «О» во всех словах. Вот и делайте вывод. Последний раз была «О» во всех словах 27.06.2014. А буква «А» последний раз была во всех словах 20.05.2016.
просто совпадение, О чаще.
Посмотрите на клавиатуру. Самые используемые буквы — в центре, именно их набирают указательными пальцами при слепом наборе.
думаю, что это буквы о, т
Да че вы паритесь просто нажимаете ctrl+f а потом набираете в окне буквы и сами смотрите каких букв сколько раз использовано
Статистика языка
Развитие компьютеров привело к созданию больших собраний оцифрованных текстов на разных языках — так называемых лингвистических корпусов. Эти корпуса можно обрабатывать методами математической статистики. Математические модели, порой неожиданно простые, но эффективные, позволяют компьютерным лингвистам предложить человечеству и конкретному пользователю решение задач, связанных с автоматической обработкой естественного языка: распознавание речи, определение языка текста и машинный перевод, классификация текстов по темам, извлечение знаний из текста, выделение ключевых слов, анализ тональности текста (т. е. выяснение, содержится ли в нём положительная или отрицательная оценка), обнаружение спама, создание чат‐ботов и т. д.
Рассмотрим две задачи — автоматическое определение языка текста и исправление опечаток, хорошие решения которых основаны на анализе частотности отдельных букв и слов, а также их сочетаний в реальных текстах. Удивительно, но такой подход позволяет решать эти задачи, не обладая знаниями ни о грамматических правилах языков, ни о смыслах анализируемых текстов.
Определение языка текста. Предположим, что компьютер получил задание определить, на каком языке написан такой текст:
При все че математиката е строга наука,
тя има и естетическа страна.
Эта болгарская фраза означает «При том, что математика — строгая наука, она имеет и эстетическую сторону». Компьютер не владеет языками, но у него есть список языков, к одному из которых надо отнести этот текст. Будем считать, что круг кандидатов не слишком широк: английский, белорусский, болгарский, немецкий, русский, украинский, французский языки.
Самая простая идея, которая приходит в голову, — определять язык по алфавиту. В нашем случае это кириллица, поэтому сразу можно отбросить английский, немецкий и французский языки. Но этот метод не решит задачу полностью, например, он плохо справляется с русским и болгарским языками: болгарский алфавит — часть русского (в болгарском нет букв Ё, Ы, Э), так что любой болгарский текст можно принять за русский. Соотношение русского и украинского алфавитов сложнее, ни один не является частью другого: в украинском нет буквы Ъ, зато есть буквы для обозначения гласных звуков Є, І, Ї и согласного Ґ. Но все буквы данной фразы в нём присутствуют. В белорусском нет И (вместо неё используется буква І), поэтому он не подходит. Итак, алфавитный подход с задачей не справляется: осталось три языка‐кандидата.
Наличие лингвистических корпусов позволяет анализировать языки, находить характеристики, которые их различают. В частности, «паспортом» языка может служить набор частот, с которыми в среднем встречаются буквы в этом языке.
На частотность букв обратили внимание ещё в докомпьютерную эпоху. Например, в телеграфной азбуке Морзе, возникшей в первой половине XIX века, наиболее часто используемым буквам ставили в соответствие более короткие сочетания точек и тире. Так, самые частые в английском языке буквы E и T кодируются односимвольно — точкой и тире соответственно. Эти буквы можно встретить и в начале верхнего ряда стандартной английской раскладки клавиатуры, унаследованной от пишущих машинок, — QWERTY. А в немецкой раскладке привычный глазу ряд заменён на QWERTZ — буква Y в немецком языке встречается существенно реже, чем Z, и сослана на периферию. Ещё один пример: в криптографии простые шифры на основе замены букв утратили значение после того, как были изучены частотные характеристики языков. Естественно, в XIX веке подсчёты частотности выполнялись вручную. Теперь же, с появлением лингвистических корпусов, частоты букв или слов можно посчитать на компьютере, причём эти данные будут более точными, объективными.
Если условиться, что русский алфавит состоит из 33 букв и пробела, то окажется, что самый частый символ — это пробел (14,46%), дальше следуют гласные О (9,42%), Е (7,33%), И (6,72%), А (6,52%) и согласные Н (5,83%), Т (5,56%). А реже всего встречаются буквы Ф (0,27%), Ъ (0,03%) и Ё (0,01%). Конечно, в каждом конкретном тексте частоты могут отличаться от приведённых, но эти отклонения будут несущественными.
А вот в болгарском языке частоты букв будут другими. Первыми после пробела идут те же четыре гласные, что и в русском, но в обратном порядке: А, И, Е, О. Буква Ъ в русском языке — редкость, а в болгарском употребляется в разы чаще: она обозначает особый гласный звук типа краткого «а» и встречается даже в самом слове български. Последней по частотности буквой является Ь. Всё это показывает, что частотность букв действительно является индивидуальной характеристикой языка.
В компьютерном анализе (например, при определении языка) текст — это последовательность букв. В простейшей модели принимается, что каждая буква в этой последовательности появляется независимо от предыдущих, т. е. текст рассматривается как цепь независимых случайных событий: «прочитав» несколько букв, читатель не знает, что ждёт его дальше. Вследствие независимости вероятность встретить данную последовательность букв в выбранном языке равна произведению вероятностей (частот) появления букв в этом языке.
Зная частотности букв для каждого из трёх языков‐претендентов, можно найти вероятность появления всей фразы:
Получается, что вероятность случайного появления этой фразы в болгарском языке в 300 раз больше, чем в русском, и в 300 000 раз больше, чем в украинском. Если о происхождении фразы нет априорной информации, то языки‐кандидаты считаются равноправными. Это позволяет сравнивать вероятности появления фразы в разных языках, представив их более привычно, в процентах:
болгарский — 99,65%, русский — 0,3497%, украинский — 0,0003%.
Следовательно, выбрав вариант с максимальной вероятностью, в данном примере получим правильный ответ: фраза написана по‐болгарски. Любопытно, что такой простой алгоритм неплохо сработал даже на тексте небольшой длины. Но так бывает не всегда. Например, для названия этой книги Математическая составляющая получается неожиданный результат:
болгарский — 51,55%, русский — 40,75%, украинский — 7,7%.
Симпатия этого алгоритма к болгарскому языку объяснима и носит общий характер: в нём меньше букв, чем в русском или украинском языках, а значит, частотность отдельной буквы будет в среднем чуть больше. Поэтому большинство нестандартных текстов алгоритм сочтёт болгарскими.
Точность определения языка текста можно повысить, если рассматривать не частоты букв по отдельности, а частоты комбинаций символов некоторой длины. Дело в том, что, в отличие от применённой выше простейшей модели, буквы в реальном тексте не независимы: на самом деле каждая буква зависит от предшествующих, по крайней мере — от предыдущей. Так, по правилам русского языка после Ъ могут идти только буквы Е, Ё, Ю или Я. В болгарском после Ъ можно встретить и букву Л, причём это в 10 раз вероятнее, чем встреча с Е, Ю и Я, вместе взятыми. А в украинском И почти не используется после пробела — значит, наша первая фраза со словами има и едва ли может быть украинской.
Эту идею академик Андрей Андреевич Марков (1856–1922) воплотил в математической модели, которая в его честь получила название «цепь Маркова». Он изучил распределение гласных и согласных в последовательности из 20 000 букв в романе «Евгений Онегин» (первая глава и начало второй). Основной вывод гласил: «Мы видим, что вероятность букве быть гласной значительно изменяется, в зависимости от того, предшествует ей гласная или согласная». Подсчёты А. А. Маркова показали, что общая доля гласных — 43,2%, но вероятность встретить гласную после гласной уменьшается до 12,8%, а после согласной — возрастает до 66,3%.
Получается, что в реальном тексте имеем дело не с вероятностями независимых случайных событий, а с условными вероятностями последовательно происходящих событий. В марковской модели будущее зависит от настоящего, а вот прошлое можно не анализировать: его влияние заложено в настоящем. Житейский пример: предсказывая погоду на завтра, можно ориентироваться на сегодняшнюю. Зимняя гроза — редкое явление, так что если сегодня гроза, то завтрашний день может оказаться и солнечным, и дождливым, но вряд ли выпадет снег. С другой стороны, если сегодня идёт снег, то увидеть завтра грозу — маловероятно.
Марковские цепи как математический инструмент можно использовать для анализа распределения не только гласных и согласных в данном языке, но и для всех пар букв алфавита. Зависимость буквы от предшествующей заметить несложно. Например, в русском языке среди пар, начинающихся с буквы З, наиболее вероятны сочетания ЗА (29,67%), ЗН (10,18%), З⎵ (пробел после З; 8,36%), а после буквы А те же символы А, Н, ⎵ дают совсем другие результаты: АА (0,03%), АН (9,56%), А⎵ (20,36%).
Для решения задачи определения языка текста можно сравнивать частотные характеристики пар из одинаковых символов в разных языках. Например, тройки лидеров среди пар, начинающихся с буквы З: в русских текстах — ЗА, ЗН, З⎵; в украинских — ЗА, З⎵, ЗН; в болгарских — ЗА, ЗИ, ЗВ.
Частотность букв действительно является отличительной и притом наглядной характеристикой языка. Здесь приведены гистограммы для трех славянских языков
Зная частоты всевозможных пар, можно в каждом из языков‐кандидатов найти вероятность в марковской модели словосочетания Математическая составляющая, которое рассматривается как последовательность пар: ⎵М (буква М является началом слова), МА, АТ, ТЕ, ЕМ и т. д. Вероятность всего словосочетания находится как произведение вероятностей этих пар. Результаты (округлённые) дают ответ на вопрос, где могла появиться такая книга:
болгарский — 0,06%, русский — 99,94%, украинский — 0,00003%.
А для фразы, с которой начался разговор (При все че математиката. ), степень уверенности у марковской модели почти абсолютная: вероятность, что фраза написана по‐болгарски, равна 99,99991%!
Частотность последовательностей из двух (а лучше даже трёх) букв — очень точная характеристика языка. Приведённый метод — основа всех применяемых определителей языка, самый известный — модуль в Google Translate. Получается, что для решения этой лингвистической задачи не требуется знание языков, работает чистая статистика.
Частотность важна в реальной деятельности, например, в прикладной лингвистике и криптологии (в ней две ветви: криптография и криптоанализ), встречается и в беллетристике.
Рассказ Эдгара По «Золотой жук» (1843) — одно из первых популярных (и художественных!) изложений как реального способа шифрования методом подстановки, замены букв какими‐то знаками, так и метода его расшифровки — частотного анализа. А в 1903 году Артур Конан Дойл в серии историй о Шерлоке Холмсе опубликовал рассказ «Пляшущие человечки», математически весьма схожий с «Золотым жуком».
Исправление опечаток. Текстовые редакторы и смартфоны решают эту задачу методами, сходными с использовавшимися в задаче определения языка. Только теперь сравниваются частоты не букв, а слов и их последовательностей в выбранном языке.
Предположим, что пользователь ввёл фразу:
Его руква немного болит,
а задача компьютера — найти и исправить в ней опечатки. Человеку сразу понятно, что опечатка допущена в слове руква, а должно быть написано слово рука. Попробуем научить этому и компьютер, используя гигантский лингвистический корпус русскоязычных текстов общей длиной 16 миллиардов слов.
На первом этапе отыщем подозрительные слова: такие слова, которые либо отсутствуют в корпусе, либо встречаются там очень редко, скажем, для определённости — не более 100 раз (причиной возникновения в корпусе таких слов могут быть опечатки). А слова, которые встречаются более 100 раз, составляют словарь.
Вот сведения о частотах наших четырёх слов в корпусе: его — 46 643 493, руква — 50, немного — 3 475 296, болит — 203 993. По принятой договорённости алгоритм решает, что в слове руква допущена опечатка.
На втором этапе определим набор слов, одно из которых, возможно, хотел ввести пользователь. Очевидно, что эти слова должны быть похожими, близкими в каком‐то смысле к слову руква: вряд ли человек хотел напечатать локоть, а получилась руква.
Для измерения близости слов в лингвистике обычно используется расстояние Дамерау — Левенштейна (названное в честь американского лингвиста и российского математика). Это расстояние равно минимальному числу «шагов», необходимых для превращения одного слова в другое. Такими шагами являются типовые, стандартные ошибки при наборе текста: замена одной буквы на другую, добавление или удаление буквы, перестановка соседних букв.
Например, расстояние между словами собака и кошка равно 3: замена с на к (получится кобака); замена б на ш (кошака); удаление первой а (кошка). Есть и другой путь длины 3: собака → соака → сошка → кошка. Но осуществить превращение меньше чем за 3 шага не удастся.
Такое расстояние между словами обладает всеми привычными свойствами расстояния между точками на плоскости: неотрицательность, симметричность (расстояние от собака до кошка равно расстоянию от кошка до собака), справедливо неравенство треугольника. Теперь можно формализовать ощущение, что слово руква легко получается из слова рука, но не из слова локоть: расстояние Дамерау — Левенштейна от рука до руква равно 1, а от локоть до руква — 5.
Опечаток в одном слове обычно немного, чаще всего одна. Найдём в словаре все слова, которые отстоят от подозрительного слова руква на расстояние 1. Слов‐кандидатов не так много: рука (удаление в), рукав (перестановка а и в), буква (замена р на б) и рукава (добавление а). На этом можно остановиться и предложить пользователю список кандидатов — пусть выбирает сам. Именно так работает, например, проверка орфографии в Microsoft Word.
Но компьютер может пойти дальше и попробовать исправить опечатку, т. е. выбрать самого вероятного кандидата и предложить его пользователю (так поступает Google Docs), а может и сам подставить его в предложение (так обычно работают модули в смартфонах, «помогающие» набирать текст). Этот выбор единственного кандидата — следующий этап алгоритма, который можно реализовывать по‐разному.
Простейшее, но неплохо работающее решение — выбрать самое частотное слово. Частоты слов‐кандидатов в корпусе таковы: рука — 350 883, рукава — 126 817, буква — 107 262, рукав — 66 094. Как видно, в примере Его руква немного болит такой автоматический выбор совпадает с человеческим.
А вот во фразах
Здесь написана неправильная руква
У меня руква порвался
простейшее решение — заменить руква на рука — будет ошибочным. Чтобы алгоритм работал более «разумно», надо каким‐то образом учитывать слова в контексте фразы. И здесь на помощь снова приходят марковские цепи.
Воспользуемся идеей, которая применялась в анализе по буквам, и попробуем предсказать следующее слово по последнему из виденных. Например, слово неправильная встречается в корпусе 50 267 раз; пары неправильная рукава и неправильная рукав в корпусе отсутствуют, неправильная рука встречается 4 раза, неправильная буква — 53 раза. На примере фразы Здесь написана неправильная руква видно, что метод выбора самой частотной пары соседних слов более эффективный, чем простейший алгоритм.
Дальнейшее улучшение алгоритма состоит в том, что учитываются и слово, идущее перед подозрительным словом, и слово, идущее после него. Определяются частоты обеих пар, найденные вероятности перемножаются. На примере фразы У меня руква порвался даже без статистических данных видно, что после сравнения произведений вероятностей пар выбор наибольшего выглядит достоверным решением:
(меня рука) · (рука порвался);
(меня рукава) · (рукава порвался);
(меня буква) · (буква порвался);
(меня рукав) · (рукав порвался).
Получается хорошо работающее исправление опечаток.
Разумеется, и этот алгоритм можно и нужно совершенствовать. Во‐первых, вероятности одношаговых опечаток отличаются: например, перестановка соседних букв в слове значительно вероятнее, чем замена буквы на удалённую от неё на клавиатуре (скажем, заменить б на р не так‐то просто). Во‐вторых, можно встретиться с правильным, имеющим смысл словосочетанием, которое отсутствует в корпусе, и тогда произведение вероятностей будет равно нулю (пример: словосочетание работающее исправление, которое мы использовали в конце предыдущего абзаца, в корпусе пока отсутствует). В‐третьих, рассмотренный вариант марковской цепи связывает слово только с ближайшими соседями, хотя в языке встречаются зависимости и на далёких расстояниях. Например, во фразе Руква у рубашки, которую Вася купил в аэропорту, оказались слишком короткими, выбирая на замену рукав или рукава, придётся опираться не на соседние, а на далёкие слова оказались и короткими. В‐четвёртых, сделав опечатки, можно получить фразу со словами из словаря, но ошибочную: например, У меня лукав порвался. Алгоритм такую фразу ни в чём не заподозрит. Впрочем, усложнение алгоритма позволяет справиться с подобными затруднениями.
Компьютерная лингвистика. Лингвистические корпуса — фундамент компьютерной лингвистики, неисчерпаемый источник сведений о языке. Их анализируют и профессионалы — лингвисты и компьютерные специалисты, и начинающие исследователи. Даже школьник может самостоятельно написать программу для поиска и проверки закономерностей в языковых массивах.
Самый известный ресурс для русского языка — это Национальный корпус русского языка (НКРЯ), в основной части которого содержится 283 миллиона слов, а всего — около 600 миллионов слов. Корпус Araneum Russicum Maximum, объёмом 16 миллиардов слов, мы использовали для определения частоты слов при исправлении опечаток. Он состоит из текстов, собранных из интернета, а это очень важный способ создания современных лингвистических ресурсов: ведь в сети лежит множество доступных текстов. К сожалению, эти корпуса нельзя сохранить на своём компьютере, и возможности пользователя ограничены веб‐интерфейсом. На помощь приходят другие источники: так, определение языка проводилось на основе свободно распространяемых корпусов из проекта Universal Dependencies, где в едином формате представлены данные 70 языков.
Понятно, что частота отдельных слов и их сочетаний существенно зависит от набора текстов, включённых в корпус. У корпуса художественных текстов и корпуса текстов новостных — разный «словарный запас». Универсального, правильного корпуса для языка не существует, но надо научиться даже из отдельных, так или иначе «окрашенных» корпусов извлекать общие свойства, черты, особенности данного языка. Это желание вызывает в памяти восклицание основателя палеонтологии Жоржа Кювье: «Дайте мне одну кость, и я восстановлю животное!». По сути — это те задачи, из которых и родилась математическая статистика: как получить представление о ненаблюдаемом целом по некоторой выборке. И для их решения были созданы методы, более продвинутые, чем простой подсчёт частот.
Один из приёмов — усреднение, согласование значений частот по разным фрагментам корпуса, чтобы уменьшить влияние отдельных текстов. Например, частотность слова якорь в текстах НКРЯ, распределённых по десятилетиям, с 1970 года до наших дней, выглядит странно: 1970‐е — встречается 160 раз на миллион; 1980‐е — 6,8; 1990‐е — 8,4; 2000‐е — 6,6; 2010‐е — 6,7. Причина аномалии — включённая в НКРЯ «Книга о якорях», изданная в 1973 году. В ней одной слово якорь встречается 1769 раз, а во всём корпусе — только 2896. Полученная простым подсчётом частотность слова якорь по всему массиву — 21,9 на миллион — явно завышенная. Но если упорядочить значения частот по десятилетиям и взять число из середины списка (медиану), то получится более реальный результат: 6,8 на миллион. Можно учитывать и дисперсию, т. е. оценивать разбросанность значений: как часто и на сколько они отклоняются от среднего значения. Такой метод применял ещё А. А. Марков, работая с текстом «Евгения Онегина»: он проверял устойчивость, независимость своих результатов от способов подсчёта. Более сложные методы используются для предсказания «настоящих», истинных частот сочетаний слов: надо уметь отличать те, что в корпусе не встретились, но в принципе вполне возможны, от тех, что не встретились, потому что практически невозможны.
В заключение отметим, что автоматическая обработка языка начала активно развиваться в 1950‐е годы. В частности, первое время машинный перевод основывался на созданных вручную правилах, предписывавших, как именно переводить то или иное словосочетание при определённых условиях. Постепенно выяснилось, что сочинение правил требует огромных затрат человеческого труда, а работают они всё равно плохо.
Поэтому в конце 1980‐х годов на первый план в автоматической обработке естественного языка вышел статистический подход: посмотрим, как похожие задачи решались до нас человеком, и найдём решение, комбинируя его из готовых частей. Это стало возможным после появления лингвистических корпусов. Методы, рассмотренные нами на примерах, прежде всего частотность букв, слов и сочетаний, стали основой решения задач компьютерной лингвистики, перечисленных в начале статьи. Интересно, но временами создаётся впечатление, что алгоритмы и программы, основанные на статистическом подходе, в какой‐то мере освоили язык.
Например, эффективность применения марковских цепей неявно связана с грамматикой и структурой языка. В примере со словосочетанием Математическая составляющая при выборе одного из трёх языков помогла, в частности, высокая частотность сочетания ая в русском языке. Дело в том, что в русском языке в женском роде встречается окончание ‐ая, причём часто, а в болгарском и украинском в такой форме было бы просто ‐а.
В XXI веке математика предложила новые подходы к автоматической обработке языка. Бурное развитие искусственных нейронных сетей, обучаемых на огромных массивах входных данных, дало возможность решать самые разные задачи компьютерной лингвистики. А принципы работы нейронных сетей ещё больше приближают компьютер к тому, что можно назвать пониманием естественных языков. На данном этапе компьютерная лингвистика всё больше превращается в одну из разновидностей машинного обучения. Но если мы хотим разобраться с тем, что же происходит при обработке текстов искусственными нейронными сетями, нужен именно лингвистический взгляд. Лингвистика как наука необходима и для более полного использования возможностей уже существующих инструментов, и для построения новых математических моделей.
Из книги «Математическая составляющая» (М.: Математические этюды, 2019).