Правила применяются в порядке убывания длин их левых частей

Говорящий текстовый редактор с открытым кодом, предназначенный для чтения вслух и записи в аудиофайл текстовых файлов с использованием пакетов речевых функций SAPI4\SAPI5.

Модератор: flegont

Ответить
Аватара пользователя
Fenix
Администратор

Правила применяются в порядке убывания длин их левых частей

#1

Сообщение Fenix »

tonio_k писал(а): May 17 2018

На сайте Демагог написано:
"Каждое правило из словаря применяется ко всему тексту. Правила применяются в порядке убывания длин их левых частей. Т.е. первым будет проверяться правило с самой длинной левой частью. Это логично: сперва в тексте должны заменены самые большие фрагменты. "
Такой же метод применяется и в Балаболке. (в части импорта правил из словаря dic в словарь bxd или отсутствие возможности отсортировать тем, кто уже перевел свои словари в bxd)

Возможно, такой метод и логичен, но только с точки зрения технического подхода. На практике же, по мере роста словаря, по смыслу всё меняется с точностью до наоборот!
И вот я решил оспорить данный подход.

Смысл вот в чем. Как сейчас происходит:
допустим правило:
дома=дОма. Как часто это правило сработает? - Всегда!

теперь такое правило:
их дома=их домА, т.е. мы как бы делаем уточнение. Оно попадается реже и мы как бы уточняем, что при такой более сложной комбинации надо слово озвучивать уже по-другому
их дома=их домА.

теперь такое правило:
я решил их оставить дома одних=я решил их оставить дОма одних. Это правило как бы уточняет предыдущее, что с такой более сложной комбинацией нужно исправить их домА на их дОма

То есть получается, что чем длинее левая часть правила - тем более "исключительным" это правило становится, по отношению к более короткому дома=дОма
А на практике же получается, что все "особые случаи словосочетаний со словом дома сводятся на нет более коротким и статистически более ошибочным правилом дома=дОма.

Но если изменить подход и применять правила от короткого к более длинной левых частей, то сработают сначала короткие сочетания, как "общие" - более часто встречающиеся. Затем более длинные словосочетания, как "исключения" - которые будут корректировать короткие (общие) правила.

Прошу высказать свое мнение по этому поводу, как формучан, так и разработчиков. Может я слишком линейно смотрю на проблему, и что то не учел в своей категоричности?
flegont писал(а):В следующей версии Демагога будет добавлена опция:
"Сервис - Общие настройки... - Чтение - Правила из dic-словарей применяются в порядке убывания длины".
По умолчанию: включено.
Это - тот самый алгоритм, который применяется сейчас.
А если галку убрать, то будет в порядке следования правил в словаре.
И там уже - ответственность пользователя. Как он правила расположит, такой результат и получит. (В rex-словарях, кстати - именно так - порядок правил определяет пользователь).

Аватара пользователя
evmir_troll-hunter
Администратор

Re: Правила применяются в порядке убывания длин их левых частей

#2

Сообщение evmir_troll-hunter »

Никто дома=дОма в словаре замен прописывать не будет!.. там именно контекст. :wink:
И вообще тема сортировки\применения правил давно обсуждалась на старом форуме. Из-за принципиальных расхождений пользователь lev55 даже покинул форум, удалив почти все свои сооб.

Поэтому нельзя понять детали тогдашнего спора к сожалению... потому тут и запрещено удалять сообщения (даже модераторам) - слишком важная и ценная информация может пропасть!

Приведу лишь несколько цитат из др. веток:
Demagog
V.I.P
. 12.05.10:
Алгоритм быстрых словарных замен большинством понят правильно: как попытка обеспечить максимально возможное сходство результатов замен с классическим методом прямого перебора (а-ля Говорилка).
:pdf icon: очередность применения правил
apokrif
V.I.P.
22.09.15:
TTS умеет подгонять слова в предложении, хорошего примера нет, а есть такой:
"1 мая" произносится "первое мая", а не "один мая"
Если применить словарь 1 = один, то получится последний вариант.
flegont
V.I.P.
22.09.15:
Но "1 рубль" звучит, как "один рубль"
Обычно вариант произношения зависит от контекста, в чем и состоит главная засада для простых правил вида слово=замена
С тех пор много чего изменилось, :oldtimer: но оптимального решения нет...
Также зимой 18-го г. был выложен архив стр. старого форума. Даже с рекомендациями, каким темам уделить особое внимание.

При вдумчивом изучении полагаю, через полтора-два часа новичок сможет разбираться в вопросе TTS.
На многое там даны ответы + интересные обсуждения, раскрывающие суть проблемы(м).
Надеюсь внимательный анализ старых материалов поможет в более точном формулировании новых вопросов и рациональных идей.

Аватара пользователя
Fenix
Администратор

Re: Правила применяются в порядке убывания длин их левых частей

#3

Сообщение Fenix »

tonio_k писал(а):дома=дОма такого правила у меня и нет в словарях. я его привел только в качестве примера, чтобы показать пирамиду происходящих замен от одного слова к множественному словосочетанию и наоборот.

