Обновление скрипта "Поиск по набору регэкспов" для FBE - тестируем!

Дошли руки существенно дополнить, обновить, почистить и структурировать по смыслу скрипт "Поиск по набору регэкспов" для Fiction Book Editor (FBE).

Автор этого скрипта (как и многих других скриптов для FBE) - Sclex, за что ему отдельное гран мерси.

Наполнение скрипта мое, Sclex-а + учтены все возможные пожелания книгоделов из двух старых здешних тем:

Типичные ошибки распознавания...
https://lib.rus.ec/node/268750
и
Курьезы сканировщика:
http://lib.rus.ec/comment/372489

Пользоваться и тестировать могут все желающие, отзывы, примеры, предложения по улучшению категорически приветствуются.

Просьба приводить конкретные примеры:

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

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

Ссылка на последнюю версию скрипта (30-09-2019):

https://my-files.ru/p1yq7v

альтернативные ссылки:
https://ru.files.fm/u/j76r8q44
https://anonfiles.com/Yae3t470n2/17_TaKir-Sclex-30-09-2019_js
https://www25.zippyshare.com/v/GgMyWsRc/file.html

Заменить этим файлом имеющийся файл (или положить новый вариант скрипта рядом) в папке:
... /Fiction Book Editor/Scrips/06_Чистка

Скрипту удобнее назначить горячую клавишу F2 (меню: Сервис-Настройки-Клавиши-Скрипты-Поиск по набору регэкспов).

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

По мере накопления отзывов о работе скрипта, планирую периодически пополнять скрипт и выкладывать обновленную версию.

P.S. На Флибусте открыта аналогичная тема, можно писать в любую.
http://www.flibusta.is/node/441303

Комментарии

Антонина82 написал:
ProstoTac написал:
Мне кажется лишним срабатывание скрипта на знаки препинания в конце сток в эпиграфах и стихах.

+100500

Это можно легко исправить. Но если в эпиграфе на прозе разрыв абзаца, то пусть так и остаётся?
Аватар пользователя Антонина82

TaKir написал:
Антонина82 написал:
ProstoTac написал:
Мне кажется лишним срабатывание скрипта на знаки препинания в конце сток в эпиграфах и стихах.

+100500

Это можно легко исправить. Но если в эпиграфе на прозе разрыв абзаца, то пусть так и остаётся?

Да. Стихотворения гораздо чаще встречаются в моей работе. И на каждой строке срабатывает скрипт. Мне это не подходит. Как убрать, подскажите.

Антонина82 написал:
TaKir написал:
Антонина82 написал:
ProstoTac написал:
Мне кажется лишним срабатывание скрипта на знаки препинания в конце сток в эпиграфах и стихах.

+100500

Это можно легко исправить. Но если в эпиграфе на прозе разрыв абзаца, то пусть так и остаётся?

Да. Стихотворения гораздо чаще встречаются в моей работе. И на каждой строке срабатывает скрипт. Мне это не подходит. Как убрать, подскажите.

Допишите (открыв блокнотом файл скрипта) в соответствующих строках пробел -epigraph и сохраните файл скрипта.

tagRegExp("(?<=<мы-не-внутри-тэга>)([^\»….,:;!\?]|[—–,-])<впереди-закр-тэги-но-не-A>$","","Найдено: концы строк без точек","-title -subtitle -stanza -poem -epigraph");

tagRegExp("(?<=(^|\>)[^\<]*)([^\»….,:;!\?]|[—–,-])()[A-Za-z]+(/s+[^>]+)?>)*$","","Найдено: концы строк без точек","-title -subtitle -stanza -poem -epigraph");

tagRegExp("(?<=(^|\>)[^\<]*)([—–-])()[A-Za-z]+(/s+[^>]+)?>)*$","","Найдено: подозрительные концы строк в стихах","-title -subtitle -epigraph");

addRegExp("^[a-zа-яё]","","Найдено: маленькие буквы в начале строки","-stanza -poem -epigraph");

