Артефакт

О «мертвых» текстах / 2o февраля 2007 г.

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

...Sandy frowned,·as·we·returned·|\,..to the 1iving·¶
room········with···its·heavy¶
white·**\\and·b1ack·furniture·and·white·rug."We!re·¶
looking·for············../|···············¶
a·bigger·house·((wi4h·at·least·14·rooms."She·¶
deposited·¶
a·none-to0-eager .. Dodd·back·¶
on·the·········¶
couch%·%with·the·nursemaid·and·vainly·tried·¶
to·convince·him·-__the·man·spieling·¶
a·commercial·on·the·TV·was"Daddy."Dodd·didn^t^^...·¶

Это всего-навсего плохая бумага с мушиными точками плюс сканирование с неправильно выбранными уровнями яркости и контраста. Ну и, конечно, распознавание класса «на кого бог пошлёт». Связываться ли с такими текстами? Стоят ли они многодневной работы? Каждый, конечно, в таких случаях принимает решение самостоятельно.

Библиотекарю приходится решать быстро. Если это г-н Дэн Браун, то он, конечно, идёт в баню. Если мы имеем дело с действительно ценным текстом, то можно повозиться и с худшим качеством. В промежуточных вариантах, которых, как известно, большинство, остаётся определить, поддаётся ли текст автоматической обработке, после которой его можно будет пробежать одним глазом, выискивая явные ляпы. Если поддаётся — почему бы и нет?..

Давайте рассмотрим «несмертельные» уродства. И подумаем, что с ними делать.

Отсутствие абзацной разбивки

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

Небольшое замечание: перед любыми манипуляциями с текстом стоит сперва заменить ^l на ^p, особенно если вы имеете дело с текстом, взятым из интернета.

1. Условная разбивка

Пример (библиотека Мошкова):

·····Чуть··позади··дамы,··терпеливо··дожидаясь¶
своей··реплики,··стоял·высокий¶
мужчина·в··сизовато-сером·дакроновом·костюме,--¶
коего·Муруган·приветствовал¶
как·мистера·Баху. Не·выходя·из-за·кулис,·мистер¶
Баху·молча·поклонился.¶
·····Муруган·обратился··к···матери.¶
·····-- Ты··пришла··сюда·пешком?·-·недоверчиво¶
и·с··заботливым·восхищением¶
спросил·он.·Подумать·только·--·идти·пешком!·Да¶
она·настоящая··героиня!··--¶
Весь·путь?¶
·····--··Весь··путь,·дитя·мое,--··отозвалась¶
дама··с··игривой··нежностью.¶

С таким текстом легко иметь дело. Проводим три замены:

Строка поиска Строка замены опция Use Wildcards Комментарий
·{5}  $$$  включена Запоминаем все настоящие абзацы
^p  пробел  выключена Убираем все псевдоабзацы
$$$  ^p  выключена восстанавливаем абзацы
·{2;}  ·  включена убираем множественные пробелы

В результате получаем безусловную разбивку, что и требовалось. Дальше приступаем к обработке тире, кавычек и т. д. Не big deal.

Кстати, давайте-ка договоримся отныне всегда обозначать пробел вот такой весёлой замечательной точкой в центральной позиции («·»), которую довольно трудно с чем-то спутать.

А если цепочки пробелов, обозначающих красную строку, нет?

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

Строка поиска Строка замены опция Use Wildcards Комментарий
·{2;}  ·  включена Убираем множественные пробелы
^p·  ^p  выключена Убираем последний оставшийся пробел в начале абзаца
·^p  ^p  выключена «...» в конце абзаца
([а-яё])^13([а-яё])  \1·\2  включена Убираем (заменяем пробелом) знак конца абзаца, если перед ним и после него стоят строчные буквы
([А-ЯЁ])^13([а-яё])  \1·\2  включена «...», если следующий абзац начинается со строчной буквы
([а-яё])^13([А-ЯЁ])  \1·\2  включена «...», если предыдущий абзац заканчивается строчной буквой
([\,\;\:\-])^13([!^13])  \1·\2  включена «...», если перед ним стоит знак препинания, который не может завершать предложение, а следующий за ним символ — не знак конца абзаца (считаем, что заголовок, который в нашем случае отбивается сверху и снизу пустыми строками, может оканчиваться чем угодно)

Строки 5 и 6 нужны потому, что в VBA-реализации регулярных выражений отсутствует синтаксис «(expr1)|(expr2)». По крайней мере, я его не знаю, но буду очень рад узнать от вас. Кроме того, возможна ситуация, когда и перед знаком конца абзаца, и после него стоят прописные буквы: имеется в виду, например, набранный прописными заголовок.

Довольно странными могут показаться строки 1–3. Казалось бы, почему не сделать вот так, сэкономив одну замену:

Строка поиска Строка замены опция Use Wildcards Комментарий
^13·{1;}  ^13  включена Убираем все пробелы в начале абзаца
·{1;}^13  ^13  включена «...» в конце абзаца

Ан нет, не получится. Вернее, получится, но... MS Word почему-то обнуляет отбивку слева (Left Indent) у всех абзацев, которых касается замена с использованием ^13. Этот баг (?) переходит из версию в версию. Может быть, он исправлен в Office 2007, пока не ставил, не знаю. Знаете — напишите.

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

2. Безусловная разбивка

Решение задачи с «разорванными» абзацами в случае безусловной разбивки, в конечном счёте, сводится к изложенному выше: к сожалению, при отсутствии leading spaces безошибочно определить, какие абзацы настоящие, а какие — нет, не представляется возможным.

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

Отдельный вопрос — встречающиеся иногда «жёсткие» переносы. Если все они попадают на концы «псевдоабзацев», или хотя бы выглядят примерно вот так — «пере·-нос», или представляют собой символы, похожие на дефис, но с другим кодом — с ними несложно справиться. А вот если это обычные дефисы, беспробельно («пере-нос») натыканные в тексте, — с такими текстами лично я дружить отказываюсь.

«Прилипшие» тире, они же дефисы

Сравните три строки текста.

1. «...ну,·а·как·оно·дальше·пойдёт·-·видно·будет.»
2. «...ну,·а·как·оно·дальше·пойдёт·-видно·будет.»
3. «...ну,·а·как·оно·дальше·пойдёт-видно·будет.»

Первый случай — просто замечательный. Исправляется автозаменой. Второй... тут всё зависит от регулярности. Есть все тире в документе отбиты пробелом справа, а слева пробела нет — этому горю тоже несложно помочь. А вот третий случай...

Сидит посередине слова дефис. Отличить его от дефиса, законно занимающего своё место, не представляется возможным. Поэтому — или ручками, или в баню.

На всякий случай рекомендую напоследок посмотреть на этот дефис поближе. Он может только выглядеть соответственно, а код этого «дефисоподобного» символа может оказаться совсем другим. И тогда, конечно, в доме и сердце корректора наступает тихий маленький праздник. ;-)

Страшно тебе, ослик?..

Помните об одном: главное — не убить текст в процессе правки.

К примеру, обнаружили вы, что автор (или, что интереснее, предыдущий корректор) решил, что все apprearances местоимения «вы» должны писаться с гордой прописной буквы. А вам теперь это расхлёбывать.

Как человек решительный, вы сразу же жмёте Ctrl+H, вводите в строке поиска, например, «·Вы», в строке замены — «·вы», любуетесь тем, что получилось, честно сохраняете документ и закрываете Word. И внезапно понимаете, что «приплыли».

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

«...оставил·надежду.·выйдя·за·порог,·...»,
«...памяти·Владимира·высоцкого...»,
«глава·тобольского·отделения·выМС объявил...»...

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

Поэтому всегда ведите учёт версий. И никогда не закрывайте Word, не убедившись, что ваше последнее действие не испортило всё и сразу. В Word, знаете ли, есть очень интересная функция: Ctrl+Z. Помогает иногда даже в безнадёжных случаях вроде «ой, я что-то нажала, а оно потемнело и всё исчезло».

И перед любой автозаменой пробуйте учесть все возможные варианты. Не забывайте, что главное условие возможности автозамены — регулярность. Будьте уверены в повторяемости только что придуманного вами шаблона для строки поиска. А не уверены, так пройдитесь сперва по тексту простым Find, да посмотрите, что отыщется.

А жаль всё-таки, что в VBA нельзя написать что-то вроде «^(\s+)|(\s+)$». А может быть, можно?..

Макросы к статье

repairSpacedParagraphs (условная разбивка с пробелами)
repairHiddenParagraphsRus (условная разбивка без пробелов)

...

«Введение» | «Форматирование абзацев»

Новости раздела

18 ноября 2020 г.
Комплектация библиотеки файлами .fb2

Ещё на сайте

Библиотека
Языки
Друзья
Канада
Авторский угол

Интернет

CPAN
Citforum
W3C.org
useit.com
Типомания
Code Charts
ру/ководство
Лаборатория dk
WebReference.com
Спецификация Perl
Заметки HTML-кодера
Анатомия Adobe Photoshop
The Apache Software Foundation


Рейтинг@Mail.ru

wordpress statistics

Рейтинг@Mail.ru