"Все меняется." Я, конечно, осознаю, что в этом деле - новичок (всего пару месяцев на этом форуме) Все мои стучания в дверь разработчикам дайте то, дайте это. Мне же очевидно! Ну чего вы за старое цепляетесь!- Прошу прощение за такое поведение.

Все мои предложения и пожелания идут на основе "чужих многомесячных наработок" которая мною воспринята как данность. И изучая структуру "данных свыше" словарей натыкался именно на несрабатывание хорошо продуманных правил по причине, что они попадали под сортировку, которая не давала им развернуться.

Правила REX гибкие удобные, но работают заметно медленнее если этих правил (строчно) много. Зато DIC пасует при обработке правил с короткими по длине поисковых форм.
"Играя" приемуществами и недостатками REX и DIC можно добиваться того же результата с оптимальной скоростью.
В балаболке сейчас существует только одна сортировка - в том порядке, как указал пользователь. Это здорово. Однако пользователь лишен возможности "пакетно" отсортировать существующие правила. Вручную несколько тысяч по одному - даже связываться не охота, а подготовить словарь DIC с нужной тебе сортировкой и импортировать нет возможности - Балаболка всё равно отсортирует по принципу перевернутой пирамиды.

В будущей версии Демагога, после отключения сортировки в правилах DIC, - всё равно останется невозможность смешивать по порядку между собой словари rex и dic. Что немного сковывает.

Однако оставить за пользователем возможность сортировать - это на 90% меняет ситуацию (лично для меня) и сводит подготовку текста к максимум 1-2 минуте. (Пока я прогоню через скрипт небольшой подготовительный пакет из словарей rex и dic в нужной мне последовательности). После чего я уже могу смело запускать чтение вслух или запись в аудио (при уже выделенных остальных словарях участвующих в дальнейшей обработке) Что плавно приводит к мечте обычного пользователя - открыл книгу и слушаю...
flegont писал(а):Оптимального решения для словарей dic нет и не будет.

Я просто навсегда закрываю этот спор - позволяя снятием одной лишь галочки отменить сортировку правил в порядке убывания длины левой части. Хочет пользователь иметь полный (как ему представляется) контроль над dic-словарем - пожалуйста.
Для маленьких словарей, предназначенных для чистки текста от всяких там глюков и лишних символов - это возможно, будет полезным.

Но, предполагаю, для словаря, размером более 1000 строк, визуальный контроль за "правильным расположением правил" - будет уже весьма затруднительным.

С этой точки зрения, стандарт dic-словарей, разработанный автором "Говорилки" А.Рязановым, давно ставший привычным и проверенный на практике - представляется наилучшим. В Демагоге он всегда будет применяться по умолчанию.

Аватара пользователя
evmir_troll-hunter
Администратор

Правила применяются в порядке убывания длин их левых частей

#4

Сообщение evmir_troll-hunter »

flegont писал(а):
16 июл 2018 22:23
7.29.344:
[+] Поправки в алгоритме словарных замен "прямым перебором" по dic-словарю, в части применения правил со звездочками внутри.
Подготовил вторую :pdf icon: сравнительную характеристику

Мне удобнее Быстрым алгоритмом из сценария.


P.S. перечисленных словарей вполне достаточно про подготовке сборников любого размера (без лишней траты времени) для прослушивания Alyona Acapela.

Аватара пользователя
flegont
V.I.P.

Правила применяются в порядке убывания длин их левых частей

#5

Сообщение flegont »

Спасибо за тестирование! Очень показательные результаты.
В Демагоге для словарей .dic по умолчанию применяется т.н. быстрый алгоритм замен:
- для обеспечения мгновенного поиска словарь преобразуется в специальную "хеш-таблицу";
- текст просматривается слово за словом;
- для каждого слова определяются потенциально подходящие к нему правила в хеш-таблице;
- подходящие правила сортируются в порядке убывания длин их левых частей и в таком порядке производится проверка: подходит или нет;
- если подходит, то после замены слова (словосочетания) вновь повторяется поиск в хеш-таблице подходящих правил для этого (уже измененного!) слова, до тех пор, пока возможно.

Достоинства: Обеспечивается наиболее полное использование словаря и быстрый процесс словарных замен.
Недостатки: Порядок применения правил не зависит от желания пользователя. Например, пользователь хотел бы применить сперва короткие правила для очистки текста от "мусора".

Поэтому доступен альтернативный алгоритм, в котором правила применяются к тексту последовательно, в том порядке, в котором расположены в словаре. Условное название метода: прямой перебор.
Возьмем итоги Вашего теста (красным цветом) для самого большого документа all_Щедрин.txt
И возьмем итоги моего теста (синие) для bigtext.txt (20Мб), компьютер Intel Core i7 3.9GHz ОЗУ 16 Gb, Windows 10 64x

Словарь: z_yoyo_ex.dic (~ 200 правил)
Прямой перебор: 0:00:12 (0:00:04)
Быстрый алгоритм: 0:00:29 (0:00:08)
Победа прямого перебора за явным преимуществом.