А если в эпиграфе на прозе разрыв абзаца такой выбрык автора? А если в качестве эпиграфа стихи?

Аватар пользователя V_E

Тема обсуждения этого скрипта, похоже, завершилась, тем не менее, хочу поделиться результатами проделанной работы, хотя зачем я с нею связался - самому непонятно.
Исходные данные: взял книгу, сделанную не мною, но совершенно, на мой взгляд, не вычитанную. Книга художественная (детектив). Первый раз вычитал сам, затем начал проверку с помощью обсуждаемого скрипта.
Результаты:
Из 305 срабатываний, действительными (т.е., когда скрипт фиксировал подлинную ошибку) оказались 166, т.е. около 50% Хорошо это или плохо, судить не берусь, излагаю только факты. Значительное число правильных срабатываний было связано с обнаружением пробела после окончания абзаца, т.е. записи в коде типа: конец последнего предложения абзаца. тег конца абзаца (/p)
Это, на мой взгляд, полезно, так как визуально в читалке такой пробел виден не всегда, но может напугать. Помню, открыл одну книгу в CR3, а там в конце каждого абзаца стоит вопросительный знак. Именно потому что пробел между точкой и тегом конца абзаца не убран.
Были и другие правильные срабатывания, но этот - наиболее незаметный при вычитке, особенно когда читаешь с телефона.
Что же касается ложных срабатываний, то здесь картина следующая. Привожу перечень ситуаций в которых скрипт фиксировал возможную ошибку:
нос ( слово нос - у человека, животного или у корабля)
нотам (дательный падеж слова нота)
Итак (вводное слово, с которого часто начинаются рассуждения или выступления: "Итак, мы начинаем!"
из будки (слово будки выделено как возможная ошибка)
будку (винительный падеж слова будка)
рот
ею (об этом я уже писал, но в этой книге, поскольку там фигурировали женщины, это слово встречалось очень часто).
бюстгальтер (выделяет сочетание тг)
Иди (в выражении: Лео! Иди сюда! и в начале диалога: — Иди же, Лео!)
во фрагменте: "...продолжал Дарси, — Джонни видели в..." скрипт выделил сочетание , — Д полужирным сделал я, чтобы было понятнее, о чем речь.
лег (рано лег спать)
смят (смятую сигарету)
нес (он нес два свертка)
вес (политический вес)
оказать (оказать услугу)
пули (не услышал свиста пули)
однако то (однако то и дело оглядывался)
Лас (Лас-Вегас)
будь то (будь то комната в полицейском управлении или вилла)
оп (сопротивляется)
пищу (скудную пищу)
йя (Гавайях)
оео (своеобразном положении)
ияе (солнышко сияет)
яй (из одной яйцеклетки)
ему то (ему то же, что и)
двигался то (двигался то туда, то сюда)
проделывает то (проделывает то же самое)

Повторюсь, никаких выводов и рекомендаций давать не буду, но на один момент думаю, обязательно следует обратить внимание, поскольку скрипт не заметил такую ошибку:
был открыт,‘будто

Аватар пользователя alexej36

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

"Генеральная уборка" их бы благополучно съела. Ее стоит запустить раньше чем "Поиск по набору регэкспов". Иначе много ненужной работы.
Да, "Найдено: 3 (4) и более гласных подряд" в топку. Очень много ненужных срабатываний "Проверка орфографии" несуществующие слова покажет.
Аватар пользователя V_E

alexej36 написал:

"Генеральная уборка" их бы благополучно съела.

Обычно я код чищу "поиском и заменой", но в этот раз ограничился ручной вычиткой, интересно было набрать статистику по работе скрипта.

1. Про "Генеральную уборку" не факт. Ни она (ГУ), ни "Поиск по набору..." не убирают "левые" пробелы юникода с U+2000 до U+200F, из которых только 2009 является приемлемым. Недавно обнаружил такое после конвертации из .DOCX (встречаются нужные файлы/книги в таком формате) в FB2, про просмотре файла в режиме "код".
2. Да, "Найдено: 3 (4) и более гласных подряд" в топку - не согласен, спорный вопрос.
3. Да, в чем-то "Поиск по набору..." дублирует некоторые скрипты, которые нужно запускать раньше, чем "Поиск по набору...". Но лучше пусть так, несомненная польза от "Поиск..." есть.

ProstoTac написал:
не убирают "левые" пробелы юникода с U+2000 до U+200F, из которых только 2009 является приемлемым. Недавно обнаружил такое после конвертации из .DOCX (встречаются нужные файлы/книги в таком формате) в FB2, про просмотре файла в режиме "код".
И правильно делает, что не убирает :-) Ибо не заложено в ём ума и сообразительности, чтобы еще и юникоды по правильному отображению определять. Надо не зацикливаться на "Теле", а почаще в код заглядывать, там не только пробелы, еще и дефисы могут быть некошерные, которые в читалках отобразятся "квадратиками", а в самом FBE, если не смотреть в код, все вроде бы ОК. С другой стороны, поиск/замена этих "квадратиков" осуществляется в коде корректно, поэтому все претензии/предложения к девелоперам FBE, скрипт вряд ли сможет распознать обычный дефис и из расширенной латыни A/B, равно как и другие коллизии в рамках юникода. Кстати, пока разбирался с юнкодами, пришлось переделать в FBE отображение неразрывных пробелов, сейчас у меня там выбор из ¦ (00A6), евроцента (00A2) и плюсминуса (00B1) из набора доп-латиницы (0080-00FF), поскольку что хочется из символов не получается воткнуть, не будет корректно отображаться. Как могли девелоперы выбрать "Символы для рисования рамок" для пробела - тайна сия велика есть.
Вот здесь можно постичь тайны юникода - https://unicode-table.com/ru/#control-character

