Лого на страниците (малко).

Заглавна страница > Четива > Четива за глотометрията > cream в режим „expert“ > Обратен (a tergo) речник

 

Александър Иванов

cream в режим „expert“

Обратен (a tergo) речник

Латинското a tergo означава „откъм гърба“, та в обратните речници думите са подредени „откъм гърба“ — най-напред са думите, завършващи на , след това — думите, завършващи на и т. н. През 1975 г. Институтът за български език издава Обратен речник на съвременния български език, който е правен „ръчно“, като в него има и известна сводна информация към преди това издадени речници.

Смисълът от такава подредба е, че — общо взето — наставките и окончанията се събират на едно място. Ако към такъв речник се прибави и количествена информация, направата му придобива още повече смисъл.

За да направите обратен речник от един текст (добре редактиран), първо го превърнете в списък от лекси, махнете пунктуацията, празните редове и препишете текста с малки букви (ако е необходимо). Запишете го и използвайте програмата филтър rev (от англ. reverse):

:%!rev

Готово! Думите в списъка са „обърнати“. Сега е моментът да се научите да четете отдясно наляво. Едно време в печатниците всеки метранпаж го можеше — без това умение просто не можеше да станеш метранпаж. При това метранпажът можеше да чете текста и отдолу нагоре.

Подредете списъка по азбучен ред, използвайте uniq -c, за да създадете честотите, и разместете двете колони. Имаме си обратен фреквентен речник.

Но сега се сблъскваме с един проблем — не можем да използваме пак програмката rev, защото трябва да обърнем само лексите до табулатора, а не целия ред. Едно от възможните решения, което ми се струва най-лесно, е следното:

:%s:\(^[^\t]\+\):\=join(reverse(split(submatch(0), '\zs')), ''):

Всъщност това си е търсене и заместване — нещо, което непрекъснато правим. Търсим от началото на реда всякакъв символ, който е различен от табулатора, търсим от един до колкото е възможно повече. Всичко това трябва да бъде групирано, за да работи заместването правилно.

Не е разумно да търсим само кирилски букви, защото тиренцето (дефисът) и други небуквени знакове вътре в думите ще ни правят беля.

Новото е в полето за заместване. Тук се използват, вмъкнати една в друга, четири функции от езика на vim Vimscript. Че ще се използва за заместване резултатът от работата на тези четири функции, показва знакът = в началото. Той трябва да бъде екраниран (\=). Най-вътрешната функция submatch(0) има смисъл само в този контекст — в полето за заместване, защото тя извежда подниз от намереното от дадена позиция до края, а нулата означава целия маркиран низ (точно както и индекс 1). Функцията split() създава от низа списък, като '\zs' е инструкция да се отделя всеки символ от началото на низа (s е от start) като елемент от списъка. Функцията reverse() „обръща“ този списък, а накрая join() го превръща отново в низ. В позицията, където е '' (това са две единични кавички), може да се постави разделител, който ще се вмъква между елементите от списъка — празният низ, естествено, означава липса на разделител.

Е, това обяснение няма да ви е много полезно, ако нямате малко опит с някой програмен език. Термините низ (англ. string) и списък (англ. list) означават в програмирането структури от елементарни данни — в нашия случаи елементарните данни са символите от маркираната дума.

Страница: А. И.
Електронна поща
Дата на публикуване: 15.V.2014
Последна редакция: 27.IV.2023
Съобразено с
html5/css3