Словарь: R_E_1_OMOGRAPF_alyona.dic (~ 60000 правил)
Прямой перебор: 0:43:09 (0:14:59)
Быстрый алгоритм: 0:08:40 (0:02:29)
Победа быстрого алгоритма за явным преимуществом.

Таким образом, для одного и того же текста, решающим является размер dic-словаря. На коротких словарях (несколько сот правил) прямой перебор выигрывает по скорости практически в 2 раза. (Поскольку нет затрат времени на предварительное преобразование словаря). А на больших словарях, в десятки тысяч правил, наоборот, быстрый алгоритм оказывается в разы шустрее , чем и оправдывает свое название.

В то же время, даже для больших словарей, прямой перебор отрабатывает за приемлемое время. Т.о. задача применения правил в dic-словаре в том порядке, в каком желает пользователь - вполне удовлетворительно решена.

Трудоемкость быстрого алгоритма пропорциональна размеру текста.
Трудоемкость прямого перебора пропорциональна произведению размера текста на размер словаря.
Поэтому, как бы прямой перебор ни выигрывал на малых словарях, на достаточно больших - он всегда проиграет быстрому алгоритму.

Аватара пользователя
wasyaka
V.I.P.

Правила применяются в порядке убывания длин их левых частей

#6

Сообщение wasyaka »

evmir_troll-hunter писал(а):
18 июл 2018 09:30
P.S. перечисленных словарей вполне достаточно про подготовке сборников любого размера (без лишней траты времени) для прослушивания Alyona Acapela.
Это только время обработки...
Для меня нет главного - эффективность обработки - т.е сколько (примерно) будет произнесено ошибочных (необработанных) омографов без все- всё. К примеру у меня долгая обработка примерно - 60 мин. на 10 час прослушки (пользуюсь обработкой по главам или по размеру около часа (балаболка) - от 2-х до 5-и минут) и где-то (в среднем) 6 неправильных(необработанных) омографов, 2 - ошибки словаря.
flegont писал(а):
18 июл 2018 10:41

Достоинства: Обеспечивается наиболее полное использование словаря и быстрый процесс словарных замен.
Недостатки: Порядок применения правил не зависит от желания пользователя. Например, пользователь хотел бы применить сперва короткие правила для очистки текста от "мусора".
А не проще сделать сработку на первом совпадении?

Аватара пользователя
tonio_k
V.I.P.

Правила применяются в порядке убывания длин их левых частей

#7

Сообщение tonio_k »

wasyaka писал(а):
19 июл 2018 12:54
А не проще сделать сработку на первом совпадении?
Вы имеете в виду, что при первом совпадении первого правила (самого длинного) из словаря для данного отрезка текста, дальнейший поиск для замен по словарю прекращается и переходим к следующему отрезку текста?

Аватара пользователя
wasyaka
V.I.P.

Правила применяются в порядке убывания длин их левых частей

#8

Сообщение wasyaka »

tonio_k писал(а):
19 июл 2018 16:25
что при первом совпадении первого правила (самого длинного)
А смысл перебирать весь список? Всё равно остановка на последнем? То же что и сразу обрабатывать с конца и на первом совпадении остановиться. :smile3:
Тогда я смогу выстроить список по омографам в алфавитном порядке а уже внутри списка с конкретным омо выстроить как удобно. И добавлять - редактировать и т.д намного удобней.


Отправлено спустя 49 минут 34 секунды:
В balabolka сумел обмануть прогу и выстроить как мне удобно:
► Показать

Аватара пользователя
tonio_k
V.I.P.

Правила применяются в порядке убывания длин их левых частей

#9

Сообщение tonio_k »

"А смысл перебирать весь список? Всё равно остановка на последнем?"
Такой пример: Вы понимаете? в другом округе.
в правилах:
*гом округе=гом Округе
в другом=в другОм

В зависимости на каком правиле остановится обработка, на выходе будем иметь либо:
Вы понимаете? в другОм округе.
Вы понимаете? в другом Округе.
А хотелось бы получить: Вы понимаете? в другОм Округе.
wasyaka писал(а):
19 июл 2018 18:27
В balabolka сумел обмануть прогу и выстроить как мне удобно:
создали словарь DIC, отсортировали как надо, переименовали в REX, импортировали в балаболку, а затем в самом файле BXD поменяли значение rex на dic? Или как то по проще?

Аватара пользователя
wasyaka
V.I.P.

Правила применяются в порядке убывания длин их левых частей

#10

Сообщение wasyaka »

tonio_k писал(а):
19 июл 2018 18:41
Или как то по проще?
Вначале обработал словарём omograph.hmg - Выстроил по алфавиту, удалил $, ([а-я]+)\s\|\s заменил на пустую, всавил в начало необработанного словаря -удалил дубликаты (EmEditor) добавились в конец те которых нет в словаре omograph.hmg
сохранил в rex. переименовал в балаболке в BXD, затем в блокноте заменил 10100(рег выражение) на 10000(обычный текст)
BXD в REX
► Показать
Не все знаки отображаются
► Показать

Ответить

Вернуться в «Demagog»