GMAP написал:
Надо не зацикливаться на "Теле", а почаще в код заглядывать, там не только пробелы, еще и дефисы могут быть некошерные, которые в читалках отобразятся "квадратиками", а в самом FBE, если не смотреть в код, все вроде бы ОК. С другой стороны, поиск/замена этих "квадратиков" осуществляется в коде корректно,

Если есть пример текста, можно добавить в поиск скриптом таких вариантов.

ProstoTac написал:
1. Про "Генеральную уборку" не факт. Ни она (ГУ), ни "Поиск по набору..." не убирают "левые" пробелы юникода с U+2000 до U+200F, из которых только 2009 является приемлемым. Недавно обнаружил такое после конвертации из .DOCX (встречаются нужные файлы/книги в таком формате) в FB2, про просмотре файла в режиме "код".

Если есть пример текста, можно добавить в поиск скриптом таких вариантов.

TaKir написал:
ProstoTac написал:
1. Про "Генеральную уборку" не факт. Ни она (ГУ), ни "Поиск по набору..." не убирают "левые" пробелы юникода с U+2000 до U+200F, из которых только 2009 является приемлемым. Недавно обнаружил такое после конвертации из .DOCX (встречаются нужные файлы/книги в таком формате) в FB2, про просмотре файла в режиме "код".

Если есть пример текста, можно добавить в поиск скриптом таких вариантов.


Простите великодушно - там не поиск вариантов, там тупая "поиск-замена".

ProstoTac написал:
TaKir написал:
ProstoTac написал:
1. Про "Генеральную уборку" не факт. Ни она (ГУ), ни "Поиск по набору..." не убирают "левые" пробелы юникода с U+2000 до U+200F, из которых только 2009 является приемлемым. Недавно обнаружил такое после конвертации из .DOCX (встречаются нужные файлы/книги в таком формате) в FB2, про просмотре файла в режиме "код".

Если есть пример текста, можно добавить в поиск скриптом таких вариантов.


Простите великодушно - там не поиск вариантов, там тупая "поиск-замена".

Для выполнения "тупая "поиск-замена", нужно хотя бы узнать, какие конкретно "кривые" символы есть в тексте. потому и прошу пример текста.

