Русские субтитры: "Подбор синонимов" - Скрипт для Subtitle Workshop - Русские субтитры

Перейти к содержимому

  • (2 Страниц)
  • +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

"Подбор синонимов" - Скрипт для Subtitle Workshop Смотреть всем, особенно тем кто пишет скрипты

#1 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Иконки сообщения  Отправлено 14 Ноябрь 2007 - 03:04

Написал скрипт для подбора синонима выделенного слова.

Имеется 2 способа выбора синонима.

  • Из списка.
    • 1.1) На левую панель SW под комбобокс "Скрипты OCR" помещается Текстовое поле ("ПОЛЕ СИНОНИМ") и список ("СПИСОК СИНОНИМОВ").
    • 1.2) При вводе текста в "ПОЛЕ СИНОНИМ", в "СПИСОК СИНОНИМОВ" добавляются его синонимы (если есть).
    • 1.3) При выделении текста, мышью или с клавиатуры, в поле "ТЕКСТ СУБТИТРА", он копируется в "ПОЛЕ СИНОНИМ".
    • 1.4) При выборе элемента из "СПИСОК СИНОНИМОВ", заменяется выделенный текст в поле "ТЕКСТ СУБТИТРА".

  • Из всплывающего меню.
    • 2.1) Если в поле "ТЕКСТ СУБТИТРА" есть выделенный текст и для этого текста есть синонимы, при клике правой кнопки мыши появляется всплывающее меню ("МЕНЮ СИНОНИМЫ").
    • 2.2) При двойном клике мышью на слове в поле "ТЕКСТ СУБТИТРА", также появляется всплывающее меню ("МЕНЮ СИНОНИМЫ").
    • 2.3) При выборе элемента из "МЕНЮ СИНОНИМЫ", заменяется выделенный текст в поле "ТЕКСТ СУБТИТРА".
Чтобы невозможно было запустить скрипт несколько раз, соответствующий ему пункт меню блокируется (или удаляется, что лучше не решил).

Есть одна проблема, нет словаря. В тестовых целях сделал маленький 28 слов, 8 групп.
---
Комплект поставки :):
  • - сам скрипт.
  • Прикрепленный файл  Synonyms_Dictionary.rar (352байт)
    Количество загрузок:: 47 - пример словаря (откомпилированный).
  • Прикрепленный файл  Synonyms_Dictionary_Source.rar (286байт)
    Количество загрузок:: 28 - пример словаря (исходники).
  • Прикрепленный файл  Synonyms_Dictionary_Compiler.rar (6,68К)
    Количество загрузок:: 30 - компилятор словаря, работает через командную строку. (Synonyms_Dictionary_Compiler.exe [/t] [file]) При запуске с ключем /t выводится информация о времени ушедшем на компиляция.
---
Отзывы, пожелания и замечания - приветствуются.

Прикрепленные файлы


0

#2 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 14 Ноябрь 2007 - 11:46

Просмотр сообщенияD!ig (14.11.2007, 1:04) писал:

Есть одна проблема, нет словаря.


Словарь есть, я уже конвертил тот, который предлагал Stevvie. Ввечеру буду дома, подгоню под твой формат.
0

#3 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 14 Ноябрь 2007 - 12:10

Просмотр сообщенияD!ig (14.11.2007, 1:04) писал:

[*] Прикрепленный файл attachment - сам скрипт.


Бегло просмотрел скрипт, пара замечаний.
а) функцию FindWord лучше переписать с бинарным поиском, иначе на большом словаре будет безбожно тормозить.
б) во время загрузки словаря массив лучше увеличивать не на единицу, а блоками (иначе на каждом цикле происходит копирование всего массива на новое место, что снижает быстродействие).
   if SplitToWord(line, w) then begin
	 SetArrayLength(Dic, GetArrayLength(Dic)+1); // увеличиваем словарь
	 Dic[GetArrayLength(Dic)-1] := w; // добавляем слово в конец массива
	 SetArrayLength(w.Synonyms,0);
	 w.value := '';	 
   end;


