|
Программирование >> Рекурсивные объекты и фрактальные узоры
Думаю, каждый хотя бы раз сталкивался с этим жутковатым способом записи русских слов с помощью символов латиницы. Надеюсь, со временем необходимость печатать латиницей русскоязычные тексты полностью исчезнет, но пока что существуют устройства, не позволяющие печатать кириллицей (либо установить соответствующее программное обеспечение по каким-либо причинам нельзя); встречаются также системы, кириллицу не отображающие. Таким образом, транслит жив и в ближайшем будущем никуда не денется. Учитывая это, я предлагаю написать программу, выполняющую прямую и обратную транслитерацию текстов на русском языке. Прямая транслитерация - это запись русскоязычного документа с помощью латинских букв ( Иван ушел домой -> Ivan ushel domoy ). Обратите внимание, что большинству русских букв обычгю соответствует одна буква латинского алфавита ( р -> г , д -> d ), но некоторым буквам может соответствовать несколько латинских символов ( ш -♦ sh , ю -> уи ), а иным и ни одного (твёрдый знак). Обратная транслитерация - это перевод транслитерированного текста в обычную запись юфиллическим шрифтом. Здесь есть свои сложности. По идее, конечно, последовательная транслитерация и обратная транслитерация некоторого текста не должна вносить в него никаких изменений ( Иван -> Ivan -> Иван ), но на практике достичь этого результата непросто. Например, слово шкаф будет записано латиницей как shkaf*, а слово схема - как shema . Как теперь процедура обратной транслитерации может догадаться, что в первом случае сочетание sh требуется преобразовать в ш , а во втором - в сх ? Можно попытаться выкрутиться, кодируя X не буквой h, а сочетанием kh , но по существу это ничего не меняет. В кириллическом алфавите букв больше, чем в латинском, поэтому какие-то различные русские буквы неизбежно будут переданы одними и еми же латинскими символами. Не забывайте, к тому же, что результирующий текст должен быть ещё и читабельным. 8.5. АББРЕВИАТОР, ИЛИ КАК ПРАВИЛЬНО ПРОИЗНЕСТИ КД-ПЗУ ? В мире уже давно ведутся разработки систем синтеза речи (text-to-speech engines). Хотя существуют и коммерческие продукты, на мой взгляд, они ещё далеки от идеала (особенно если речь идёт о русском языке). Аббреви-атор - это один из модулей такой системы. Чтобы произнести любое слово, надо уметь определять его транскрипцию, то есть переводить буквы и буквосочетания в звуки, которые можно записать, например, с помощью символов транскрипции IPA (International Phonetic Alphabet). Если для обычных слов эта процедура как-то работает, то для аббревиатур требуется отдельный подход. В частности, аббревиатура может произноситься по буквам (МГУ, СПбГУ), чего никогда не требуется для слов, не являющихся аббревиатурами. Конечно, можно написать отдельный алгоритм перевода аббревиатур непосредственно в звуки, но проще воспользоваться уже готовой процедурой транскрибирования обьшных слов, скормив ей слово, полученное из аббревиатуры: МИФИ - мифи СПбГУ эспэбэгэу Для преобразования аббревиатур в произносимые слова и предназначен модуль аббревиатора. Так, ссылка http: myserver. ru/banner/bannerl. jpg соответствует третьему элементу списка и, следовательно, распознаётся как баннер. Работа с символами подстановки не так проста, как кажется на первый взгляд. Полноценный механизм распознавания соответствия строки шаблону требует использования перебора с возвратами. Рассмотрим простой (хотя и несколько искусстве1П1ЫЙ) пример. Требуется определить, соответствует ли строка аа Ыаа Ы Ь2 аа пшблону *Ы?Ь2*. Соответствие, конечно, существует, но как его определить? Простейший жадный апоритм найдёт сначала подстроку Ы, затем пропустит символ подчёркивания, соответствующий подстановочному знаку ?. Теперь в строке ожидается подстрока Ь2, но на входе окажется другая последовательность - аа Ы Ь2 аа. Чтобы соответствие всё-таки было найдено, алгоритму придётся начать поиск со второй подстроки Ы. Таким образом, мы приходим к перебору с возвратами. В этой задаче достаточно ограничиться жадной реализацией механизма распознавания символов подстановки (без возвратов). 8.4. ТРАНСЛИТЕРАЦИЯ DLYATEH, КТО NE MOZHET PISAT PO-RUSSKi Хочу ещё раз обратить ваше внимание на то, что слова мифи и эспэбэ-гэу не являются транскрипциями, так как не содержат описаний произносимых звуков. Они лишь представляют собой соответствующие аббревиатурам обычные слова, читаемые по правилам русского языка. Задача заключается в разработке такого аббревиатора. Попробуйте выявить правила, определяющие способ произношения аббревиатуры: как обычное слово или по буквам. I Гапримср, известно такое наблюдение: если первые две буквы аббревиатуры являются согласными, слово с высокой вероят!1остью произносится по буквам. Чем больше правил вы найдёте, тем лучше; хотя без списка исключений, наверное, всё равно пе обойтись. 8.6. ВЫРАВНИВАНИЕ ПО ШИРИНЕ. КРАСИВОЕ ФОРМАТИРОВАНИЕ ТЕКСТА Следующая задача относится к разряду классических. Её решение вы видите каждый раз, когда работаете с любым современным текстовым редактором. Дан текстовый файл с обычным для таких файлов форматированием: символ возврата каретки/перевода строки разделяет отдельные абзацы, в пределах же одного абзаца слова разделены пробелами. Для заданного числа N требуется сформировать выходной текстовый файл, в котором каждая строка будет содержать не более N символов, после чего записывается символ перевода строки (предполагается, что значите N достаточно велико, чтобы вместить хотя бы одно слово). Текст в итоговом файле должен быть выровнен по ширине. Пример входного файла: Мы постарались сделать наш продукт по возможности простым и удобным в использовании. При возникновении каких-либо затруднений обратитесь к справочной системе. Если же её содержимое Вас не удовлетворит, обратитесь в службу поддержки. Наши специалисты будут рады Вам помочь. * Пример выходного файла для N = 40: Мы постарались сделать наш продукт по возможности простым и удобным в использовании. При возникновении каких-либо затруднений обратитесь к справочной системе. Если же её содержимое Вас не удовлетворит, обратитесь в службу поддержки. Наши специалисты будут рады Вам помочь. Программа должна расставлять дополнительные пробелы между словами равномерно, но не совершенно одинаковым образом в каждой строке. К примеру, если в две подряд идущие строки требуется добавить по одному пробелу, не стоит производить добавление после первого слова каждой из строк. Равномерность должна сочетаться с некоторой случайностью при выборе позиций вставляемых пробелов, чтобы готовый текст выглядел красивее. 8.7. РАССТАНОВКА ПЕРЕНОСОВ Экскурс в правила русского языка Мы изучали перенос. Вот как слова я перенёс: <fEdea* я перенёс е-два . И получил за это Эво . Укол я перенёс 41у-кол И получил за это кол . Опяты> я перенёс <о-пять*. Теперь, наверно, будет - пять ?! А. Шибаев Расстановка переносов ~ ещё одна задача, возникающая при работе с текстами. Задача заключается в том, чтобы разработать алгоритм, автоматически расставляющий переносы в русских словах. С клавиатуры вводится слово, а компьютер выдаёт все возможные переносы в нём. Пример: телевизор -♦ те-ле-ви-зор. Подсказка При решении задачи следует руководствоваться правилами русской орфографии, официально утверждёнными ещё в 1956 году (их можно найти, например, на странице http: www. primavista. ru/pravila). Здесь я приведу то71ЬКо самые простые нормы, касающиеся расстановки переносов. Их реализация не должна вызвать у вас особых затруднений. § 117. При переносе слов нельзя ни оставлять в конце строки, ни переносить на другую строку часть слова, не составляющую слога; например, нельзя переносить просмо-тр, ст-рах. § 118. Нельзя отделять согласную от следующей за ней гласной. Неправильно: люб-овь, дяд-енька, реб-ята, паст-ух. ГЛАВА 9. РАЗЛИЧНЫЕ АЛГОРИТМЫ Правильно: лю-бовь, дя-денька и дядень-ка, па-стух и пас-тух. Примечание. Если после приставки стоит буква ы, то переносить часть слова, начинающуюся с ы, не разрешается. Неправильно: раз-ыскать. Правильно: ра-зыскать, разыс-кать. § 119. Кроме правил, изложенных в §§ 117 и 118, необходимо руководствоваться ещё следующими правилами: Нельзя отрывать буквы ь и ь от предшествующей согласной. Неправильно: под-ъезд, бол-ьшой, бул-ьон. Правильно: подъ-езд, боль-гиой, буль-он и бу-льон. Нельзя отрывать букву й от предшествующей гласной. Неправильно: во-йна, сто-йкий, фе-йерверк, ма-йор. Правильно: вой-на, стой-кий, фей-ерверк и фейер-верк, май-ор. Нельзя оставлять в конце строки или переносить на другую строку одну букву. Неправильно: а-кация, акаци-я. Правильно: ака-ция. Нельзя оставлять в конце строки или переносить в начало следующей две одинаковые согласные, стоящие между гласными. Неправильно: жу-жжать, ма-сса, ко-нный. Правильно: жуж-жать, мас-са, кон-ный.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |