Частотность слогов русского языка
Частотный анализ русского текста и облако слов на Python
Частотный анализ является одним из сравнительно простых методов обработки текста на естественном языке (NLP). Его результатом является список слов, наиболее часто встречающихся в тексте. Частотный анализ также позволяет получить представление о тематике и основных понятиях текста. Визуализировать его результаты удобно в виде «облака слов». Эта диаграмма содержит слова, размер шрифта которых отражает их популярность в тексте.
Обработку текста на естественном языке удобно производить с помощью Python, поскольку он является достаточно высокоуровневым инструментом программирования, имеет развитую инфраструктуру, хорошо зарекомендовал себя в сфере анализа данных и машинного обучения. Сообществом разработано несколько библиотек и фреймворков для решения задач NLP на Python. Мы в своей работе будем использовать интерактивный веб-инструмент для разработки python-скриптов Jupyter Notebook, библиотеку NLTK для анализа текста и библиотеку wordcloud для построения облака слов.
В сети представлено достаточно большое количество материала по теме анализа текста, но во многих статьях (в том числе русскоязычных) предлагается анализировать текст на английском языке. Анализ русского текста имеет некоторую специфику применения инструментария NLP. В качестве примера рассмотрим частотный анализ текста повести «Метель» А. С. Пушкина.
Проведение частотного анализа можно условно разделить на несколько этапов:
Загрузка данных
Открываем файл с помощью встроенной функции open, указываем режим чтения и кодировку. Читаем всё содержимое файла, в результате получаем строку text:
Длину текста – количество символов – можно получить стандартной функцией len:
Строка в python может быть представлена как список символов, поэтому для работы со строками также возможны операции доступа по индексам и получения срезов. Например, для просмотра первых 300 символов текста достаточно выполнить команду:
Предварительная обработка (препроцессинг) текста
Для проведения частотного анализа и определения тематики текста рекомендуется выполнить очистку текста от знаков пунктуации, лишних пробельных символов и цифр. Сделать это можно различными способами – с помощью встроенных функций работы со строками, с помощью регулярных выражений, с помощью операций обработки списков или другим способом.
Для начала переведём символы в единый регистр, например, нижний:
Используем стандартный набор символов пунктуации из модуля string:
string.punctuation представляет собой строку. Набор специальных символов, которые будут удалены из текста может быть расширен. Необходимо проанализировать исходный текст и выявить символы, которые следует удалить. Добавим к знакам пунктуации символы переноса строки, табуляции и другие символы, которые встречаются в нашем исходном тексте (например, символ с кодом \xa0):
Для удаления символов используем поэлементную обработку строки – разделим исходную строку text на символы, оставим только символы, не входящие в набор spec_chars и снова объединим список символов в строку:
Можно объявить простую функцию, которая удаляет указанный набор символов из исходного текста:
Её можно использовать как для удаления спец.символов, так и для удаления цифр из исходного текста:
Токенизация текста
Для последующей обработки очищенный текст необходимо разбить на составные части – токены. В анализе текста на естественном языке применяется разбиение на символы, слова и предложения. Процесс разбиения называется токенизация. Для нашей задачи частотного анализа необходимо разбить текст на слова. Для этого можно использовать готовый метод библиотеки NLTK:
Переменная text_tokens представляет собой список слов (токенов). Для вычисления количества слов в предобработанном тексте можно получить длину списка токенов:
Для вывода первых 10 слов воспользуемся операцией среза:
Для применения инструментов частотного анализа библиотеки NLTK необходимо список токенов преобразовать к классу Text, который входит в эту библиотеку:
Выведем тип переменной text:
К переменной этого типа также применимы операции среза. Например, это действие выведет 10 первых токенов из текста:
Подсчёт статистики встречаемости слов в тексте
Для подсчёта статистики распределения частот слов в тексте применяется класс FreqDist (frequency distributions):
Попытка вывести переменную fdist отобразит словарь, содержащий токены и их частоты – количество раз, которые эти слова встречаются в тексте:
Также можно воспользоваться методом most_common для получения списка кортежей с наиболее часто встречающимися токенами:
Частота распределения слов тексте может быть визуализирована с помощью графика. Класс FreqDist содержит встроенный метод plot для построения такого графика. Необходимо указать количество токенов, частоты которых будут показаны на графике. С параметром cumulative=False график иллюстрирует закон Ципфа: если все слова достаточно длинного текста упорядочить по убыванию частоты их использования, то частота n-го слова в таком списке окажется приблизительно обратно пропорциональной его порядковому номеру n.
Можно заметить, что в данный момент наибольшие частоты имеют союзы, предлоги и другие служебные части речи, не несущие смысловой нагрузки, а только выражающие семантико-синтаксические отношения между словами. Для того, чтобы результаты частотного анализа отражали тематику текста, необходимо удалить эти слова из текста.
Удаление стоп-слов
К стоп-словам (или шумовым словам), как правило, относят предлоги, союзы, междометия, частицы и другие части речи, которые часто встречаются в тексте, являются служебными и не несут смысловой нагрузки – являются избыточными.
Библиотека NLTK содержит готовые списки стоп-слов для различных языков. Получим список сто-слов для русского языка:
Следует отметить, что стоп-слова являются контекстно зависимыми – для текстов различной тематики стоп-слова могут отличаться. Как и в случае со спец.символами, необходимо проанализировать исходный текст и выявить стоп-слова, которые не вошли в типовой набор.
Список стоп-слов может быть расширен с помощью стандартного метода extend:
После удаления стоп-слов частота распределения токенов в тексте выглядит следующим образом:
Как видно, результаты частотного анализа стали более информативными и точнее стали отражать основную тематику текста. Однако, мы видим в результатах такие токены, как «владимир» и «владимира», которые являются, по сути, одним словом, но в разных формах. Для исправления этой ситуации необходимо слова исходного текста привести к их основам или изначальной форме – провести стемминг или лемматизацию.
Визуализация популярности слов в виде облака
В завершение нашей работы визуализируем результаты частотного анализа текста в виде «облака слов».
Для этого нам потребуются библиотеки wordcloud и matplotlib:
Для построения облака слов на вход методу необходимо передать строку. Для преобразования списка токенов после предобработки и удаления стоп-слов воспользуемся методом join, указав в качестве разделителя пробел:
Выполним вызов метода построения облака:
В результате получаем такое «облако слов» для нашего текста:
Глядя на него, можно получить общее представление о тематике и главных персонажах произведения.
Для чего нужны частотные словари и почему одни слова важнее других?
Компьютеры стали активно использоваться в лингвистике только в последней четверти XX века. До того ученые, которые изучали язык, по большей части занимались описанием грамматических правил и значений слов, не опираясь на количественные данные. Но когда появилась возможность обрабатывать большие массивы текстов, стало ясно, что мы многое теряем, если не различаем частотные и редкие явления. О том, какую пользу могут принести исследования частотности в языке, специально для «Ножа» рассказывает Александр Пиперски — доцент РГГУ, научный сотрудник НИУ ВШЭ, лауреат премии «Просветитель»–2017.
Заглонитель и турмы
Попробуйте прочитать такой текст на русском языке:
Заглонитель Ланс Оливер чуть не погиб в результате наплочения турма. Он ехал ласкунно на лошади покровнательно от Мэнсфилда (Австралия) и увидел вахню турмов, в которой было кастожно 15 животных. Столенно, ничего бы и не случилось, если бы собака Оливера не начала порочить на вахню.
Один из турмов — старый, крупный лователь, выбатушенный корочением собаки, бросился за ней. Та отпешила скумановаться за лошадью, на которой сидел Оливер. Тогда турм бросился уже на Оливера. Он схватил подвешенца отмаленными твинами за плечи и вытокнул его на землю.
Цитируется по: Р. М. Фрумкина. Психолингвистика. М., 2001
Вы встретили множество незнакомых слов, но нет сомнений, что вы в целом поняли, о чем здесь говорится, и даже можете пересказать содержание. А сконструирован этот текст очень простым способом: взят нормальный текст, но сохранены в нем только самые частотные слова, а все редкие заменены вымышленными. Вот оригинал этой истории:
Скотовод Ланс Оливер чуть не погиб в результате нападения кенгуру. Он ехал верхом на лошади неподалеку от Мэнсфилда (Австралия) и увидел стадо кенгуру, в котором было примерно 15 животных. Возможно, ничего бы и не случилось, если бы собака Оливера не начала лаять на стадо.
Один из кенгуру — старый крупный самец, раздраженный лаем собаки, бросился за ней. Та попыталась укрыться за лошадью, на которой сидел Оливер. Тогда кенгуру бросился уже на Оливера. Он схватил всадника передними лапами за плечи и сбросил его на землю.
Получается, для того, чтобы понимать человеческий язык, достаточно неполных знаний. Более того, полных знаний и не бывает: никто из нас не может знать все слова и гарантировать, что поймет от начала и до конца любое встретившееся ему предложение.
«и», «в», «не», «на»: частотный словарь
Представьте себе, что вы изучаете русский язык и хотите узнать: сколько слов надо выучить, чтобы понимать 20 % текста на этом языке? Ну или не понимать, а хотя бы опознавать 20 % слов в тексте.
Очевидно, что полезно сперва учить частотные слова, а потом уже редкие: знать слово «собака» куда важнее, чем «самец» или «всадник», и уж тем более, чем «вольвокс» или «рейсфедер».
Самый популярный частотный словарь для русского языка в 2009 году создали Ольга Ляшевская и Сергей Шаров. Он свободно доступен на сайте Института русского языка им. В. В. Виноградова. Первое по частотности русское слово — это слово «и», за ним следуют «в», «не», «на», «я» и т. д. — вот и будем запоминать их подряд по этому списку:
Вернемся к предложению, в котором мы поставили перед собой задачу:
Представьте себе, что вы изучаете русский язык и хотите узнать: сколько слов надо выучить, чтобы понимать 20 % текста на этом языке?
В нем 20 слов, а значит, 20 % от них — это 4 слова. А теперь присмотритесь внимательно: оказывается, выучив первые 14 слов из частотного словаря, мы и узнаем в этом тексте 4 слова — «что», «и», «на» и «этом». Желанный результат достигнут: 20 % текста поняты (хотя до смысла, конечно, еще очень далеко).
В частотном словаре каждому слову приписано число, которое показывает, сколько раз это слово встретится, если мы возьмем текст длиной 1 миллион слов. Слово «и» мы в таком тексте увидим примерно 35 802 раза, слово «в» — 31 374 раза и т. д. Если сложить частоты первых 14 слов, то окажется, что они покроют 188 072 слова из миллиона — то есть почти те самые 20 %, к которым мы стремились. Чтобы выйти за 200 000, к ним надо добавить еще три слова («к», «но» и «они»). А чтобы понять 10 % текста, достаточно и вовсе 4 слов.
Вот полные списки слов, которых хватит, чтобы понять 10 %, 20 %, 30 % и 40 % текста на русском языке:
Видно, что на первые 10 % у иностранца уйдет совсем мало усилий. На следующие 10 % понадобится еще 13 слов; чтобы достигнуть 30-процентного понимания, придется добавить 29 слов, а чтобы добраться до 40 % — 86 слов. Чем дальше мы идем по частотному списку, тем менее полезно нам каждое следующее слово:
Иначе говоря, в любом языке есть совсем немного высокочастотных слов и много низкочастотных. Например, 1 раз на миллион слов, согласно словарю Ляшевской и Шарова, встретится 1478 слов; среди них — «резвость», «увильнуть», «боезапас», «сызнова», «картографирование». Ясно, что это совсем не то, что надо учить в первую очередь.
Слова, города и всё на свете: закон Ципфа
Частоты слов подчиняются простой математической закономерности, которую в середине XX века открыл американец Джордж Кингсли Ципф (1902–1950).
Источник
Он сформулировал такую зависимость, которая получила название «закон Ципфа»: частотность слова обратно пропорциональна номеру слова в частотном списке. Например, если первое слово имеет частотность 60 000, то у второго слова будет частотность 60 000 / 2 = 30 000, у третьего — 60 000 / 3 = 20 000 и т. д. В реальном языке всё не получается так красиво: например, русский частотный словарь укладывался бы в закон Ципфа гораздо лучше, если бы у слова «и» частотность была не 35 802, а как раз около 60 000, тем не менее даже это приближение неплохо работает. Если изобразить распределение частот для первых 200 русских слов на графике, видно, что оно имеет форму гиперболы.
Закон Ципфа — один из редких примеров закона, который был открыт на материале языка, а потом нашел применение во множестве других областей.
Ему подчиняются размеры населенных пунктов, количество ссылок на сайты, размеры компаний: в стране обычно есть совсем немного крупных городов и много-много мелких населенных пунктов; есть небольшое количество очень важных сайтов, на которые все ссылаются, и много сайтов, на которые не ссылается никто или почти никто; бывают гигантские компании, но мелких гораздо больше.
Например, в Берлине 3,5 млн жителей; во втором по величине городе Германии — Гамбурге — примерно в два раза меньше: 1,8 млн. В шестом городе страны — Штутгарте — примерно в шесть раз меньше: 600 тысяч, и т. д. Видно, что на этих данных закон Ципфа работает превосходно.
Когда пытаются понять, написан ли какой-то текст на человеческом языке или нет, одна из первых проверок, которые стоит сделать, — посмотреть, подчиняется ли текст закону Ципфа.
Например, в загадочном манускрипте Войнича закон Ципфа соблюден довольно неплохо. Правда, это только необходимое условие, но еще не доказательство того, что перед нами естественный язык: именно потому, что закон Ципфа применим почти к чему угодно, в том числе и к неязыковым данным.
Зачем нужны частоты
Частотный словарь может быть полезен на практике для изучающих иностранный язык: конечно, не стоит заставлять человека, когда он узнает новое слово, выяснять точно, какое именно место в частотном списке оно занимает, но можно дать ему представление о том, стоит ли вообще это слово запоминать. Например, в словарях издательства Macmillan есть два типа слов: красные и чёрные, причём у красных слов стоят еще звездочки — одна, две или три. Вот несколько примеров:
Красные слова с тремя звездочками занимают в частотном словаре места с 1-го по 2500-е, слова с двумя звездочками — с 2501-го по 5000-е, а слова с одной звездочкой — с 5001-го по 7500-е. Черные слова располагаются ниже 7500-го места. Для пользователя это имеет очень простые следствия. Если ты ищешь в словаре слово и видишь при нем три звездочки, выучи его обязательно: оно наверняка попадется еще много раз. Если при слове только одна звездочка, это достаточно полезное слово, но часто не пригодится. И, наконец, черные слова — совсем редкие; их стоит заучивать, только если стремишься выучить язык на продвинутом уровне, но если не получится, то ничего страшного. Можно прекрасно говорить по-английски, не зная, что thatch значит «соломенная крыша», а crescent — «полумесяц»; без слов restriction «ограничение» и allegedly «якобы» тоже можно прожить, а вот слова animal «животное» и play «играть» точно надо знать.
Еще одна важная область, в которой применяется частотный анализ, — это автоматическая обработка текста (natural language processing). Например, для проверки орфографии и исправления опечаток очень важно понимать, какие слова редкие, а какие — частотные. Предположим, что пользователь напечатал такую английскую фразу:
I am looking at teh black dog.
Мы прекрасно понимаем, что в ней содержится опечатка: вместо teh должно быть написано the. Но ведь teh могло легко получиться и из чего-нибудь другого: что если пользователь хотел ввести ten, но случайно попал в букву h вместо n? Или, может быть, он хотел напечатать tech, но пропустил букву c? Почему же мы всё-таки полагаем, что имелось в виду слово the, в котором переставились две буквы? Можно, конечно, долго рассуждать о том, что с ten и с tech получится неправильное предложение (например, ten black dog — плохое сочетание слов, а должно быть ten black dogs), но это знание трудно формализовать и вложить в компьютер. Но можно поступить проще: заглянем в частотный словарь, и он сообщит нам, что the — самое популярное английское слово, так что вероятность того, что пользователь хотел напечатать именно его, особенно велика. Эта стратегия — всегда исправляй опечатку на самое частотное из похожих слов — может показаться примитивной, но она неплохо работает.
В 2007 году директор по исследованиям компании Google Питер Норвиг за несколько часов, проведе–нных в самолете (даже без интернета!), написал программу для исправления опечаток, которая занимает всего 22 строки кода на языке Python и в первую очередь опирается на частотность.
Всё это свидетельствует об одном: человеческий язык не описывается только грамматическими правилами. Важно знать, как часто встречаются в нем те или иные слова. К счастью, такие знания благодаря компьютерам можно очень легко получить, и это открывает для лингвистики новые перспективы.
Подтверждение
Umeko, какая разница, зачем. Я вопрос задала и жду ответа, а не ответного вопроса х))
Это же кружок любознательных. Вот на этот вопрос мне любопытно знать ответ. В интернете не нашла, задала здесь. Должны быть люди, которые когда-то брались считать количество слогов в русском) А кто-то может знать результат.
, вы ещё трёхбуквенные слоги учитывать хотите? тогда подсчитайте их количество, их же меньше)
Наверняка ведь не посчитают слог «взбздну», над которым помрет 99/100 китайцев.
[Мей], я все хочу. У нас не только трехбуквенные в наличии) У нас от одной до семи букв в слоге может быть. Я честно признаю, что не знаю русский язык в подобной степени)
SilentTwilight, спасибо) Это очень подходит)
Umeko, наверняка. Я, например, имею весьма смутное представление о том, что оно означает)
Но можно же, наверное, написать какую-то программу, способную, скажем, словарь Даля (есть же электронные версии, ну!), переварить, поразбивать на слоги и посчитать их.
, попробуйте пересчитать матерные слова. их в русском языке всего четыре. а теперь попробуйте посчитать производные и таки смиритесь.
Константин Когут
Р. И. Аванесов разработал сонорную теорию слога русского языка, которая объясняет две важных вещи: что такое слог и как правильно разделить слово на фонетические слоги. Начнем с первого.
Слог, по Аванесову, это совокупность разных по степени сонорности звуков. Любой слог — это переход от менее сонорных к более сонорным звукам. Самый звучный — такой звук, который является вершиной слога. Уровни звучности обозначаются следующим образом:
Получается, что любое русское слово можно представить схематически. Отметим каждый звук точкой на шкале от 0 до 4 и затем соединим получившиеся точки. Помним, что цифрами мы обозначаем именно характер звука, а не буквы, поэтому опираемся не на графическую запись слова, а на его транскрипцию, которую предварительно следует составить.
Каждый слог — это волна сонорности. Количество слогов равно количеству вершин сонорности. В данном примере таких вершин у нас три, значит в слове три слога. Но теория Аванесова позволяет не только верно определить количество слогов, но и не ошибиться с их границей. Главный ее постулат гласит: слог в русском языке строится по закону восходящей звучности — от наименее звучного звука к наиболее звучному, то есть слоговому. Из этой теории есть следующие следствия:
Последние два пункта требуют объяснения. Почему именно так? Дело в том, что в каждом из них рядом оказываются звуки, близость которых нарушает слоговую теорию восходящей звучности.
Например, сочетание сонорного и шумного согласного звука в переводе на цифровой индекс выглядело бы следующие образом: 3 (сонорный) и 2 или 1 (шумный). А внутри слога невозможно понижение, поэтому их необходимо разделить на разные слоги для возрастания звучности в последующем. То есть до гласного звучность должна только нарастать, а падать в других местах.
В случае же сочетания [u̯] и любого согласного у нас вновь то же самое нарушение, которое требует разделения этих двух звуков на разные слоги. Индексы: 3,5 (у [u̯] более высокий индекс, чем у остальных сонорных) и 1, 2 или 3 (любой согласный).
Удивительно, как эта теория может описывать даже самые малые нюансы произнесения слов. Например, слово лбы. При произнесении этого слова мы вынуждены немного приглушать сонорный [л] до индекса последующего шумного согласного звука, иначе получится, что в слове два слога, а не один. И действительно, сравните звучание [л] в словах лира и лбы.
Именно из-за слоговой теории можно услышать скандирование [ша́u̯-бу] Шайбу!, а не *[ша́-u̯бу].
Еще один пример. Слово карман будет делиться на два слога и граница следующая: [кα-рма́н].
Наконец, нужно помнить о том, что фонетические слоги часто не совпадают с морфемным строением слова и правилам переноса.