语音合成技术和文本语音转换 - Synthetic voice and Text to Speech technology - Синтетический голос и технологии преобразования текста в речь |
|
| |
Автор | Сообщение | Demagog (Демагог) |
---|
evmir_troll-hunter Admin
Сообщений : 616
| | | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| evmir_troll-hunter | :: Пт Дек 31 2010, 14:37 | Пт Дек 31 2010, 14:37 | |
| Функция «Открыть файл мультимедиа» хороша! Алёна читает, Раммштайн играет, а оборотни «зажигают» по видео Возможно кто-то сочтёт это излишним, мол зачем, ведь и так можно включить плееры. Таким скептикам скажу; прогресс господа, прогресс. То что мультимедиа теперь запускаются из программы-читалки – это прогресс. Идеи носятся в воздухе как бабочки, но лишь единицы могу их поймать и осуществить. Вен и Илья их ловят, и дарят нам, и за это им огромное спасибо!
|
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| evmir_troll-hunter | :: Вт Фев 01 2011, 08:30 | Вт Фев 01 2011, 08:30 | |
| Склонятор это бизон! Жаль что у меня его раньше не было. 15000 словоформ я сделал за полтора часа! Напр. с одного инфинитива он даёт 34 словоформы! Вот есть такое забавное словечко «облосьёнивать», и записывать вручную все его походные формы долго и путано; После работы Склонятора, будет так;
- Спойлер:
облосьёнивать облосьёниваешь облосьёнивает облосьёниваем облосьёниваете облосьёнивают облосьёнивал облосьёнивала облосьёнивало облосьёнивали облосьёнивающий облосьёнивающего облосьёнивающему облосьёнивающим облосьёнивающем облосьёнивающая облосьёнивающую облосьёнивающей облосьёнивающее облосьёнивающие облосьёнивающих облосьёнивающими облосьёнивавший облосьёнивавшего облосьёнивавшему облосьёнивавшим облосьёнивавшем облосьёнивавшая облосьёнивавшую облосьёнивавшей облосьёнивавшее облосьёнивавшие облосьёнивавших облосьёнивавшими облосьёнивая
Таким образом теперь возможно обработать и исправить намного больше слов за меньшее время. Спасибо автору!
|
|
| | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| | | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| | | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Чт Сен 01 2011, 15:34 | Чт Сен 01 2011, 15:34 | |
| тут возник такой вопрос касательно правил с регулярными выражениями и очередностью применения правил к тексту
я знаю что все правила применяются последовательно к тексту но, получается, что всего один раз, да? т.е. если правило изменяет текст то этот измененный текст второй раз этим же самым правилом уже обработан не будет, даже если после первой замены он подходит к еще одной по тому же правилу?
вот простой пример:
- Спойлер:
словарь: - Код:
-
1([abc]+)\;?=1 1= текст: - Цитата :
- 1abc;abc;abc;abc;1
после замены: - Цитата :
- abc;abc;abc;
словарь: - Код:
-
1([abc]+)\;?=1 1([abc]+)\;?=1 1= текст: - Цитата :
- 1abc;abc;abc;abc;1
после замены: - Цитата :
- abc;abc;
.... это так и должно быть, или что-то тут не так? |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Чт Сен 01 2011, 20:38 | Чт Сен 01 2011, 20:38 | |
| Так и должно быть. Попробуем разобрать по полочкам. Правило: 1([abc]+)\;?=1 означает, что последовательность не менее чем из одного символа a, b и/или c впереди которой стоит символ 1, а позади точка с запятой - заменяется на символ 1. Правило: 1= означает уничтожение символа 1.
1abc;abc;abc;abc;1
после применения 1-го правила будет: 1abc;abc;abc;1
применим 2-е правило (ОНО ТАКОЕ ЖЕ КАК 1-Е!!!) к уже измененному тексту: 1abc;abc;abc;1 будет: 1abc;abc;1
теперь применим 3-е правило к уже дважды измененному тексту, оно убьет единичку: abc;abc;
Т.е. видим, что делается, как заявлено в Справке: правила в REX-словаре применяются к тексту в том порядке, в каком в нем расположены. То что 2-е и 3-е правила одинаковые, роли не играет, это ничуть не помешало 2-му сработать так же, потому что опять нашелся подходящий фрагмент
|
|
| | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Чт Сен 01 2011, 22:26 | Чт Сен 01 2011, 22:26 | |
| - flegont пишет:
- правила в REX-словаре применяются к тексту в том порядке, в каком в нем расположены.
угу, но получается что только один раз почему-то думалось что пока не заменит все попадающие под маску фрагменты текста, для того примера - полностью удалить всю строку, а оказалось вот как - только один фрагмент
- flegont пишет:
- То что 2-е и 3-е правила одинаковые, роли не играет, это ничуть не помешало 2-му сработать так же, потому что опять нашелся подходящий фрагмент
да, в этом и суть вопроса была, получается что для удаления\замены всей последовательности нужно угадывать к-во вариантов (нужных замен) и ставить это угаданное нужное к-во правил в словаре |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Пт Сен 02 2011, 00:07 | Пт Сен 02 2011, 00:07 | |
| - flegont пишет:
- Уберите 1 в начале правила и оно подменит все "абс;" на "1"
ой это сложно объяснить но требовалось немного другое - не удалять а сдвигать единицу последовательно по строке заменяя куски размера abc; на другие это просто пример такой не совсем удачный но идея похожая... ...будем думать дальше спасибо большое |
|
| | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| | | | ptoton Бывалый
Сообщений : 108
Репутация : 25
| ptoton | :: Сб Фев 18 2012, 16:41 | Сб Фев 18 2012, 16:41 | |
| Столкнулся с проблемой. Демагог не записывает звуковой файл. Язык Alyona (SAPI5). Оставил вообще одно слово (любое, например "секунда"). Словари отключены. Слово читается, но при записи - ошибка Floating point division by zero. И это для WAV, MP3, OGG. Английский голос в Демагоге записывается в MP3 без проблем. То же слово в Балаболке Alyona (SAPI5) записывается в MP3 запросто. Подскажите в чем может быть дело? |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | ptoton Бывалый
Сообщений : 108
Репутация : 25
| ptoton | :: Сб Фев 18 2012, 21:30 | Сб Фев 18 2012, 21:30 | |
| Да у меня сейчас Демагог билд 221 и Алена версии 2.22. С одной стороны Балаболка пишет и к голосу претензию трудно предъявить. С другой стороны Демагог пишет английский голос. Т.е. тоже все должно быть нормально... Не пойму, что может влиять. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | balabolka V.I.P.
Сообщений : 1228
Репутация : 986
| balabolka | :: Сб Фев 18 2012, 23:55 | Сб Фев 18 2012, 23:55 | |
| ptoton "Зацепиться" тут можно за скриншот сообщения об ошибке, интересно было бы на него взглянуть. Скриншот может помочь понять, что именно выдает сообщение об ошибке - голос или программа. |
|
| | | ptoton Бывалый
Сообщений : 108
Репутация : 25
| ptoton | :: Вс Фев 19 2012, 00:32 | Вс Фев 19 2012, 00:32 | |
| ошибка выглядит так
слово "секунда" почему-то пропадает, но возвращается, когда собираешься выйти
|
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Вс Фев 19 2012, 10:05 | Вс Фев 19 2012, 10:05 | |
| Провел контрольный эксперимент. Скачал со своей же странички Demagog.zip, распаковал, запустил, ввел одно слово "секунда", выбрал движок Алена и скорость 3 и нажал кнопку с рисунком CD - запись аудио. Секунда и все готово (извиняюсь за каламбур). Снял скриншот. Весь каталог Demagog вместе с аудиофайлом и скриншотом запаковал обратно в Demagog_.zip и выложил: http://www.mediafire.com/?dj6ml51hv5q14v9
Если этот же экземпляр у Вас работать не будет, то скорее всего - проблема с движком Алена. Почему работает в Балаболке - не знаю. В Демагоге процедура записи аудио под SAPI5 - одна и та же для всех движков. Кажется, в какой-то из веток форума balabolka упоминал, что смотрел мой исходник (он-то у меня открытый ) и запись аудио сделана так же - это стандартная процедура и описана в документации по SAPI5. Но, может и есть какие отличия, мне сие неведомо. Разве что еще одно: Демагог скомпилирован под Дельфи 2007, а Балаболка под Дельфи 2009.
|
|
| | | ptoton Бывалый
Сообщений : 108
Репутация : 25
| ptoton | :: Вс Фев 19 2012, 12:05 | Вс Фев 19 2012, 12:05 | |
| К сожалению, ничего не помогло. Заметил еще, что Алена SAPI4 у меня на компьютере (Windows 7 64-разр Service Pack 1 проц i7-2600K) в Демагоге не читает, опять пишет Floating point division by zero. В Балаболке Алена SAPI4 читает. Если вдруг появятся какие-нибудь еще идеи о том, что еще можно проверить, буду очень благодарен. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Вс Фев 19 2012, 12:34 | Вс Фев 19 2012, 12:34 | |
| Ну, идея пока одна. Различие выявлено: у Вас 64-разрядная винда 7. Если найду где-нибудь у себя на работе комп с 64-разрядной 7-кой - попробую потестировать. А еще, со временем, перекомпилить Демагога на Дельфи 2010. |
|
| | | balabolka V.I.P.
Сообщений : 1228
Репутация : 986
| balabolka | :: Вс Фев 19 2012, 15:35 | Вс Фев 19 2012, 15:35 | |
| ptoton Программа нормально работает на 64-битной Windows 7; выполняется запись аудиофайлов в MP3 и OGG. Проблема в чем-то другом. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | ptoton Бывалый
Сообщений : 108
Репутация : 25
| ptoton | :: Вс Фев 19 2012, 18:58 | Вс Фев 19 2012, 18:58 | |
| Долго сбивало с толку, что Балаболка записывает, а Демагог - нет, но все-таки переустановил все голоса Acapella. Все теперь работает! Демагог теперь все записывает нормально. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Вт Фев 21 2012, 13:12 | Вт Фев 21 2012, 13:12 | |
| так а в чем была причина так и непонятно? надо что-то сюда написать? |
|
| | | ptoton Бывалый
Сообщений : 108
Репутация : 25
| ptoton | :: Вт Фев 21 2012, 14:05 | Вт Фев 21 2012, 14:05 | |
| Какое-то время тому назад удалял один из голосов Acapela. Видимо что-то сбилось в реестре, хотя вроде все было в штатном режиме... Тем не менее, установка переустановка голосов помогла. И хорошо! |
|
| | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| | | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Вт Мар 27 2012, 01:00 | Вт Мар 27 2012, 01:00 | |
| - Цитата :
- Добавлен альтернативный - т.н. "классический" алгоритм словарных замен.
ну наконец-то а у нас еще были несовпадения в ini\rex где-то, не помню сейчас точно где, но где-то в словаре числительных точно, надо будет поискать, но результаты в балаболке и в демагоге были разные |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Вт Мар 27 2012, 06:40 | Вт Мар 27 2012, 06:40 | |
| - Цитата :
- а у нас еще были несовпадения в ini\rex
ну, если этот rex-ini найдется... надо будет посмотреть, что-там такое
Но в новоклассическом и классическом алгоритме тоже есть различия в заменах, вот (в центре демагоговский, внизу балаболкин вариант):
Как говорят агенты Госдепа: No comments - Спойлер:
P.S. Лучше всего отличие версии 224 от предыдущих показывает следующий простой тест. Словарь: взяточник=вор министр=чиновник премьер=министр чиновник=взяточник $Тутин=премьерТекст: ТутинПосмотрИте, какой измененный текст получается в Демагоге предыдущих версий или в Балаболке. И какие правила были применены. То же самое проверьте в Демагоге 224. А также прочтите его Говорилкой. Какой из 3-х ответов ближе к истине? В смысле полноты замен
|
|
| | | balabolka V.I.P.
Сообщений : 1228
Репутация : 986
| balabolka | :: Вт Мар 27 2012, 12:56 | Вт Мар 27 2012, 12:56 | |
| Возможно, нужны пояснения по поводу порядка применения правил в "классическом" методе. В этом методе правила применяются одно за другим, ко всему тексту, так что каждое последующее правило применяется к уже измененному тексту. Первое "сработавшее" правило может сделать следующее правило бесполезным. Поэтому порядок применения правил и имеет такое большое значение.
В "Балаболке" этот порядок таков:
- данные из всех помеченных "галочками" словарей с расширением *.dic объединяются в один общий список; считывание данных происходит последовательно, в том же порядке, в котором файлы перечислены на панели словарей;
- список сортируется следующим образом: сравниваются длины шаблонов из левой части правил (без символов "$" и "*"); правила с более длинными шаблонами будут располагаться в начале списка;
- если длины шаблонов одинаковы, сравниваются позиции правил в исходном списке правил; те правила, которые располагались выше в исходном списке, будут находиться выше и в результирующем списке.
Когда приходит пора применить правила к тексту, программа берет первое правило из получившегося списка и применяет его ко всему тексту. Затем берет второе правило и применяет его к тексту, измененному первым правилом, и т.д.
---
Я готов обсудить порядок применения правил в "классическом" методе (например, при сортировке правил можно еще учитывать "звездочки" на концах шаблонов - если они есть, такие правила будут располагаться после правил без звездочек; кто-то из пользователей высказывал такую идею), но не уверен, что пользователи одобрят подобные изменения в "Балаболке": у людей уже есть свои словари, изменение порядка применения правил потребует нового тестирования списков правил. Предпочитаю быть осторожным в этом вопросе. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Вт Мар 27 2012, 21:15 | Вт Мар 27 2012, 21:15 | |
| 1. Порядок применения правил в ново-классическом (пишу так, только чтобы отличать от уже существующей реализации) практически такой же. Единственное отличие - символ $ входит в подсчет длины левой части правила. А звездочки - НЕТ, и это правильно, тут никаких расхождений с Балаболкой не имеется. Почему $ считается - я полагаю, что правила, требующие замен с учетом регистра, должны иметь приоритет перед такими же, но регистр не учитывающими. Это, конечно - эвристика, но тесты показывают, что - очень хорошая. Буду ее придерживаться в дальнейшем.
2. Не могу утверждать 100%-но, но большинство тестов, которые успел провести в ходе отладки - не выявили расхождений между вариантами: учитывать ли $ при подсчете длины или нет. Т.е. разница в подходах - не принципиальная, даже скажем - малосущественная.
3. Что касается "глубины" отработки правил, то дело здесь именно в строгом учете этой самой объективной реальности: каждое последующее правило применяется к уже измененному тексту. Первое "сработавшее" правило может сделать следующее правило бесполезным. Абсолютно верно. И если "муха" в ходе применения правил превратилось в "слон", то к этому уже другому слову могут подходить совсем другие правила! А это значит, что однократный прогон по словарю иногда оказывается недостаточным. Подобная ситуация возникает довольно редко, и эффектные примеры подобрать не так просто. Я взял текст размером с толстую книжку и обработал 2-мя классическими методами. Тексты выгнал в столбик и сравнил оба файла. Получил 30 отличающихся замен на 200000 (двести тысяч) слов. Кстати, отключивши (при отладке) повторные прогоны, я получил всего 12 слов, отличных от замен, которые сделала Балаболка. Что подтверждает мои предположения в п.2. Разница в основном из-за того, что Демагог делит текст на слова только по пробелам, а Балаболка и другие специфические символы учитывает, типа дефиса или собаки (как я понял из натурных наблюдений ).
4. Было, конечно интересно, как отработает приведенные ранее простые тесты "бабушка" Говорилка, с которой все когда-то и началось. Измененный текст она не показывает, так что годятся лишь примеры, хорошо воспринимаемые на слух. Говорилка сочла, то Тутин - чиновник - сработало 3 замены подряд. Балаболка предположила, что Тутин - премьер - 1-на замена. Демагог отработал все до конца и сделал полное логическое заключение.
5. Использовать ли повторные прогоны или нет - дело вкуса. Ну получаю я бОльшую точность замен в 0,01..0,1% случаев. Ну и что? Стоила ли игра свеч, не считая испытанного мною чувства глубокого морального удовлетворения? Все равно от 99,9% до 99,99% случаев совпадение будет полным.
Потому полагаю, что нет оснований для беспокойства из-за микроскопических расхождений в результатах работы обоих алгоритмов.
|
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Ср Апр 18 2012, 20:07 | Ср Апр 18 2012, 20:07 | |
| P.S. ЕЩЕ О ТОМ, СТОИЛА ЛИ ИГРА СВЕЧ - Цитата :
- "Это так просто, что я не понимаю, почему до этого никто не додумался раньше" (с) инженер Гарин
Как было сказано, в словарях формата DIC правила применяются к тексту в порядке убывания длин их левых частей. Символ * в подсчет длины не входит. Если эта длина для 2-х правил - одинакова, то они применяются в порядке их следования в словаре.
ПРИМЕР 1
Правила:
*^*= муха=слон
Текст: м^у^ха
Словарные замены по классическому алгоритму: Первым применяется правило с самой длинной левой частью: муха=слон. Оно - не подходит к тексту - замен нет; Затем выполняется правило *^*= - оно подходит, две замены. Просмотр словаря закончен, останов.
Измененный текст: муха
Всё верно. Но отчего-то кажется, что здесь что-то не так... А, вот оно что! Интуитивно мы ожидали, что правило *^*= сработает ПЕРВЫМ. Ведь оно и предназначено для предварительной подготовки текста. Увы - это противоречит давно устоявшемуся стандарту словарей DIC, по которому сначала проверяются ДЛИННЫЕ замены (что, кстати, вполне логично).
Но... Если к измененному тексту снова применить тот же словарь? Итак, всё сначала. Правило: муха=слон - теперь подходит! Одна замена. Правило: *^*= уже не подходит, свою службу сослужило раньше. Словарь исчерпан, останов.
Вторично измененный текст: слон
!!!! Приходим к очевидному обобщению. Применять замены к тексту НЕ однократным проходом по словарю, а повторяя этот процесс до тех пор, пока он приводит к изменению текста.
Однако, на этом пути нас подстерегает засада.
ПРИМЕР 2
Словарь: *чертя*=чертя<
Текст: очертя
Измененный текст при многократном обращении к словарю:
очертя< очертя<< очертя<<< ... и т.д. до морковкина заговенья.
Во избежание подобных казусов, должен вестись список уже примененных правил, и каждый раз применяться лишь те правила из словаря, которых еще нет в этом списке. Тем самым гарантируется конечность алгоритма.
Насколько будут отличаться тексты, измененные классическим и ново-классическим (скажем так), методами? Примерно на 0.1% если тестировать большие объемы текстов со словарем Michelangelo.dic
Стоила ли игра свеч? Полагаю, что да. Ведь текст (на любом языке) представляет собой т.н. "последовательность редких событий". Многие слова, несущие реальную смысловую нагрузку, встречаются в нем всего лишь несколько, а то и вовсе один раз! Оставаясь при том важными для понимания текста.
Поэтому, улучшение алгоритма словарных замен, касающееся даже небольшой доли слов в тексте, может оказаться полезным.
Кроме того, нисколько не погрешив против принципа применения правил в порядке убывания длин их левых частей, мы фактически сняли это ограничение. А именно, когда короткие правила используются для очистки текста от "мусора". Более "содержательные" правила уже будут успешно применены при последующих проходах по словарю.
Аналогично - при раскрытии условных сокращений и аббревиатур. И т.д. и т.п.
ПРИМЕР 3
Словарь: Michelangelo.dic
Текст: Devochka Nina - korr. CNN
Измененный текст (Demagog 4.17.227):
Де<вочка Нина - корреспонде<нт Си энээ<нн
Примененные правила:
(1-й проход: а) раскрыта аббревиатура; б) текст очищен от транслита) cnn=си энээ<нн *ch*=ч *a*=а *d*=д *e*=е *i*=и *k*=к *n*=н *o*=о *r*=р *v*=в (2-й проход: а) применено правило постановки ударения; б) раскрыто условное сокращение) девочк*=де<вочк *корр.=корреспондент (3-й проход - применено правило постановки ударения) корреспондент*=корреспонде<нт
|
|
| | | balabolka V.I.P.
Сообщений : 1228
Репутация : 986
| balabolka | :: Чт Апр 19 2012, 02:13 | Чт Апр 19 2012, 02:13 | |
| - flegont пишет:
- Во избежание подобных казусов, должен вестись список уже примененных правил, и каждый раз применяться лишь те правила из словаря, которых еще нет в этом списке.
Хорошо придумано, это действительно позволит избежать проблем с повторным применением правил. (Хотя, теоретически, опять какие-то правила не будут применены к тексту, измененному другими правилами; идеал недостижим.)
Мне лично всё равно, сколько проходов использовать в "классическом" методе. Положусь на мнение пользователей: если найдутся люди, которые поддержат Ваш вариант применения правил, - готов внести изменения в свою программу, для обеспечения единообразия. (Это несколько строчек программного кода.)
Проблема с новым методом, по сути, одна - время применения правил увеличится как минимум вдвое; всегда придется тратить время на одну безрезультатную проверку всех правил. 0,1% увеличения количества примененных правил или 100% увеличения времени их применения - вот какой выбор надо сделать. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Чт Апр 19 2012, 10:10 | Чт Апр 19 2012, 10:10 | |
| Еще один постскриптум. Оставив в стороне любопытные, но спорные вычислительные эксперименты, хочу сделать одно замечание чисто терминологического характера.
Последняя реализация классического алгоритма в Балаболке обладает весьма удовлетворительными временнЫми характеристиками. На уже известном тестовом примере в 15 мб и словаре Микеланджело, мы имеем:
Демагог: "быстрый" метод ( с повторными прогонами по словарю) - 6:51 Демагог: классический метод (с повторными прогонами) - 10:05
Балаболка: "быстрый" метод - 22:12 Балаболка: классический метод - 7:37
Таким образом, рабочее название хеш-алгоритма - "быстрый метод" в значительной мере утратило свою актуальность. А применительно к Балаболке - оно даже анекдотически звучит.
Настало время придумать для хеш-алгоритма другое название. Его единственное отличие от классического перебора состоит лишь в том, что формат словарей DIC трактуется расширенно. Допускаются звездочки ВНУТРИ левых частей правил: в словах - слева и/или справа; а также отдельно стоящие. Что несколько расширяет сферу применения DIC-словарей и позволяет, в ряде случаев, не обращаться к сложным для пользователей REX-словарям регулярных выражений.
Кто сочинит краткий и емкий термин, тот получит заслуженные аплодисменты и войдет в анналы.
|
|
| | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Чт Апр 19 2012, 19:16 | Чт Апр 19 2012, 19:16 | |
| - flegont пишет:
- Балаболка: "быстрый" метод - 22:12
Балаболка: классический метод - 7:37 а как так? второй метод теперь быстрее первого или первый стал медленнее второго?
- flegont пишет:
- Настало время придумать для хеш-алгоритма другое название
а почему сразу нельзя было его не смешивать со словарями *.dic? переименовали бы как-то по-своему и описали все возможные варианты правил как это сделано например тут а теперь приходится долго думать какое правило и как лучше добавлять чтобы оно и так и так |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Чт Апр 19 2012, 20:25 | Чт Апр 19 2012, 20:25 | |
| 1) Я имею ввиду название метода в меню программы! "Быстрый" метод в Балаболке всегда был довольно тормозным по сравнению с его изначальной реализацией в Демагоге. Сперва разница составляла 1.5..2 раза, сейчас уже более чем в 3 раза медленнее. Почему так - вопрос не ко мне. Но он все же был быстрее классического. В последней версии Балаболки автор усовершенствовал именно классический метод - в плане скорости, см. вышеприведенные результаты теста
И названия пунктов меню в Балаболке: Метод применения правил - Классический/Быстрый (Демагог) - стали противоречить реальному положению дел (в Балаболке).
В Демагоге хеш-метод как был быстрым, так и остался и до сих пор еще быстрее "балаболко-классического" ~ 10% и быстрее "демагого-классического" ~ 30%
Т.е. в Демагоге еще можно писать "Классический/Быстрый", не вводя в заблуждение пользователя. А в Балаболке это уже выглядит комично.
2) - Цитата :
- а почему сразу нельзя было его не смешивать со словарями *.dic?
Потому что цель была - максимальная совместимость с существующими словарями! С предоставлением некоторых дополнительных возможностей в рамках привычного пользователям формата dic. Эти дополнительные возможности сохранены и в "демагого-классическом" алгоритме, в котором правила применяются традиционно, просмотром всего словаря в порядке убывания длин левых частей правил + повторные прогоны по словарю для уточнения замен, если это возможно.
3) В принципе я уже сейчас могу исключить "быстрый" метод из Демагога, оставив лишь "новоклассический". Т.к. по скорости разница - несущественная, а замены выполняются в более привычном (классическом) порядке и при том сохраняется совместимость с нововведениями "быстрого" алгоритма. Т.е., правило, работающее в "быстром" методе и не работающее в классическом, будет по-прежнему работать в "новоклассическом".
Например, правило: все * *ло=всё ло
Текст:
Все вокруг потемнело. Все мне надоело. Все давно прошло.
Измененный текст (в быстром и новоклассическом алгоритмах):
Всё давно прошло. Всё вокруг потемнело. Всё мне надоело.
|
|
| | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| | | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Пт Апр 20 2012, 10:23 | Пт Апр 20 2012, 10:23 | |
| - Цитата :
- да, было бы здорово все притянуть к одному формату, будет меньше путаницы
Я - не против. Но изъятие "быстрого" метода (во избежание еще большей путаницы) должно быть произведено согласованно в Демагоге и Балаболке. Чтобы в один день, раз! - и его нет. Я "подготовку к акции" уже провел, и могу сделать это за 10 сек (время перекомпиляции программы). |
|
| | | evilone_ Участник «online словари»
Сообщений : 859
Репутация : 317
| evilone_ | :: Сб Апр 21 2012, 02:20 | Сб Апр 21 2012, 02:20 | |
| flegont, если он меняться в дальнейшем больше уже не будет, в чем у меня есть сомнения , или он повторяет старый то да, а иначе лучше назовите его как-то по-другому и будет новый "быстрый" |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Сб Апр 21 2012, 09:01 | Сб Апр 21 2012, 09:01 | |
| ново-классический
1) Правила применяются в целом по словарю в порядке убывания длин их леых частей (* в подсчет длины не входит) - это надежная, проверенная классика.
2) Правила со * внутри левой части выполняются также, как в "быстром" методе - это для совместимости. В старом классическом методе подобные правила просто игнорируются.
3) Проходы по словарю выполняются не по старинке - один раз, а столько, сколько нужно - это новое. На практике разница весьма невелка (~0.1%), но иногда это бывает существенно. Примеры приводлись выше.
P.S. Если повторные проходы отключить, то тест дает степень совпадения со старым классическим до 3-х девяток: 0,99906 иначе = 0,99850 - чуть меньше, т.к. за счет более полного использования правил появляются замены, отсутсвующие в старом классическом.
P.P.S. Кому интересно, в том же тесте "демагого-быстрый" дает совпадение со старым классическим: 0,99797; "балаболко-быстрый": 0,98744
P.P.P.S. А с учетом приводившихся ранее временнЫх характеристик - видим, что особой необходимости в дальнейшем использовании "быстрого метода" - нет.
|
|
| | | balabolka V.I.P.
Сообщений : 1228
Репутация : 986
| balabolka | :: Сб Апр 21 2012, 15:27 | Сб Апр 21 2012, 15:27 | |
| - flegont пишет:
- А применительно к Балаболке - оно даже анекдотически звучит.
А в Балаболке это уже выглядит комично. Не очень-то приятно читать такие слова: выглядит так, как будто бы взял хороший алгоритм и испортил его при вставке в свою программу. Я уже объяснял, что это неизбежная "плата" за поддержку программой Юникода; алгоритм не будет работать быстрее, если каждый символ вместо одного байта станет занимать два.
Мне тоже стало интересно, что же такое происходит с "быстрым" методом в моей программе. Взял для тестов текстовый файл размером 2 Мб и словарь "Микеланджело". Измерил скорость быстрого метода в "Балаболке" - 2:05. Скачал исходники "Демагога", откомпилировал в Delphi 2007, засек время - 1:06. В моей программе "быстрый" метода работает в 2 раза медленнее.
Откомпилировал исходники "Демагога" в Delphi 2009, засек время - 1:41. При переходе с ANSI на Юникод метод замедлился в 1,5 раза. Да, не в два раза, как в "Балаболке". Но в моей программе функции "быстрого" метода также пришлось адаптировать к Юникоду. Речь о таких функциях, как "Body", "DollBody", "Tail", "Nose" - для различных языков границу слова придется искать по-разному. Именно здесь и теряю эти 50% скорости.
В качестве эксперимента восстановил вышеперечисленные функции в "Балаболке", скопировав из "Демагога"; замерил время - 1:34. То есть, тот же результат, что в "Демагоге" на Delphi 2009.
---
В следующей версии "Балаболки" уберу "быстрый" метод, оставлю только "стандартный". Хэш-таблица - это здорово, но слишком много дополнительных действий выполняется над строками в формате Юникод, это и приводит к потере времени.
Насколько я понимаю, "новоклассический" метод также делит исходный текст на отдельные слова - чтобы затем выполнять сравнение каждого слова с шаблоном. Если так, потенциальное падение скорости при переходе с ANSI на Юникод заложено и в этом алгоритме. В "Балаболке" пока будет применяться обычный "стандартный" метод, с возможностью использования "звездочек" только на краях шаблонов.
Еще раз спасибо Венедикту Ли за разрешение использовать его алгоритм "быстрого" метода. |
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Сб Апр 21 2012, 15:44 | Сб Апр 21 2012, 15:44 | |
| Это я, наверное, неуклюже выразился, ведь хотел сказать комплимент: что успешное усовершенствование классического метода в Балаболке, сделало "быстрый" метод (заметили, что с некоторых пор я пишу это слово в кавычках? ) не сильно востребованным, а его название - несколько анекдотичным. Да и в Демагоге тоже - превосходство в скорости над новоклассическим +20% - не такая уж и быстрота.
Но польза от игрищ с хеш-таблицей, в смысле изучения разного рода тонкостей словарных замен, и стимулов к совершенствованию обеих программ была (имхо) большая. ( А что касается юникода - увы, да, за универсальную кодировку приходится расплачиваться, тут ничего не поделаешь)
Искренне благодарю Илью Морозова за сотрудничество и полезные обсуждения. |
|
| | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| | | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| | | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Вс Июл 15 2012, 21:29 | Вс Июл 15 2012, 21:29 | |
| ЭКСПЕРИМЕНТЫ С FB2
(Версия Демагога не ниже 4.18.234)
Предварительно. "Сервис - Общие настройки - Прочее - Распознаваемые типы текстовых файлов" указываем: *.fb2; *.jpg; *.jpeg; *.png; *.bmp; *.gif
1. Преобразование fb2 из utf-8 в win-кодировку. 1.1. Открыть. ( В силу сделанных выше настроек, ф-л откроется, как есть - в виде xml-текста) 1.2. Сразу в 1-строке заменить utf-8 на windows-1251 1.3. Сохранить. (экономия в размере файла составит ~ 40..50% )
2. Изменить картинку в fb2 2.1. Открыть в любом свободном окне нужную картинку. ( В силу сделанных выше настроек, картинка откроется в виде т.н. транспортного кода Base64) 2.2. Скопировать полученный транспортный код и вставить его в fb2-файл взамен кода, соответствующего заменяемой картинке.
3. А если надо отредактировать уже имеющуюся в fb2 картинку? Очень просто. При открытии fb2-файла, если в настройках стояла галочка "Показывать картинки", то все они будут декодированы из имеющихся в fb2 блоков транспортного кода и помещены в отдельный каталог. Делайте с ними, что хотите, с помощью фотошопа, а потом... п.2 Обычно, задача редактирования состоит лишь в том, чтобы уменьшить размер ф-лов картинок. Что, в итоге, сократит потом и размер fb2 на 10..15%
|
|
| | | evmir_troll-hunter Admin
Сообщений : 616
Репутация : 208
| | | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Вс Авг 26 2012, 21:32 | Вс Авг 26 2012, 21:32 | |
| И вновь секретный эксперимент
В версии Демагога 4.18.237 изменена опция "Сервис - Статистика - Найти по списку". На то, как она выглядела раньше - наплевать и забыть. А вот как это работает сейчас.
Автоматически выбираются все слова из текста, подходящие под заданный список шаблонов. Шаблоны должны находиться в файле с расширением txt, кодировка, естественно, Windows.
Это именно ВЫБОРКА, а не поиск. Мы получаем информацию о том, что данное слово в тексте есть, но не о том, где оно находится.
Итак, загрузим в Демагога, в Окно 1 какой-либо текст, размером с хорошую книжку. В Окно 2 поместим Очень Большой Текст (есть у меня такой, 20 мб художественного чтива). В 3-м окне введем:
$Вовочк* бля* муд* ху* * кивн* *
Сохраним этот текст под именем wanted.txt ("Разыскивается" )
Во-первых, видим, что шаблоны задаются в точности так, как левые части правил в словарях формата DIC. Согласитесь - это удобно. Используется расширенный формат словарей DIC, применяемый в Демагоге: когда позволительны звездочки в начале и/или конце любого слова в левой части правила; и отдельно стоящие звездочки.
Во-вторых, начнем наш эксперимент. Возвращаемся в Окно 1. Выполняем "Сервис - Статистика - Найти по списку". В открывшемся диалоге выбора файлов указываем wanted.txt Через несколько секунд в Окне Статистики появляется отчет. Смотрим, и убеждаемся, что выбранная книжка не содержит, помимо безобидных слов "блямба", "мудрец" и "художник", других, более сильных народных слов. А также графоманских ляпов типа "кивнул головой". И эта книжка не является сборником анекдотов про Вовочку. Или наоборот: содержит и является
Заметим, что дубликаты в отчете не показываются. Закомментируем или удалим прежние шаблоны. Введем новый, из одного слова: все. Проведем поиск по заново сохраненному списку и в отчете увидим одно это же слово. Т.е. это слово в тексте есть. Не сильно полезная информация. Нетрудно было и так догадаться
Однако, усложним наш шаблон: все * * Т.е. слово "все" в контексте 2-х следующих за ним слов. Сохраняем изменения в wanted.txt, повторяем поиск. О-о! Вот это уже серьезно! В отчете больше полутысячи строк. Гляньте на фрагмент. ("Слова" ~Z~ и ~E~ означают, соответствено, абзацный отступ и пустую строку)
- Спойлер:
... все больше краснел, все больше отдаляясь все больше переходил все больше распаляли все больше темнело все больше, - все больше. ~Z~ ... все время бегать, все время безбожно все время видел все время не все время ни все время никто все время пересыхало все время повторяю все время разный, все время со все время чувствовал ... все еще болит. все еще был все еще в все еще держал все еще ждут все еще жив, все еще живет? все еще имело все еще любовница все еще надеюсь... все еще находилась все еще не все еще нужна. все еще обессиленных все еще покоится все еще полагал, все еще полностью все еще помнят, все еще по-молодому все еще правишь? все еще продолжая все еще пытается все еще пьяная все еще рядом, все еще сжимали все еще смеясь, все еще со все еще собираешься все еще сохранял все еще спит. все еще старалась все еще тлея. все еще у все еще чувствуешь все еще шмыгая все еще юность ...
Отчет отсортирован по алфавиту и даже при беглом его просмотре правила для разрешения омографа все/всё сами лезут в голову:
все больше=всё больше все время=всё время все еще=всё еще
и т.д. и т.п.
Кроме очевидных, есть и более тонкие и спорные правила. Когда-то, подчиняясь внезапному озарению, я сформулировал правило:
все * *ло=всё ло
все давно прошло | все вокруг потемнело | все мне надоело | все мне мало ...
и множестов др. вариантов замечательно под него подходят. Мне тут же привели контрпример (см. эту ветку форума несколькими постами выше):
все друзья весело уселись за стол
и я стал юлить, витиевато объясняя, что всякие там отдельные исключения исправляются дополнительными правилами... Вопрос о том, не потонет ли само правило в трясине исключений к нему, так и остался открытым. Закрытием его мы сейчас и займемся.
Итак, пусть наш список wanted.txt содержит одну строку шаблона: все * *ло Посмотрим, что под нее подходит. Раз-два и готово:
все больше темнело все время пересыхало все выше, русло все еще имело все остальное стало все четче проступало
Понятно, что: а) правило - редкое, на целую книжку сработало всего 6 раз; б) довольно надежное - ни разу не ошиблось. Для уточнения откроем наш Очень Большой Текст и проведем выборку по нему. Вот:
- Спойлер:
# Выборка из "bigtext.txt" по списку "wanted.txt"
Все вокруг ослепляло Все вокруг спало Все время тянуло Все дальнейшее произошло Все здесь было Все здесь сохраняло Все кругом наводило Все лобовое стекло Все мгновенно стало Все остальное было Все остальное произошло Все остальное пропало Все отныне принадлежало Все пока шло Все продается, дело Все совещание прошло Все сраженье состояло Все так походило Все тут было Все это было Все это внушало Все это волновало Все это выглядело Все это исходило Все это могло Все это напоминало Все это положило Все это походило Все это пошло Все это привело Все это произошло Все это происходило Все это следовало Все это создало Все это составляло все благоговейно безмолвствовало все больше мучило все больше темнело все большее число все бы было все вместе развязало все вокруг было все вокруг зарокотало все время носило все время пересыхало все время уносило все выше, русло все давно было все дело было все дело происходило все должно было все его тело все ее тело все ей стало все еще было все еще волновало все еще имело все еще отливало все еще подсказывало все же было все же давало все же мало все же могло все же обещало все же пробежало все же следовало все же тело все же хватило все замечать. Стало все заранее было все здесь говорило все здесь стояло все и было все и пошло все и происходило все их тело все кругом затопило все кругом исчезло все кругом стало все лето сияло все можно было все наследство состояло все не было все не выпадало все небо пылало все ниже. Прошло все нормально.... Тело все общество проследовало все окружающее исчезло все опять замирало все остальное было все остальное стало все почти погасло все причиняющие зло все прочее было все путешествие заняло все равно было все равно погибло все равно стало все равно стоило все равно тянуло все раскалилось, дышало все расспросил. Заболело все розыски, тело все сильнее овладевало все сильнее проступало все столпились около все стороны, было все стояли около все так весело все так уныло все тело перестало все уже было все уже сошло все утро царствовало все четче проступало все что было все чуть было все это было все это весело все это возбуждало все это выглядело все это вызвало все это вызывало все это давало все это действовало все это делало все это доставляло все это завораживало все это заглушило все это изображало все это мало все это могло все это напоминало все это находило все это немало все это ослепляло все это повлияло все это поддерживало все это подсказало все это помогло все это поразило все это породило все это предстало все это произвело все это произошло все это происходило все это свидетельствовало все это стало все это стоило все это требовало все это убедило все это, стало все это? Дело
6 исключений из 154. Т.е. надежность этого правила составляет (+154-6)/154 = 0.961 Вполне удовлетворительно.
Таким же образом можно тестировать любые другие правила для словарей формата DIC.
|
|
| | | flegont V.I.P.
Сообщений : 355
Репутация : 476
| flegont | :: Сб Окт 27 2012, 08:28 | Сб Окт 27 2012, 08:28 | |
| Экспериментальный словарик для разрешения омографа ВСЕ/ВСЁ http://aloys.narod.ru/sof/1/YOhmg.zip
Только для программы Demagog версии 241 и выше.
Предварительное тестирование дало следующие результаты. Правильность применения правил ~ 94%. Ошибочные применения распределились так: 1% - подстановка ё где не надо, и 5% - не подстановка ё там где надо
P.S. "Только для Демагога" - это не потому, что я жлоб, а потому, что только Демагог поддерживает расширенный формат DIC-словарей, допускающий звездочки внутри правил, а не только в начале/конце правила; а также отдельно стоящие звездочки в правилах. И только Демагог применяет правила многократным проходом по DIC-словарю, выполняя замены до тех пор, пока это возможно. |
|
| | | | Demagog (Демагог) |
---|
| |
|