|
Стихи 2
|
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Теперь повнимательнее на механизм поиска. Функции TStrings - предназначенные для работы массивами строк - видимо, осуществляют последовательный анализ строк. Переход от строки к следующей, естественно, должен осуществляться группой соответствующих команд. Вот на этом можно сэкономить, рассматривая совокупность всех строк как единую строку. Тогда для этого можно будет использовать стандартную функцию поиска группы символов в строке - Pos. Но у этой быстро работающей функции есть особенность, которая может существенно замедлить поиск. Эта функция обязательно просматривает всю строку словаря, прежде чем сказать "Запрашиваемое слово не найдено". Значит нужно распределить данные словаря так, чтобы время поиска было оптимальным. Поэтому словарь ударений был проанализирован на суммарную длину всех слов, начинающихся на разные буквы.
п=82027 с=55647 в=38685 о=33367 н=29554 б=28030 з=27259 р=26090 к=25719 д=19292 м=18550 т=16337 г=15864 у=15858 л=11811 и=10882 ч=06925 х=05778 а=05771 ж=05231 ш=04850 ц=02933 е=02241 я=01814 ф=01793 э=01224 щ=00742 ю=00499 ё=00141 й=00044
Слева от знака "=" дан первый символ слова, слева - суммарная длина всех слов, начинающихся на этот символ.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
На основе статданных можно составить классификационную таблицу распределения данных словаря ударений по группам равного объёма.
1=п 2=с,в 3=о,н,б 4=з,р,к 5=д,м,т,г,у 6=л,и,ч,х,а,ж,ш,ц,е,я,ф,э,щ,ю,ё,й
Вот такое достаточно простое распределение по шести строкам и использование функции поиска Pos привело к ускорению поиска в словаре ударений, думаю, почти на порядок. По крайней мере, время поиска слов-рифм стало комфортным.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Теперь несколько слов по управлению работой текстового редактора. То есть, редактора, на котором, собственно и предполагается создание стихотворений. В этом редакторе должна формироваться "гребёнка" ударений и помечаться ударные слоги. Два слова о выборе символов, из которых формируется гребёнка или шкала - scale. Желательно, чтобы при выбранном шрифте редактора, ширины выбранных знаков были бы (1) достаточно очевидны для восприятия и (2) имели бы практически равную ширину. Условие (2) связано с тем, чтобы начала строк стихотворения были бы зрительно выравнены по вертикали. Экспериментально были подобраны следующие символы - (1) "^" - символ ударного слога, (2) "*" - символ безударного слога, (3) "_" - символ заполнитель гребёнки до фиксированного размера.
**^**^**^*____ Закружилась листва золотая **^**^**^_____ В розоватой воде на пруду, ^*^**^**^*____ Словно бабочек легкая стая **^**^**^_____ С замираньем летит на звезду.
Очевидно, для анализа текста необходим эффективный блок выделения из текста лексем. Формирование "гребёнчатого" текста состоит из (1) выделения в тексте лексем, (2) получение данных из словаря ударений, (3) формирование гребёнки и (4) формирование строки-разметки текста, то есть, строки, в которой указывалось бы положение ударных слогов.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Перед как перейти к следующему этапу приведу пример гребёнчатой строки текстового редактора и соответствующей строки разметки.
**^**^***_____ Что луна там огромней в сто раз, **^**^***_____ чт~ л~н` т~м ~гр`мн~й в ст~ р~з,
Символ "`" - это символ ударной гласной, а символ "~" - безударной гласной. Символ безударной гласной - это некоторый "атавизм", который был связан с использованием цвета при разметке текста стихотворения, где синий цвет обозначал безударную гласную, а красный - ударную.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
И ещё одно замечание по технике программирования, хотя я прекрасно понимаю, что это почти неверятно, что кто-то попытается воспользоваться этим - но мало ли ... Поскольку передо мной встала во весь рост проблема разработки максимально быстрых механизмов, то пришлось ещё раз внимательно взглянуть буквально на каждую "мелочь". Что же это за мелочи? Об одной из них я говорил ранее - это отказ, естественно, там где это обосновано, от удобных механизмов, предлагаемых языками не самого низкого уровня - в моём случаев от языка Delphi. Использование максимально простых структур. Например, в своё время я полностью отказался от байта как хранилища чисел типа integer, потому что очень часто сталкивался с "обрезанием" информации. Та же самая проблема была с использованием так называемых коротких строк - shortstring. Короткие строки могут вместить не более 255 символов, в то время когда строки типа string могут вместить просто уйму информации - точно не помню, но очень много ... мегабайты или там гигабайты ... А оказалось при универсальности и безопасности использования типов данных longint и string - это весьма громоздкие и "неповоротливые" структуры. И это просто чувствуется, когда идёт замена - там, где это возможно - longint на byte и string на shortstring. И ещё оно замечание из той же области. Обычно считается хорошим тоном оформлять как процедуры или функции логически обособленные алгоритмы. Так вот, оказывается, что это весьма громоздко - вызывать функцию или процедуру, передавать ей параметры, потом принимать и анализировать полученные данные.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
И раз уж речь пошла об эффективности методов программирования, то теперь можно, наверное, сказать следующее. Видимо, не существует просто эффективности как таковой. Наверное, нужно рассматривать эффективность в какой-либо плоскости, с какой-либо точки зрения. Языки программирования высокого уровня, видимо, эффективны с точки зрения трудозатрат при создании программ. То есть, они позволяют быстро создавать программы выполняющие задуманное, но их эффективность может быть сравнима с КПД паровоза. На языках низкого уровня - например, ассемблере - программы создавать весьма долго и требуются большие усилия по проверке работопригодности программы в различных ситуациях. И если уж программа всё-таки разработана, то она работает как автомат Калашникова. Но при всей высокой эффективности программ, разработанных на низком уровне, попробовав программировать на высоком уровне не хочется переходить (возвращаться) к работе на низком уровне. И вот здесь намечается компромиссный, смешанный путь - это путь использования низкоуровневых методов в программах высокого уровня. О чём, собственно, идёт речь? Может быть, кто-то когда-нибудь программировал на ассемблере и помнит, что там есть высоко эффективная команда TRT -translate & test. Это команда работает следующим образом - (1) каждый символ рассматривается как целое число (2) по значению этого числа из 256-байтной таблицы выбирается соответствующий элемент таблицы и (3) и предоставляется возможность сразу же проанализировать результат этой выборки. Вот этим методом низкого уровня я и воспользовался для разработки, по-моему, достаточно эффективного анализатора лексем текста стихотворения.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Попробую привести фрагмент 256-байтной таблицы для выделения из текста буквенных сочетаний лексем.
{ А___Б___В___Г___Д___Е___Ж___З___И___Й___К___Л___М___Н___О___П} {c} '+', '+' ,'+', '+', '+', '+', '+', '+' ,'+' ,'+', '+', '+', '+', '+', '+' ,'+',
{ Р___С___Т___У___Ф___Х___Ц___Ч___Ш___Щ___Ъ___Ы___Ь___Э___Ю___Я} {d} '+', '+', '+' ,'+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', { ___а__б___в___г___д___е___ж___з___и___й___к___л___м___н___о___п} {e} '+', '+', '+', '+', '+', '+' ,'+', '+', '+', '+', '+', '+', '+', '+', '+', '+', {___р___с___т___у___ф___х___ц___ч___ш___щ___ъ___ы___ь___э___ю___я} {f} '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+', '+');
Там, где написаны буквы"А", "Б" ... - это комментарий, то есть текст для удобства программиста, на который совершенно не реагирует транслятор. Эти комментарии обычно помещаются в фигурные скобки - "{" - начало комментария, "}" - конец комментария. А вот символы "+" - это уже содержимое таблицы, то есть, в таблице на месте буквы "А" стоит "+"и для программы это должно означать, что данный символ является буквой русского алфавита. Почему это необходимо сделать? - да потому, что компьютеру, вообще-то "по барабану", буква это или не буква. А вот для программы как и для программиста - это очень важно. Очевидно также, что на месте других знаков, например, цифр, должен стоять какой-либо другой знак, например, "-" или "|" ...
P.S.
Я замучился подгонять так, чтобы под каждой буквой русского алфавита стоял свой плюсик. Оставляю этот момент под мысленную подгонку читающего.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Теперь в двух словах о том, насколько становится просто анализировать текст, в числе и стихотворный, с точки зрения слов. Итак текст с точки зрения компьютера это некая последовательность, цепочка знаков (символов). Есть способ последовательно - от первого и вплоть до последнего - брать (делать копии) знака и анализировать его - в данном случае на букву. Тогда получается всё просто (1) берём первый символ (2) это буква? (3) если да, то заносим эту букву в цепочку, которая предназначена для формирования слова (4) если нет - то помещаем в цепочку символов- разделителей. Это знаки пунктуации - точка, точка с запятой, тире, продел ... (5) берём следующую букву и переходим к выполнению п. (2).
Теперь, видимо, следует выполнять ещё какую-то проверку, если очередной символ не есть буква. Надо посмотреть - а не накопилось ли в цепочке, отведённой для формирования слова, достаточно символов, чтобы это можно было рассматривать как слово? Если да, то можно обратиться к словарю ударений или сделать ещё какие-либо действия.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
После даже беглого ознакомления с сообщениями этой может возникнуть вполне резонный вопрос "А на кой он нам всё это рассказывает? Ведь понятно же, что никто этим заниматься не будет и, следовательно, все эти так называемые знания просто бесполезны, если не сказать большего".
Ан нет, это не всем так.
Представим себе великолепного программиста. Рука у него лёгкая, голова светлая и пишет он программы очень быстро. И это действительно высоэффективные программы и по надёжности и по скорости выполнения. Но когда встаёт вопрос оплаты за работу, то может возникнуть идея изначального закладывания в программу возможности совершенствования. Каким образом? - да очень просто. В программу можно ввести блоки, которые абсолютно не влияя на ход качество выходных данных существенно, очень существенно увеличивали бы время её выполнения. И когда заказчики убедятся в работопригодности и надёжности программы, то неизбежно встанет вопрос о времени её выполнения, то что называется комфортности времени ожидания. Вот тогда-то и можно немного порассуждать про трудности и про цену. А через месяц-два представить новый, "полностью переработанный" вариант программы, которая работает намного быстрее.
P.S.
Вот пишу и припоминаю, что что-то подобное о каком-то гаджете было когда-то сказано ...
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Теперь ещё один интересный момент. В процессе разработки работоспособной версии программы выяснилось, что система должна быть обучающейся. В каком смысле? В том смысле, что она должна пополняться новыми данными, например, слов с ударениями и оперативно реагировать, точнее, иметь средства для исправления выявленных ошибок. Таким образом, становится понятно, что в программе должны быть предусмотрены три "строительные площадки", три "окна" - (1) для текста стихотворения, (2) - для вывода вспомогательной информации, например, слов-рифм к указанному слову и (3) удобный редактор для исправления и пополнения данных словарей. Очевидно, что при наборе текста стихотворения возможно появление новых для программы слов и просто слов, содержащих ошибки. Новые слова с данными по ударениям и корректирующие данные должны оперативно встраиваться в словари, а сведения о замеченных ошибках должны приводить либо к исправлению имеющихся данных в словарях либо к их удалению. Таким образом, программа будет всё время адаптироваться, обучаться. Не через внесение коррекции в работу самой программы, а через данные, с которыми эта программа работает.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Зададимся ещё одним вполне естественным вопросом "А чему может ещё научиться программа, имея в своём распоряжении стихотворения известных поэтов?" Первое, что приходит на ум - это чередование ритмических рисунков в строках стихотворения. А второе, не совсем может понятное, это последовательность расположения слов, точнее "примыкание" слов друг к другу. Например, из строки "Закружилась листва золотая" можно извлечь два сочетания слов (1) закружилась листва (2) листва золотая
То есть, после слова "закружилась" было употреблено Есениным словом "листва". А после "листва" слово "золотая". Что это может дать? Понятно, что стихотворение пишется строка за строкой, слово за словом. Так вот, иногда бывает ситуация, когда нужно подыскать следующее слово, а оно почему-то не приходит, хотя где-то и вертится прямо рядом. Думаю, в этом случае может помочь список слов, которые были употреблены когда-то поэтами в сочетании с данным словом. Вот этому, видимо, и может научиться программа.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Теперь два слова об ускорении поиска путём создания так называемых коллекций. Идея проста. Лексика, понимаемая как совокупность всех слов из стихотворений, выбранных автором в качестве эталонов и слов разрабатываемого стихотворения, используется для подбора слов-рифм. То есть, каждой лексеме ставится в соответствие не только данные словаря ударений, но и "рифмический" ключ, формирование которого было описано немного выше. Если мы пересортируем слова, снабжённые ключом-префиксом, то по этим префиксам лексемы будут перегруппированы и остаётся только объединить под этим ключом все слова. Например,
айе=гималайский=3/4|гуляйте=2/3|давайте=2/3|дайте=1/2|догадайтесь=3/4|зайки=1/2|зайчик=1/2| закрывайте=3/4|знайте=1/2|купайтесь=2/3|кушайте=1/3|лужайке=2/3|полезайте=3/4|прощайте=2/3| слушайте=1/3|трогайте=1/3|узнайте=2/3|умывайтесь=3/4|хватайте=2/3|чайки=1/2
Видно, что слова с рифмическим ключом "айе="
айе=гималайский=3/4 айе=гуляйте=2/3 айе=давайте=2/3 айе=дайте=1/2 айе=догадайтесь=3/4 ...
объединёны под этим ключом. В качестве символа-разделителя используется символ "|"
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Если мы заранее подготовим такой словарь рифм, то достаточно будет, например, сделать двойной клик по нужному слову или нажать на какую-то функциональную клавишу - и мы получим практически мгновенно перечень рифм со словами разной длины и положением ударного слога.
А дальше - если таких слов слишком много - можно отобрать из этих слов, только те, которые имеют нужное ударение и/или нужное количество слогов. Это делается простым нажатием на соответствующую "кнопку".
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Теперь, после таких долгих вводных слов можно попытаться определить сценарий набора текста стихотворения.
(1) Экран редактора пустой и курсор стоит в верхнем левом углу экрана. (2) Набираем первый символ строки "Закружилась листва золотая" - это буква "з". (2.1) Буква "з" должна быть заглавной - об этом нужно помнить, но можно и программно всегда делать первую букву прописной. (2.2) Перед первой буквой строки помещаем пустую гребёнку. То есть, при нажатии на клавиатуре клавиши "з" на экране получаем _______________ З (3) Продолжаем набор слова "Закружилась" и получаем на экране редактора _______________ Закружилась (4) Нажимаем клавишу "пробел". Для программы это означает, что набор слова окончен и будет набираться следующее слово. В это время можно (4.1) По словарю слов, следующих за набранным словом, найти все варианты и поместить их на экран справочной информации (4.2) По словарю ударений получить данные и если они получены (1) подчеркнуть на экране ударную букву и (2) начать формировать гребёнку **^*___________ Закружилась (листва) - это единственное слово, которое следует во всех стихотворениях после слова "закружилась". (4.3) Если в словаре ударений данных нет, то сформированное слово заносится в специальный редактор слов со знаком вопроса на месте символа-номера ударного слога, например, если была допущена ошибка в слове "закружилась" - "закржилась", то в редакторе слов появится строка "закржилась=?/4". Если это новое слово, то достаточно нажать всего лишь одну клавишу-цифру и новое слово будет занесено в оперативный словарь новых слов. Если это ошибка, то достаточно нажать клавишу "del" - и ошибочное слово будет просто удалено из редактора слов.
|
Группа: ЗАВСЕГДАТАЙ
Сообщений: 153
Замечания : 0%
Я был просто потрясён, увидев около моей темы значок "горячая тема". Я был уверен, что такая скучная компьютерная тема вряд ли кого-то заинтересует. И начал я эту тему - теперь я отчётливо это понимаю - чтобы сделать что-то подобное selfi. Но не в плане моей физиономии на фоне Эйфелевой башни, а в плане разработки технологии. Кстати, через некоторое время это оказалось для меня весьма полезным, поскольку я как бы посмотрел на свою разработку со стороны. И в это же время убедился в справедливости сказанного кем-то "Если хочешь сам что-то понять, то попробуй это объяснить другим".
Благодарю всех, кого эта тема не оставила равнодушным. Буду рад каждому замечанию, предложению. Искренне ваш, дорогие форумчане, Григ.
|
|
|