Покамест не сравнение, а ориентир. Словарные замены в сборке Tonio_k (и в моей тоже) выполняет Demagog, он же - источник интерфейса, и средство доступа к интерпретатору Python. Посмотрим, как Demagog справится с этим текстом.
Текст: взят по упомянутой ссылке, размер: 11 мб. Знаков (с пробелами): 11862033 = 296,55 авторских листов.
Ноутбук MSI Katana Загружаем текст в любое окно Demagog, версия 411 x32 из сборки Tonio_k Словарь расстановки ударений из той же сборки: 95.NEW_Орфоэпия(phoneme).dic2.9 миллиона правил; в Настройках выбран хеш-алгоритм. Нажимаем кнопочку "Измененнный текст"
В окне 0 - Статистика имеем:
# Текст "Release-that-Witch_Освободите-эту-Ведьму.txt" измененный по "95.NEW_Орфоэпия(phoneme).dic" (0:00:33)
ReleasethatWitch, освобод+Ите эту в+Едьму ф+Айл был сгенерирован про+Ектом ранобехаб орг. Не для комерческого исп+Ользования, Том 1 глав+А 1. С сег+Одняшнего дня я насл+Едный принц.,Ченг Ян поч+Увствовал, что ктото зв+Ал его. в+Аше выс+Очество, прош+У, пр+Оснитесь… Он отверн+Улся, но голоса, кот+Орые он сл+Ышал, не исч+Езли. на с+Амом д+Еле они, наобор+От, ст+Али д+Аже гр+Омче. зат+Ем он поч+Увствовал, что ктото остор+Ожно
и т.д. и т.п.
Затраты времени на обработку этого большого текста большим словарем указаны в скобках в заголовочной строке результата Ноль часов, ноль минут, тридцать три секунды. А в сборке это всё происходит автоматически, потом весь текст уже с проставленными ударениями передается питон-скрипту на озвучку. Ну, уж озвучивать 11 мб сборка будет дооооолго... но ведь нас интересовало только время работы словаря. Оно - вполне удовлетворительное.
Сообщение отредактировал flegont - Пятница, 02.12.2022, 21:17
я пробовал на lua через ассоциативные таблицы создавать словарные замены. Работает относительно быстро, но проблема в регистре - lua регистрозависим. Отсюда двойная работа с текстом: нужно делать зеркало текста в нижнем регистре, и замены делать по зеркалу, вставляя замены в оригинале. В итоге, модуль функции работы словаря на Lua в моём исполнении интересна но ощутимо медленнее чем исполнение в Демагоге. Поэтому, как интересное решение - да, как полезное - нет (ну может, в неких частных случаях)
Я делал хеш- алгоритм, как и всего Демагога на Дельфи. И не уверен, что на интерпретируемых языках, типа питона, луа и т.п. это возможно повторить. Питон медленнее в 50..100 раз.
Но сам принцип ХА прост. Пусть словарь - это текстовый файл, состоящий из строе - правил вида: слово=замена И количество строк в словаре N
Создаем массив строк h, первоначально они все пустые, размер h пусть будет 3*N Точнее, ближайшее к этому простое число! Пусть это будет M Пробегаем в цикле по словарю, и для каждого правила считаем хеш -это будет z - целое число от 0 до M-1 Я использую PJWhash - хеш-функцию Вайнбергера для строк. Если h [z]пусто, то h [z]= 'слово=значение' Иначе проверяем, свободно ли h[z+1] и т.д. Когда цикл по словарю закончен, хеш таблица - заполнена.
Замены в тексте по словарю. Превращаем текст в массив слов w, по разделителям: пробел, перевод строки, табуляция. В цикле по w вычисляем хеш очередного слова w, пусть это будет некое число. Проверяем h[z]. Если пусто, то для этого слова нет правила в хеш-таблице, переходим к следующему слову. Если не пусто, проверяем, совпадает ли 1е слово в правиле h [z]cо словом w Если да, то правило для этого слова найдено, производим замену по этому правилу. Иначе проверяем правило h[z+1] и т.д. Когда цикл по массиву слов закончен - все замены сделаны. Слепляем массив слов обратно в единый текст.
Тут я опускаю детали: символы перевода строки надо тоже запоминать в массиве слов, как особые "слова", чтобы при конкатенации массива слов восстановить по ним переводы строк т.е деление текста на абзацы. Кроме того, слова в тексте м.б. окружены скобками, кавычками и др.знаками препинания, при составлении х-т и при проверке слов по х-т надо этот мусор как-то игнорировать. А еще: учитывать при заменах регистр букв или нет.
Но общий принцип понятен.
На оф.сайте Демагога есть глава "3. Нормальные герои или повесть об алгоритме словарныз замен". Там рассказ и о моих попытках научить ХА понимать правила со звездочками. Хотя тут уже быстродействие сильно падает.
Изначально хеш-алгоритм, входящий в состав Демагога, я сделал доступным встроенному интерпретатору Lua. Lua просто вызывает соответствующую функцию Дельфи. А с недавних пор, в Демагог64 открыл доступ этой же функции интерпретатору Python. Вот и весь секрет. Это не луа и не питон - быстрые. Это дельфи - быстрый, на котором написан Демагог.
Сообщение отредактировал flegont - Суббота, 03.12.2022, 10:30
Дата: Понедельник, 05.12.2022, 22:38 | Сообщение #128
V.I.P.
Группа: Модераторы
Сообщений: 141
Статус: Offline
Ну, тут зависит от того, как к проблеме подойти, знатоки C++ говорят, что всегда могут написать прогу, аналогичную к-либо дельфийской и будет работать в полтора раза быстрее. Не знаю, не видел Зато о питоне за сегодняшний вечер мое мнение заметно улучшилось. Подробности завтра, а предварительный результат показан ниже.
ReleasethatWitch, Освободите эту Ведьму Файл был сгенерирован про+Ектом ранобехаб орг. Не для комерческого исп+Ользования, Том 1 Глава 1. С сег+Одняшнего дня я насл+Едный принц.,Ченг Ян поч+Увствовал, что ктото зв+Ал его. Ваше Высочество, прош+У, пр+Оснитесь… Он отверн+Улся, но голоса, кот+Орые он сл+Ышал, не исч+Езли. На самом д+Еле они, наобор+От, ст+Али д+Аже гр+Омче. Затем он поч+Увствовал, что ктото остор+Ожно д+Ёргает его за рук+Ав. Ваше Высочество, мой насл+Едный пр+Инц! Ченг Ян р+Езко откр+Ыл глаза. Хорошо знак+Омая ему обстан+Овка исч+Езла, раб+Очего стола нигд+Е не б+Ыло, и прив+Ычные перегор+Одки, спл+Ошь ус+Еянные почт+Овыми адресами пропали. Их замен+Ил стр+Анный пейз+Аж, кр+Углая общ+Ественная пл+Ощадь, кот+Орая со вс+Ех сторон был+А окружен+А маленькими кирп+Ичными д+Омиками, и в+Иселица, кот+Орая был+А устан+Овлена в самом ц+Ентре пл+Ощади. Сам он сид+Ел за стол+Ом по друг+Ую сторону от в+Иселицы. Вместо уд+Обного ... (и т.д и т.п.) ... валась она. Я верн+Улся, Роланд улыбн+Улся, вход+Я в дом. Путь перед ним простир+Ался вперёд. Независимо от того, как+Ое б+Удущее их ожид+Ает, это был+А соверш+Енно н+Овая стран+Ица. Конец.,
Тест на питоне алгоритма из сообщения #126 Использован тот факт, что в питоне нет надобности конструировать хеш-таблицу, она там есть и называется "тип данных - словарь". Остается только заполнить его, в соответствии с тектовым файлом словаря *.dic Подразумевается, что текстовый файл словаря содержит правила, вида слово=замена причем слово - в нижнем регистре; кодировка файлов словаря и текста для правки словарем - ANSI.
ReleasethatWitch, освобод+Ите эту в+Едьму ф+Айл был сгенерирован про+Ектом ранобехаб орг. Не для комерческого исп+Ользования, Том 1 глав+А 1. С сег+Одняшнего дня я насл+Едный принц.,Ченг Ян поч+Увствовал, что ктото зв+Ал его. в+Аше выс+Очество, прош+У, пр+Оснитесь… Он отверн+Улся, но голоса, кот+Орые он сл+Ышал, не исч+Езли. На самом д+Еле они, наобор+От, ст+Али д+Аже гр+Омче. зат+Ем он поч+Увствовал, что ктото остор+Ожно д+Ёргает его за рук+Ав. в+Аше выс+Очество, мой насл+Едный пр+Инц! Ченг Ян р+Езко откр+Ыл глаза. хорош+О знак+Омая ему обстан+Овка исч+Езла, раб+Очего стола нигд+Е не б+Ыло, и прив+Ычные перегор+Одки, спл+Ошь ус+Еянные почт+Овыми адресами пропали. Их замен+Ил стр+Анный ... ... пож+Аловать дом+Ой, м+Ягко поздор+Овалась она. Я верн+Улся, Роланд улыбн+Улся, вход+Я в дом. п+Уть перед ним простир+Ался вперёд. незав+Исимо от того, как+Ое б+Удущее их ожид+Ает, это был+А соверш+Енно н+Овая стран+Ица. кон+Ец.,
Красивый код получился! Даже я (не зная питон) смог его прочитать что он делает . Первый шаг к созданию полноценного модуля словарных замен на питоне сделан. Осталась самое малое - увеличить его раза эдак в 10 что бы он и звёздочки поддерживал и чувствительность к регистру регулировалась. К стати, как этот скрипт с чувствительностью регистра сейчас? Он ведь ищет с учётом регистра?(Не могу пока тестировать скрипт ПК далеко) И ещё, меня беспокоит перспектива. Помню, на lua простая замена у меня тоже очень быстро отрабатывала, даже быстрее штатной string.gsub(). Но когда добавил регулировку чувствительности к регистру, попытался поддержку звёзд добавить, то тормоза полезли в геометрической прогрессии с каждым добавлением и дальше искать уже не хотелось. Возможно, криво написал, но все же...
Сообщение отредактировал tonio_k - Вторник, 06.12.2022, 12:49
str.casefold() приводит к нижнему регистру проверяемое слово, а словарь изначально в нижнем регистре по левым частям правил. Так что, замены в тексте от регистра не зависят. По крайней мере, мне так кажется
Теперь надо обобщить на: 1. Правила, содержащие слева более одного слОва 2. Правила, у которых в левой части словА содержат звездочки справа/слева/с обеих сторон 3. Возможность включать зависимость замен от регистра
Правила с отдельно стоящми * полагаю, поддерживать не надо. Они - самая тормозная часть хеш-алгоритма. Если уж на дельфи тормозит, то на питоне или луа и подавно.
Сообщение отредактировал flegont - Вторник, 06.12.2022, 14:18
Спасибо за скрипт, попытаемся его раскачать) В данный момент, для словаря, стоит модуль FlasText работает по умолчанию,даже при отключенном модуле ударения, он может учитывать регистр и несколько слов и даже предложений. Но к нему просто нужен полный словарь ударений.
Раньше я загружал словарь так:
Код
class open_dic:#Загрузка словаря d = {} try: with open('dic.txt', encoding = 'UTF-8') as fd: fx = fd.readlines()
for x in fx:
fx = x.split(" = ")
d.update({fx[0].strip(): fx[1].strip()};)
print('\nСловарь Загружен \n') except: print('\nСловарь НЕ НАЙДЕН \n')
Но применял его очень криво:
Код
for key,value in dic.items():
txt2 = txt2.replace(key, str(dic[key]))
То есть не учитывал конца слова, да и не знал как это делать. Потом и пошли проблемы, когда короткое слово заменяло часть в большом слове. Не поделитесь своим словарем)
А при делении и чистки с начало использовал:
Код
nestr3 = re.sub (r'[^А-Яа-яёA-Za-z\0-9\.{0,3}\<\>\!\+\?\s\/\,]*', u'', txt2) # Все кроме в [...] nestr2 = re.sub (r'\?', u'? sss ', nestr3) nestr1 = re.sub (r'\!', u'! sss ', nestr2)
а потом для деления использовал:
Код
theList = re.split (' sss ', txt_sp)
Использовал re.sub так как replace не всегда видел например конец строки а re.sub (r'\n', u'\n sss ', nestr2) работает хорошо + только с re.sub так
95.NEW_Орфоэпия(phoneme).dic - это словарь из сборки tonio_k, на нее в этой ветке есть ссылка на скачивание, выше, на стр.4 если правильно помню. В ней содержится самый большой словарь ударений русского языка, какой я когда-либо видел
Я основываю свои наработки на таком формате словарей *.dic:
# пример $СССР=Сов+етский Со+юз сама=сам+а у окна=у окн+а туник*=тун+ик *ой волны=ой волн+ы *чертя*=черт+я
# строка комментария; $ учитывать регистр; * отсутствие границы слова со стороны звездочки Хеш-алгоритм сказочно быстро работает на правилах вида слово=замена. Поэтому гиганский словарь ударений так стремительно срабатывает.
На словосочетаниях (без звездочек) - ХА уже несколько медленнее, на правилах со звездочками - еще медленнее. Вариант со словосочетаниями - на питоне хочу сделать его иначе, чем в Демагоге. Есть надежда ускорить работу ХА в этом случае. Посмотрим, оправдается ли она
Сообщение отредактировал flegont - Среда, 07.12.2022, 22:05
А вот и очередная сборка https://t.me/myttsinfo/978
Спасибо flegont за скрипт и tonio_k за словарь Из скрипта подчерпунл некоторые моменты и попробую их применить в своем коде. В следующий раз прилеплю возможность открывать словари из окна программы и переделать логику работы с txt файлами. Но это теперь очень не скоро.
Сообщение отредактировал Pin240 - Вторник, 13.12.2022, 18:48
Особенность сборки : В сборку добавлен Демагог 32бит Version 7.30.408. Это сделано для обеспечения совместимости скриптов с версией Демагога. Тем не менее, вы можете попробовать "поверх" сборки установить последнюю версию Демагог 32бит, скаченный с официального сайта. Сборку надо устанавливать отдельно, а не поверх старой сборки!
Изменения: 1) Исправлена критическая ошибка склеивания файлов mp3. (Были пропуски в нумерации и дублирование озвучки в точке склеивания) 2) По завершению записи в аудио, окно Демагога, теперь, будет сворачиваться. Это устраняет проблему удаления содержимого папки \temp\ 3) Пересобраны и переименованы словари, начинающиеся с "4" в названии. 4) Изменён словарь 99.ПАУЗЫ@(phoneme).dic - удалены замены цифр; добавлена замена для озвучки списка найденных НОВЫХ СЛОВ 5) При старте записи в аудио дополнительно выводится сообщение о текущих настройках аудио для визуальной проверки перед стартом 6) Для быстрого Озвучивания выделенного текста ( Ctrl+Shift+8 ) теперь берется голос из настроек, с которыми записываются книги.
Добавлено: 1) Добавлен скрипт .===================ПОИСК ПО ШАБЛОНУ ( Ctrl+Shift+3 )- поиск в тексте по шаблонам REX, LUA, DIC. Ищет и выводит БЕЗ СОРТИРОВКИ!: текст или предложения или абзацы(строки)содержащие искомое. Ищет в окне или указанных файлах. 2) Добавлен скрипт \work\ОКНО - ПОИСК НОВЫХ СЛОВ - ищет в книге новые слова, создает список новых слов в контексте предложений, и предлагает создать аудио mp3 для прослушивания в плеере. База исключений создана на основании имеющихся словарей. 3) Добавлен скрипт \work\СЛОВАРЬ ОТКРЫТЬ СТОРОННЕЙ ПРОГРАММОЙ ( Ctrl+Shift+E )- выводит список ВСЕХ словарей из папки dic2 и dic в том порядке, в котором они срабатывают в скриптах. Выбранный словарь открывается в AcelPad (добавлен в сборку). Этот портабельный аналог блокнота может за пару секунд! открыть самый большой словарь в сборке для редактирования. --Для составителей словарей: 4) Добавлен скрипт \work\ОКНО - УДАЛИТЬ ДУБЛИКАТЫ СТРОК - удаляет дубликаты строк без сортировки. Полезно для удаления дубликатов правил в словарях. 5) Добавлен скрипт \work\ОКНО - УДАЛИТЬ СТРОКИ ПЕРЕЧИСЛЕННЫЕ В ДРУГОМ ОКНЕ - помогает в процессе разбития одного словаря на два. 6) Добавлен скрипт \work\ОКНО - ЧАСТОТА СЛОВ В ТЕКСТЕ - выводит список всех слов из текста с подсчетом их количества. Может пригодиться для анализа и сбора статистики.
Сообщение отредактировал tonio_k - Пятница, 16.12.2022, 23:39