TaKir написал:
потому и прошу пример текста.
http://fb13.online/b/681314
Это уже оптимизированная книга, но в оригинале было то же самое, Aleks_Sim поленился заглянуть в код, поэтому литресовские ошибки юникода так и остались: из торгсиновских 1930-вот здесь вместо правильного дефиса символ U+2010, тоже дефис, но который в читалках и коде FBE отображается "квадратиком".
P.S. Если мало, вот еще один пример http://fb13.online/b/627504 где перед каждым закрывающим тегом </p> впендюрен U+3000
Аватар пользователя alexej36

Или:
http://lib.rus.ec/b/627504
U+300 заменить на ничего. "Регулярные выражения" вкл. Выявить проблему помог "Поиск по набору регекспов". Впрочем как и прежняя его версия.

alexej36 написал:
Или:
http://lib.rus.ec/b/627504
U+300 заменить на ничего. "Регулярные выражения" вкл. Выявить проблему помог "Поиск по набору регекспов". Впрочем как и прежняя его версия.

Наверное, такое лучше в генуборку бы запихнуть.

TaKir написал:
лучше в генуборку бы запихнуть.
Лучше поиск символов в диапазоне U+2000 до U+2C7F(???, если не до 2FFF) и от U+3000 и до U+3FFF(???), детали поиска могут варьироваться, поскольку туда много чего попадает из числа теоретически нужного, хотя и не для беллетристики. Но меня терзают смутные сомнения, что кто-либо, кроме самих девелоперов, может это сделать. Дело в отображении UTF-8/UTF-16, когда один и тот же текст имеет совершенно разные коды. Дефис может выглядеть в хексе как 3E 80 80, а может 20 10 и так далее. Есть один редактор, который поможет понять что есть юникод вообще, юникодные косяки и как их править - Super Unicode Editor Разумеется, он отучен от требований чего бы то ни было (у меня) :-) А сама технология замены одного на другое проста и даже примитивна.

GMAP написал:
TaKir написал:
лучше в генуборку бы запихнуть.
Лучше поиск символов в диапазоне U+2000 до U+2C7F(???, если не до 2FFF) и от U+3000 и до U+3FFF(???), детали поиска могут варьироваться, поскольку туда много чего попадает из числа теоретически нужного, хотя и не для беллетристики. Но меня терзают смутные сомнения, что кто-либо, кроме самих девелоперов, может это сделать. Дело в отображении UTF-8/UTF-16, когда один и тот же текст имеет совершенно разные коды. Дефис может выглядеть в хексе как 3E 80 80, а может 20 10 и так далее. Есть один редактор, который поможет понять что есть юникод вообще, юникодные косяки и как их править - Super Unicode Editor Разумеется, он отучен от требований чего бы то ни было (у меня) :-) А сама технология замены одного на другое проста и даже примитивна.

Можно попробовать в лоб ловить вот так (у меня работает):
addRegExp("[^A-Za-zА-яЁё0-9(/[.,\/#!$%\^&\*;:{}=\-_`~()\\x20\\xA0\\t\\n\\r\\f«»„“\"…–'®—§º+№-]","","Найдено: Странные нетекстовые символы");

Понятно, что можно в любой момент пополнять этот перечень
Как задать поиск целиком диапазона - пока не знаю...

TaKir написал:
GMAP написал:
TaKir написал:
лучше в генуборку бы запихнуть.
Лучше поиск символов в диапазоне U+2000 до U+2C7F(???, если не до 2FFF) и от U+3000 и до U+3FFF(???), детали поиска могут варьироваться, поскольку туда много чего попадает из числа теоретически нужного, хотя и не для беллетристики. Но меня терзают смутные сомнения, что кто-либо, кроме самих девелоперов, может это сделать. Дело в отображении UTF-8/UTF-16, когда один и тот же текст имеет совершенно разные коды. Дефис может выглядеть в хексе как 3E 80 80, а может 20 10 и так далее. Есть один редактор, который поможет понять что есть юникод вообще, юникодные косяки и как их править - Super Unicode Editor Разумеется, он отучен от требований чего бы то ни было (у меня) :-) А сама технология замены одного на другое проста и даже примитивна.