лучше переписать так:

const
   GROWSIZE = 500;
...
var
  Used : cardinal;
...
begin
  Used := 0;
.....
  
   if SplitToWord(line, w) then 
   begin
	 inc(Used);

	 if Used > GetArrayLength(Dic) then
		 SetArrayLength(Dic, GetArrayLength(Dic)+GROWSIZE); // увеличиваем словарь

	 Dic[Used] := w; // добавляем слово в текущую позицию
	 SetArrayLength(w.Synonyms,0);
   end;
...
   
   SetArrayLength(Dic, Used); // обрезаем неиспользованную пустоту
	
......

0

#4 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 14 Ноябрь 2007 - 15:12

Просмотр сообщенияBedaZzle (14.11.2007, 8:46) писал:

Словарь есть, я уже конвертил тот, который предлагал Stevvie. Ввечеру буду дома, подгоню под твой формат.
Словари синонимов - не проблема. Помимо относительно небольшого словаря Евгеньевой (кажется, это о нём писал Stevvie?), есть ещё "классика" в лице г-на Абрамова. И у меня где-то на дисках Абрамов (в текстовом виде) был... Не помню точно, но что-то около 1МБ текста. Нужно?
PS До самого скрипта руки пока не дошли. Вечером гляну...
0

#5 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 14 Ноябрь 2007 - 19:09

Просмотр сообщенияНуПогоди (14.11.2007, 13:12) писал:

И у меня где-то на дисках Абрамов (в текстовом виде) был... Не помню точно, но что-то около 1МБ текста. Нужно?


Давай конечно.
0

#6 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 15 Ноябрь 2007 - 01:32

Bedazzle сказал:

а) функцию FindWord лучше переписать с бинарным поиском, иначе на большом словаре будет безбожно тормозить.

Разумеется. B) Планы такие были.

Bedazzle сказал:

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

А таких планов не было. :fool:. Спасибо за идею.
А точно будет выгода? Ведь у элемента массива Dic есть свойство Synonyms, которое тоже массив динамический.

Bedazzle сказал:

Словарь есть, я уже конвертил тот, который предлагал Stevvie.

От программы Rhymes\Ривмовник? Или я что-то пропустил.
Я не понял какой там формат :(. Все что смог сделать, это выдрать сами слова. Но вручную словарь на ~25000 слов обрабатывать тяжело.

Bedazzle сказал:

Ввечеру буду дома, подгоню под твой формат.

Мой формат понятен?
0

#7 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 15 Ноябрь 2007 - 02:26

Просмотр сообщенияD!ig (14.11.2007, 23:32) писал:

А точно будет выгода? Ведь у элемента массива Dic есть свойство Synonyms, которое тоже массив динамический.


При любом изменении размера массива дельфи выделяет память под новый массив, копирует туда содержимое имеющегося и освобождает память.
Как думаешь - что будет работать быстрее - на сто тысяч строк тысячу раз увеличить массив, или сто тысяч раз его увеличивать? :)

Просмотр сообщенияD!ig (14.11.2007, 23:32) писал:

Мой формат понятен?


угу
0

#8 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 15 Ноябрь 2007 - 06:57

Просмотр сообщенияBedaZzle (15.11.2007, 1:26) писал:

При любом изменении размера массива дельфи выделяет память под новый массив, копирует туда содержимое имеющегося и освобождает память.
Как думаешь - что будет работать быстрее - на сто тысяч строк тысячу раз увеличить массив, или сто тысяч раз его увеличивать? :)

Епт, так я ж не об этом. В функции SplitToWord точно так же по одному элементу увеличивается массив Synonyms, который является полем элемента массива DIC. /*Каюсь, это такая оптимизация была*/ :blush: И сэкономив чуть-чуть на "увеличивать не на единицу, а блоками", продолжим очень много терять на увеличении массива Synonyms. Ну да ладно, это мелочь. :)
0

#9 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 15 Ноябрь 2007 - 10:38

