Александър Иванов
cream в режим „expert“
Направа на фреквентен или рангов речник
Фреквентният речник представлява списък от словоформи (по-добре е да ги наричаме с лингвистичния термин лекси или с по-дългото алолекси) от даден текст. Лексите са подредени по азбучен ред и не се повтарят в списъка, а вместо това след всяка от тях има число (честота или фреквентност), което показва колко пъти тази лекса се е срещнала в текста. За разделител между лексата и честотата ще използваме символа за табулатор.
Защо пък точно символа за табулатор? Ами за удобство. Ако сте спазили моята препоръка в добре редактирания текст да няма табулатори, сега може да правите фреквентни речници не само от лекси, но и от фрази (изречения), които съдържат шпации.
Ранговият речник е подреден по честотите, при това отгоре е най-високата честота, а на опашката са подредени лексите с честота единица. В еднаквите честоти лексите отново са подредени по азбучен ред.
Разбира се, може да правите фреквентен или рангов речник и от други „елементарни единици“ — например, полезно е, преди да обработвате някакъв текст, да му направите речник на символите (вж. пример а) Списък на символите в текста). Но примерът, който ще дам сега, ще е за списък от лекси.
Първо, необходим ви е добре редактиран текст (вж. Добре редактиран текст). Запишете го с ново име, най-добре с разширение .freq.
Второ, направете списък от лексите, както е показано в пример в) Списък от думи (лекси).
Премахнете пунктуацията, както е описано в пример г) Работа с пунктуацията, и празните редове (ако има).
Сега е време да решите дали да запазите разликата между главните и малките букви, или да не я пазите. Това зависи най-вече от целта, с която правите речника. Ако искате да препишете целия текст с малки букви, командата ggguG в режим „експерт“ върши работа.
За съжаление, не е лесно, без да имате някакъв класификатор на лексите, автоматично да определите къде главната буква е „морфологична“ и трябва да я запазите, и къде е „синтактична“ или „стилистична“ и трябва да я премахнете. Ако се налага да сте много прецизни, направете първо списък от „изречения“ (вж. пример б) Списък от изреченията в текста), а след като премахнете синтактичната главна буква (и направите необходимите „ръчни“ проверки чрез търсене само за главните букви в останалия текст), после може да превърнете списъка от „изречения“ в списък от лекси. Подсказвам: командата ~ и командите ( и ) ще са ви много полезни.
Сега запишете списъка от лекси и приложете външната програма филтър sort:
%!sort
Лексите ще бъдат подредени по азбучен ред, като онези, които се повтарят в текста, ще бъдат събрани на едно място.
Отново запишете текста, защото сега ще приложим външната програма uniq:
:%!uniq -c
Програмата премахва повтарящите се редове (тоест, оставя само „уникалните“ редове текст) в подреден списък. Флагът -c (от count) инструктира програмата да отбелязва бройката на редовете, тоест да поставя честоти. По подразбиране честотите се поставят пред реда (лексата) в поле от 8 колони, като празните полета пред честотата се попълват с шпации. Разделител между честотата и лексата също е шпацията.
За да завършим фреквентния речник, първо, трябва да отстраним шпациите в началото на реда (:%s:^\s*::), второ, да преместим колоната с честотите след лексите, като поставим табулатор за разделител между лексата и честотата:
:%s:\(^[0-9]\+\) \(.*\):\2\t\1:
Запишете си готовия фреквентен речник.
След като имаме фреквентен речник, твърде лесно е да го пренаредим в рангов.
Запишете фреквентния речник през Save As, най-добре с разширение .rang. За да го превърнем в рангов речник, трябва да повторим сортирането (подреждането) вече по честотите:
:%!sort -bnrs -k2,2
Флагът -b е инструкция да не се обръща внимание на шпациите и табулаторите преди числото; флагът -n е инструкция групите цифри да се интерпретират като числа, а не като символи (експериментирайте без този флаг, за да видите разликата); флагът -r е инструкция за „реверсивно“ подреждане, тоест от големите към малките честоти; флагът -s инструктира програмата подреждането да бъде „стабилно“ — това ще рече, че в групите с еднакви честоти ще се запази азбучният ред на лексите (тоест, резултатът от предишното подреждане).
Флагът -k2,2 определя подредбата да се извършва по второто поле в реда, по-точно — от второто до второто. По подразбиране програмата sort приема като разделители между полетата шпацията и табулатора. Ако във вашия списък има шпации, тоест, ако обработвате фрази, прибавете още и флага -t$'\t'. С него определяте само табулаторът да е разделител между полетата.