Можно попробовать в лоб ловить вот так (у меня работает):
addRegExp("[^A-Za-zА-яЁё0-9(/[.,\/#!$%\^&\*;:{}=\-_`~()\\x20\\xA0\\t\\n\\r\\f«»„“\"…–'®—§º+№-]","","Найдено: Странные нетекстовые символы");

Понятно, что можно в любой момент пополнять этот перечень
Как задать поиск целиком диапазона - пока не знаю...

Вот такой вариант вполне рабочий получился:
addRegExp("[^\u0400-\u04FF\u0020-\u007F\u0100-\u017F\u00A0-\u00FF\u0370-\u03FF(/[\\x20\\xA0\\t\\n\\r\\f„“–\…—№-]","","Найдено: Странные нетекстовые символы");

Просьба тестировать.

Добавил в основной скрипт вот такой блок:

// Ищем все, кроме разрешенных букв, цифр и знаков препинания

// \u0400-\u04FF - кириллический диапазон Юникод символов
// \u0020-\u007F - латинский диапазон Юникод символов
// \u0100-\u017F - расширенный латинский диапазон Юникод символов (Latin Extended-A)
// \u0180-\u024F - расширенный латинский диапазон Юникод символов (Latin Extended-B)
// \u00A0-\u00FF - диапазон Юникод символов (Latin-1 Supplement)
// \u0370-\u03FF - греческий диапазон Юникод символов
// \u2200-\u22FF - математический диапазон Юникод символов
// \u2150-\u218F - дроби диапазон Юникод символов

addRegExp("[^\\u0400-\\u04FF\\u0020-\\u007F\\u0100-\\u017F\\u0180-\\u024F\\u00A0-\\u00FF\\u0370-\\u03FF\\u2200-\\u22FF\\u2150-\\u218F\\x20\\xA0\\t\\n\\r\\f„“–\…—№-]","","Найдено: Странные нетекстовые символы");

При необходимости всегда можно добавить или убрать какой-либо диапазон.
Брал отсюда:
https://unicode-table.com/ru/

Как обычно, за помощь спасибо Sclex!

Аватар пользователя V_E

TaKir написал:

Как обычно, за помощь спасибо Sclex!

Как-то подумалось, а, может, имеет смысл сделать отдельную тему, где публиковались бы регулярные выражения для решения тех или иных проблем с вычиткой. Все-таки скрипт, он и есть скрипт. Читал тут, давеча одну книгу, так в ней почему-то слово "поиск" с вариантам типа "в поиске", "поиску" и т.д. было заменено на войско. А если учесть, что книга была военная и слово войско в своем правильном значении и с вариантами типа "войсковой" встречалось чуть ли не каждой странице, то просто поиском с заменой ситуацию было не исправить. Я так понимаю, что эта ситуация - тоже результат работы какого-нибудь универсального скрипта, который чистил книгу "на автомате". Поэтому, мне кажется, неплохо было бы иметь набор регулярных выражений для решения отдельных, частных проблем, чтобы не запускать универсальные скрипты, которые могут накосячить, а заметишь это не сразу. Многое, наверное, можно выдернуть из тестируемого скрипта в нем же, насколько я понимаю, те же регулярные выражения используются?

V_E написал:

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

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

V_E написал:

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

Это вам так кажется. Очень и очень вряд ли это работа какого-либо скрипта после распознавания исходного текста.

V_E написал:

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

Данный скрипт накосячить не может вообще, поскольку он ничего не правит в принципе.

А надергать отдельных регэкспов из данного скрипта - нет проблем, в нем все расписано, что и зачем делается.

Аватар пользователя V_E

TaKir написал:
Данный скрипт накосячить не может вообще, поскольку он ничего не правит в принципе.

Этим он меня и заинтересовал. Но все-таки промахов, мне кажется слишком много. Впрочем, "будем посмотреть" (В. Каверин). Наработаем статистику на разных типах книг.

не знаю, было или нет.
фобы гробы, фанаты гранаты

Страницы

X