Просмотр сообщенияD!ig (15.11.2007, 4:57) писал:

Епт, так я ж не об этом. В функции SplitToWord точно так же по одному элементу увеличивается массив Synonyms


Аааааа! Семён Семёныч! (С)
0

#10 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 15 Ноябрь 2007 - 14:16

@BedaZzle: Даю...
@D!ag: вчера бегло глянул на скрипт, нашёл много интересного. Прежде всего, откуда возникли pnlControl и mnuPascalScripts? Tы их по наитию нашёл? Если нет, то может покаешься :D перед народом: как? А то мне тоже хочицца. Интерес чисто жлобский: запускать те или иные функции SW-меню из скрипта - дело интересное. Ну а с точки зрения потребителя... Бросаются в глаза кое-какие недоделки в SplitToWord (если слово заканчивается знаками пунктуации, то они "прилипают" к слову). Опять же... Насколько я понял в любом словаре слова в именительном падеже единств. числа. Как с этим быть? Буквальный поиск тут не сильно поможет, надо придумывать что-то радикальное (может пару букв от "хвоста" слова отрезать и по оставшемуся искать синоним? как-то это не слишком уж кошерно..)
ПС. При английском интерфейсе SW слово в TEdit (Введите слово) пишется "козюбликами" (в принципе, это можно и пережить).

[EDIT] Вытер файл со словарём.
0

#11 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 15 Ноябрь 2007 - 16:41

Просмотр сообщенияНуПогоди (15.11.2007, 12:16) писал:

@BedaZzle: Даю...


кхм... я это дело конвертить в необходимый формат за......сь. :/
всё же чуть не обычным текстом написано :(

Просмотр сообщенияНуПогоди (15.11.2007, 12:16) писал:

откуда возникли pnlControl и mnuPascalScripts?


Win32dasm спасёт отца русской демократии. :)
0

#12 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 15 Ноябрь 2007 - 19:31

Просмотр сообщенияBedaZzle (15.11.2007, 13:41) писал:

кхм... я это дело конвертить в необходимый формат за......сь. :/
всё же чуть не обычным текстом написано :(

Текст как текст :unsure: Обычная карточная система, как и в большинстве словарей: слово и синонимы к нему (с пояснениями). Но если не подходит, то геморроиться с ним, конечно, не стоит... Сейчас вылезу и вытру, дабы форум не "упал" под грузом бесполезных мегабайтов.

Просмотр сообщенияBedaZzle (15.11.2007, 13:41) писал:

Win32dasm спасёт отца русской демократии. :)
А потом разбираться мегабайтах в 5-10 ассемблерного кода? :wacko: Я пока не готов читать все эти мувы, пуши и попы как детективный роман...
0

#13 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 15 Ноябрь 2007 - 21:15

Просмотр сообщенияНуПогоди (15.11.2007, 17:31) писал:

[EDIT] Вытер файл со словарём.


[EDIT]
Поздно, я уже успел украсть. :Р
0

#14 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 16 Ноябрь 2007 - 02:26

Просмотр сообщенияНуПогоди (15.11.2007, 13:16) писал:

Бросаются в глаза кое-какие недоделки в SplitToWord (если слово заканчивается знаками пунктуации, то они "прилипают" к слову).

Спасибо. Поправлю.

Просмотр сообщенияНуПогоди (15.11.2007, 13:16) писал:

Опять же... Насколько я понял в любом словаре слова в именительном падеже единств. числа. Как с этим быть? Буквальный поиск тут не сильно поможет, надо придумывать что-то радикальное (может пару букв от "хвоста" слова отрезать и по оставшемуся искать синоним? как-то это не слишком уж кошерно..)

Не еб.т :).
Значит в словарь надо добавлять сразу все варианты. Либо усложнять словарь, слово заменить на "начало+окончания". Теоретически это выполнимо.

Просмотр сообщенияНуПогоди (15.11.2007, 13:16) писал:

ПС. При английском интерфейсе SW слово в TEdit (Введите слово) пишется "козюбликами" (в принципе, это можно и пережить).

Можно его либо совсем убрать, либо выводить разные слова, в зависимости от языка SW.

-----

Просмотр сообщенияНуПогоди (15.11.2007, 13:16) писал:

Прежде всего, откуда возникли pnlControl и mnuPascalScripts? Tы их по наитию нашёл? Если нет, то может покаешься :D перед народом: как?

Цитата

Win32dasm спасёт отца русской демократии.

Ну Win32dasm для этого не нужен -_-.

SW написан на Delphi, Delphi хранит файлы в формате DFM (текст), при компиляции пихает этот DFM в ресурсы исполняемого файлы.

SW упакован UPX'ом.

Распаковываешь SW.exe (upx -d sw.exe). Открываешь SW.exe редактором ресурсов (Restorator, ResHacker, Exescope). Смотришь ресурс TFORMMAIN типа RCDATA.

-----
Раз пошла такая пьянка, может тему создать, куда свалить все, что доступно скриптам? (Выдрано из исходников IPS'a) Ключевые слова и функции уже выкладывал. Есть еще поддерживаемые классы, ну и имена контролов SW (pnlControl - например).

Правда не для всех методов есть описания синтаксиса. Например для ClientToScreen, не было, пришлось в Delphi смотреть. Описания TMenuItem тоже нет --> Delphi.Help.
Многие свойства и методы находятся внутри блоков условной компиляции, так что 100% гарантии, что они будут работать, нет.
-----
P\S\ В тему про Ёжефикатор кто-нибудь ответьте, а то форум посты объединяет.
0

#15 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 16 Ноябрь 2007 - 12:03

Просмотр сообщенияD!ig (16.11.2007, 0:26) писал:

Раз пошла такая пьянка, может тему создать, куда свалить все, что доступно скриптам?


дык создавай, разве кто за руку держит? :)

Просмотр сообщенияD!ig (16.11.2007, 0:26) писал:

P\S\ В тему про Ёжефикатор кто-нибудь ответьте, а то форум посты объединяет.


есть
0

#16 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 16 Ноябрь 2007 - 13:39

Просмотр сообщенияD!ig (15.11.2007, 23:26) писал:

Раз пошла такая пьянка, может тему создать, куда свалить все, что доступно скриптам? (Выдрано из исходников IPS'a) Ключевые слова и функции уже выкладывал. Есть еще поддерживаемые классы, ну и имена контролов SW (pnlControl - например).

Не мусорить в разных темах, а создать новую и обсуждать все 'абстрактные' возможности скритов - очень здравая идея! Логично было бы такую тему сделать sticky - ибо всем 'писателям' будет полезна. Bedazzle, это ведь в твоих хрупких силах? Хотя я, конечно, не настаиваю...

Просмотр сообщенияD!ig (15.11.2007, 23:26) писал:

Распаковываешь SW.exe (upx -d sw.exe). Открываешь SW.exe редактором ресурсов (Restorator, ResHacker, Exescope). Смотришь ресурс TFORMMAIN типа RCDATA.
Про UPX я догадался (и даже уже пытался поковыряться в UPX-распакованном варианте SW), а вот про остальное не знал. Спасибо, посмотрю на досуге...
0

#17 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 16 Ноябрь 2007 - 14:03

Просмотр сообщенияНуПогоди (16.11.2007, 11:39) писал:

Не мусорить в разных темах, а создать новую и обсуждать все 'абстрактные' возможности скритов - очень здравая идея! Логично было бы такую тему сделать sticky - ибо всем 'писателям' будет полезна. Bedazzle, это ведь в твоих хрупких силах?


замутил
0

#18 Пользователь офлайн   НуПогоди Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Избранные
  • Сообщений: 832
  • Регистрация: 31 Июль 06
  • Страна:
  • Прислал(a) субтитров: 46
  • Своих переводов: 19

Отправлено 16 Ноябрь 2007 - 15:32

Просмотр сообщенияBedaZzle (16.11.2007, 11:03) писал:

замутил

Данке шён, но... Раз ты - счастливый обладатель исходников SubtitleAPI, может, с них бы и начал? Всякие там FreeLibrary, ExitProcess, WriteFile, GetStdHandle, MessageBox (кстати, есть там такое? мне названия этих функций Boomerang показывает)?
0

#19 Пользователь офлайн   BedaZzle Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Admin
  • Сообщений: 2 987
  • Регистрация: 22 Октябрь 02
  • Страна:
  • Прислал(a) субтитров: 98
  • Своих переводов: 16

Отправлено 16 Ноябрь 2007 - 20:41

Просмотр сообщенияНуПогоди (16.11.2007, 13:32) писал:

Данке шён, но... Раз ты - счастливый обладатель исходников SubtitleAPI, может, с них бы и начал?


Не понимаю зачем хакать SAPI, если все сырцы имеются. :)
Или предлагаешь внедряться в воркшоп через дллку?
0

#20 Пользователь офлайн   D!ig Иконка

  • Иконка
  • Отправить ЛС
  • Группа: Members
  • Сообщений: 140
  • Регистрация: 11 Март 06
  • Страна:

Отправлено 17 Ноябрь 2007 - 03:16

Цитата

Всякие там FreeLibrary, ExitProcess, WriteFile, GetStdHandle, MessageBox (кстати, есть там такое? мне названия этих функций Boomerang показывает)?

Это API функции импортируемые библиотекой/исполняемым файлов. Из скриптов они не доступны.

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

Если бы тебе показали "function FreeLibrary(hLibModule: HMODULE): BOOL; stdcall; external kernel32 name 'FreeLibrary';", то есть со всеми или хотя бы частью параметров, то тогда, возможно ее можно вызвать из скрипта.

Цитата

Данке шён, но... Раз ты - счастливый обладатель исходников SubtitleAPI, может, с них бы и начал?

Действительно "раз ты - счастливый обладатель исходников SubtitleAPI", может хедером поделишся? :unsure:

Просмотр сообщенияBedaZzle (16.11.2007, 19:41) писал:

Или предлагаешь внедряться в воркшоп через дллку?

Я думал Loader написать, Loader+Helper'ы, но можно и дллку, правда не занимался этим ни разу.

Еще идейка была патчик, небольшой, как нибудь сварганить, для реализации автоматической загрузки скрипта, а из него уже можно и остальные будет грузить. Вставить код перед кодом регистрации типов файлов, найти это место наверно не сложно.

------
По поводу усложнения словаря. Вот такой вариант нарисовался.
Придется хранить все словоформы, но ...
Есть массив составных частей.
Есть словарь синонимов (Сейчас array of TWord).
Изменить тип TWord
сечас: record(value: string(само слово); synonyms: array)

на TWord = record (value: array (индексы на массив составных частей); synonyms: array.


Это должно решить проблему с разными окончаниями и на скорости не сильно скажется.
-----

Скрипт, кстати поправил:
  • Прикрутил бинарный поиск (пол дня искал, шо таке), оказалась именно то, что и так собирался делать.
  • Поправил прилипание знаков пунктуации к словам.
  • Прикрутил возможность локализации, при загрузке язык устанавливается такой же как у SW, а как отловить изменение в процессе работы не знаю. Менять обработчик onclick для меню Languages, как-то страшно, непонятно как потом стандартный вызвать, но может и получится. По ходу обнаружилась одна проблема, SW не сохраняет настройки, никакие. Читать, читает. Если конфиг убить, новый не создает. Если очистить содержимое конфига, новые данные запишет, но только 1 раз.
  • Из-за бинарного поиска случился Dispell Magic :). Походу обнаружился странный эффект, при сравнении строк. Сравниваю 'абориген' и '$version', слово начинающееся на знак препинания всегда больше, что не правильно имхо.
    В связи с этим решил добавить спец. слова. К сейчас имеющимся $author, $version, можно добавить чего нибудь еще $time, $date например.

0

  • (2 Страниц)
  • +
  • 1
  • 2
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему