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

Заглавна страница > Четива > Четива за глотометрията > Българска антропонимия. Материали > Практикум. Как да се работи с данните от извадката от имена на български граждани

 

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

Практикум. Как да се работи с данните от извадката от имена на български граждани

Както личи от заглавието, тук ще се обсъждат „технически“ въпроси. В смисъл: „как се прави това“?

Ще се придържам към практиката, която проповядвам на тези страници — всичко, каквото е възможно, да правите в текстовия си редактор. Предизвикателство тук е, че става дума за наистина голямо количество данни даже и по съвременните разбирания.

По отношение на работата с текстовия редактор няма да има нещо кой знае колко ново — ще има практически примери, приложения на онова, което навярно вече сте прочели в раздела cream в режим „експерт“. Е, може малко и да са разширени.

По-интересни ще са примерите за работа в конзолата/терминала. И там ще има малко повече обяснения.

* * *

Каква е структурата на данните, аз съм обяснил достатъчно подробно в представянето им (вижте Имена на български граждани (2015). Това, предполагам, вече сте го разучили. Всяка община е представена в отделна директория, а данните за всички секции в тази община са събрани в текстов файл с едно и също име — text_all.txt. Това е твърде удобно за изследователя глотометрист, както ще видите след малко.

И твърде неудобно за търсачите на „сензационни имена“. Ми… имал съм и това предвид, когато публикувах извадката.

Предполагам още, че вече сте изтеглили архива с данните и сте го разгърнали в някаква директория, например ~/imena. Това име на директория ще използвам аз по-нататък в примерите, а ако при вас е друго, ще съобразите да го сменяте.

Когато представях извадката, аз написах: „При имена на руснаци, сърби и македонци ясно личи стремеж да се запази оригиналният правопис на кирилица“.

Хайде сега да проверим как стои работата с формата Александар, чието изписване е, очевидно, повлияно от правописа на западните ни съседи. А това предполага, че в Западна България тази форма би трябвало да се среща по-често, отколкото в Източна. Да проверим дали наистина е така.

Отваряйте терминала/конзолата и да започваме.

Аз, разбира се, говоря за терминала/конзолата в линукс. Нали тази операционна система препоръчвам аз на филолога глотометрист.

Ако сте в Windows, вече трябва да сте инсталирали програмния пакет cygwin (вижте 27. За Windows). Отваряте cygwin terminal — там ще работят всичките ми примери.

Но не и в Command Prompt на Windows, нито в PowerShell.

Към стандартната инсталация на cygwin е необходимо да добавите пакетите archive и vim, а по желание и mc. Всичко, което показвам нататък, съм го пробвал и в cygwin terminal. Работи.

Идете в директорията ~/imena и напишете тази команда:

$ gerp 'АЛЕКСАНДАР' Sofiya/*

Пример 1. за  grep.

Командата (всъщност — програмата) grep претърсва файлове за даден текст или текстов шаблон, зададен като регулярен израз. Шаблонът трябва да бъде в кавички, единични или двойни, и е в първа позиция след командата. Във втора позиция може да бъде зададен път и име на файл, в който да се извършва търсенето. В примера със Sofiya/* аз инструктирам програмата да претърси всички файлове в директория Sofiya. Ама ние знаем, че там има само един текстов файл, така че можем да направим и подобно описание Sofiya/text_all.txt и ще получим същият ефект.

Резултатът е списък от редове, които съдържат търсения шаблон:

Пример 2. за  grep.

Тук се вижда краят („опашката“) на списъка. Програмата grep обикновено оцветява съвпадението с търсения шаблон.

Със стрелка нагоре викате, разбира се, предишната команда и може да я допишете или редактирате. Тук аз съм пуснал резултата от работата на командата на конвейера (англ. pipe) чрез оператора | и съм го подал на програмата wc (word counter), за да преброя редовете.

$ grep 'АЛЕКСАНДАР' Sofiya/* | wc -l

607 са случаите в София, в които срещаме изписването „АЛЕКСАНДАР“. Като поразгледате материала, ще видите, че това не винаги е лично име, среща се и като бащино.

Ама за да разгледате удобно резултата, най-добре е да го запишете във файл, па да си го разгледате с текстовия редактор. Тук аз съм използвал пренасочване, за да запиша резултата във файла aleksandar.txt. Пренасочването се извършва с оператора > и смисълът му е такъв: вместо командата да извежда информацията на терминала, да се пренасочи тази информация към файл, тоест да се запише във файл:

$ grep 'АЛЕКСАНДАР' Sofiya/* > aleksandar.txt

Може да ви озадачи защо името на файла е инвертирано на картинката, тоест защо е с черни букви на бял фон?

Ами защото съм го маркирал. Когато чукнете два пъти с левия клавиш на мишката върху име на файл, то обикновено се маркира. Ако обаче има шпации, няма да се маркира правилно по този начин. С натиснат ляв клавиш на мишката движете курсора през текста, който искате да маркирате. Всичко това е познато.

Маркираният текст в терминала се прехвърля в буфер за временно съхранение, почти както работи и редактиращата команда Copy. Но по подразбиране — щом маркирате текст, той се пренася в буфера.

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

Само че сега, ако сте маркирали и края на реда, интерпретаторът bash ще възприеме това като натиснат Enter и ще се опита да изпълни командата. Това обикновено предизвиква съобщение за грешка.

Разучете тази техника в линукския терминал, в много случаи тя облекчава работата и ви предпазва от буквени грешки, ако трябва да препишете, например, сложно име на файл или дълъг път.

Тази техника работи вече и в Windows, в Command Prompt. Чукнете два пъти с левия клавиш на мишката върху името на файла, ама го копирайте в клипборда с Ctrl+C и го прехвърлете в командния ред с Ctrl+V. Със стандартните клавиши за Copy/Paste.

А тук аз съм използвал тази техника, за да премахна файла с командата rm (съкращение от remove). Командата rm изтрива файла без каквито и да било предупреждения, при това го изтрива физически — няма да намерите изтрития файл в кошчето. Така че с нея внимавайте!

А аз изтрих този файл, защото данните, събрани по този начин, не са ни достатъчни. Защото ни трябват сумите за „АЛЕКСАНДАР“ по общини. А да обработваме данните община по община, ще ни отнеме много време. Все пак общините са 265. Та трябва да направим нещо по-умно.

Ама знаем — всичките ни данни са във файлове с едно и също име text_all.txt. Дали пък не можем да си направим списък на тези файлове? А след това ще помислим дали не може да приложим търсене с grep към файловете от този списък.

Ето как може да изведем списъкът от файлове text_all.txt, ако сме в директорията ~/imena:

$ find . -name 'text_all.txt'

Пример 1. за  find.

Ама нали точно това ни трябва? Името на директорията е име на общината, нищо, че е представено с латинска транскрипция. Ако сега комбинираме това с grep, така че пред всеки намерен „АЛЕКСАНДАР“ да стои името на директорията и името на файла, в който е намерен, ние сме си решили задачката.

Командата (програмата) find търси файлове по най-разнообразни критерии, търси ги „в дълбочина“ от зададена точка във файловата система. Тук зададената точка е работната директория, тоест ~/imena (нали си спомняте, че точката е „специално име“ на директория?).

Ако нищо не й кажете, програмата find извежда всички файлове във всички поддиректории. Затова тук с -name я инструктирам да търси конкретно име на файл — в кавички, единични или двойни. Разбира се, в кавичките може да зададете и шаблон с обобщаващи символи: '*.txt' или "text*.???".

Изрази като -name в документацията на програмата наричат предикати. Те винаги започват с дефис, доста са и оформят цял „подезик“, но общо взето се прилагат последователно отляво надясно, та редът на задаването им е от значение.

Сега ще включа и „предиката“ -exec, за да включа и програмата grep. И изграждам следния израз:

$ find . -name 'text_all.txt' -exec grep 'АЛЕКСАНДАР' {} +

Ето „опашката“ на резултата:

Пример 2. за  find.

Програмата find замества фигурните скоби {} със създадения списък от файлове, а знакът + е инструкция да се подава на grep по възможност целия списък или колкото е възможно по-голяма част от него наведнъж. Това е част от подезика на предиката -exec и подробности може да намерите, както обикновено, в справочните страници за find (man find).

Май получихме данните, които ни трябваха. Пренасочете резултата към файл с име aleksandar.txt — ще се позабавляваме с тези данни след малко.

Сега някой по-опитен заядливец може да ни каже: Ама защо толкова сложно! Същият резултат може да се получи само с grep:

$ grep -r 'АЛЕКСАНДАР' .

Ключето -r е от англ. recursive ’рекурсивно’, тоест да се проследят файловете във всички директории, подчинени на работната. И да — на конзолата всичко изглежда прекрасно. Но я опитайте:

$ grep -r 'АЛЕКСАНДАР' . > aleksandar.txt

Поучително е, нали?

Комбинацията от find и grep, която ви показах, дава възможност ние да определяме файловете, които ще се обработват. И това си струва усилията.

А сега да отворим в редактора новосъздадения файл aleksandar.txt. Аз ще използвам vim в терминала, а вие използвайте cream в режим „експерт“, ако ви е по-удобно — всички команди ще се изпълняват по един и същи начин.

Целта е да направим фреквентен речник — колко пъти в дадена община се среща личното име АЛЕКСАНДАР? Следователно, трябват ни само имената на общините.

Но, както винаги, първо трябва да си прегледаме данните. Вижда се, че пред АЛЕКСАНДАР (ако е лично име) трябва да има две точки. Затова нека направим такова търсене във файла:

/[^:]АЛЕКСАНДАР

Пример 1. за  vim.

Ще видите, че в три случая АЛЕКСАНДАР е бащино име и е разумно да изтрием тези данни. Внимавайте, защото в два случая това е второ лично име и е разумно да го запазим.

Докато извършвате тези редакции, сигурно ще ви направи впечатление, че в списъка силно преобладават имена на избиратели по „двуименната“ система за регистрация — лично и фамилно име, която е типична за съседните ни страни. Твърде честа е при фамилните имена и наставката -ски (над 45%), а в комбинацията от наставки -овски не е рядка елизията на в, характерна за македонските говори.

След тези (дребни) редакции вече може да изтрием всичко от съдържанието на реда освен името на общината:

Пример 2. за  vim.

С командата :%s:\.\/:: ще премахнем точката и наклонената черта преди името на общината; с командата :%s:\/.*$:: премахваме всичко след името на общината:

Пример 3. за  vim.

Двете картинки по-горе би трябвало да ви подсетят, че преди да премахвате (триете) текст, не е лошо да го видите с търсене при оцветяване на търсеното.

Сигурно ще съобразите, че комбинацията от символи \/ в командите не е главна латинска буква V, а е екранирана наклонена черта (slash). В много шрифтове това не си личи ясно.

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

Пример 4. за  vim.

Сега никак не е лошо да спрем и да помислим: дали 600 души, записани с името АЛЕКСАНДАР, в едномилионна София са наистина повече от 500 души в Благоевград? Май трябва все пак тези данни да ги „претеглим“ спрямо населението на съответната община…

И получаваме следната табличка (данните за населението по общини съм взел от Националния статистически институт):

Таблица за АЛЕКСАНДАР по общини.

Може да си изтеглите табличката в екселски вид (aleksandar_tab.xls; MD5 b08742cc41594ecc497651c61f8f35d4) и да работите с нея или да видите как е направена.

И разясненията:

Откъде са данните в първите три колони, мисля, е ясно. Само трябва да внимавате, когато вземате данните от таблицата на Националния статистически институт: ако името на общината е име и на област (например Благоевград, Варна, Видин, Перник), вземате, разбира се, данните за населението на общината, а не на областта.

В четвъртата колона Относителни честоти е представено отношението между данните в колона Брой към данните в колона Население. Тоест данните за честотата на изписването на личното име АЛЕКСАНДАР са съпоставени с населението на общината, та затова са относителни честоти.

Само така можем да преценим дали 600 случая на личното име АЛЕКСАНДАР в София са повече, или са по-малко, отколкото са 500 случая в Благоевград. И точно по относителните честоти съм прередил данните в табличката.

Относителните честоти са дробни числа. При това твърде малки — нали следим едно твърде рядко явление. В долната половина на таблицата числата са толкова малки, че са записани в тъй наречената експоненциална форма — точно това показва латинската буква E. След нея е степенният показател на 10.

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

Разясненията на Мирослав Янакиев в Електрониката в помощ на учителя филолог [djvu] [един файл] (с. 52, Числови системи) може да ви помогнат, пък и може да разширят малко познанията ви в тази област с оглед на съвременността. Никак не е лошо филологът да разбере, че различните системи за запис на числа са очевиден обект на филологията — при всички случаи става дума за азбука (краен набор от различни символи) и граматика (правила за съчетаването на символите).

В петата колона аз съм умножил относителната честота по 100 000 и съм извършил необходимото закръгления. Така съм получил оценка колко пъти средно на 100 000 души се среща изписването АЛЕКСАНДАР в дадена община.

Нали си давате сметка, че това е просто друг начин, може би малко по-нагледен, да представим относителните честоти? И пак представлява абстракция подобно на относителните честоти — ние прилагаме мярка „на 100 000 души“ към общини, в които не живеят и пет хиляди души.

И ако още малко помислите, ще се сетите, че процент е същата трансформация, ама „на сто“ (pro centum). А във фреквентните речници, извлечени от съвременните текстови корпуси, често дават честотите „в милион думи“ (ipm — instances per million words).

И можем вече да направим някои изводи.

Потвърждава се моето „интуитивно“ допускане, че явлението е характерно повече за Западна България. Нещо повече — то се доуточнява: най-характерно е то за Югозападна България, за общините Благоевград, Кюстендил, Петрич, които граничат с Република Северна Македония. Това уточняване без количественото проследяване на явлението нямаше как да го направим.

Не толкова изявено, но очевидно е разпространението на явлението и в централните западни общини, та можем да допуснем известно влияние откъм Сърбия и Западните покрайнини.

Очевидно става дума за избиратели с двойно гражданство, регистрирани първо в някоя от западните ни съседки и по-късно придобили и българско гражданство. Няма как да не са придобили българско гражданство, щом са включени в избирателните списъци.

Ние започнахме с проследяване на едно рядко правописно явление, а се натъкнахме на изводи, които са по-скоро социологични, отколкото антропонимични. Ама аз вече съм казвал — не може да се работи в областта на антропонимията, без да се привличат данни от всички други съседни области — фолклористика, история, а както виждате, и социология. Тоест, антропонимията не е „тясно лингвистична“ дисциплина, а по-скоро е област от общата семиотика.

Само бъдете предпазливи с обобщенията. Тук чак научно изследване не правим: проследихме само едно, при това правописно, при това рядко явление. Но общо взето, каквото и явление да следите в извадката от имена, техниката на извличане на количествените данни ще бъде сходна.

И още нещо важно — колкото и убедителни да ни се виждат наблюденията ни върху количественото разпространение на явлението, те все още нямат наистина научен вид. Необходимо е да обединим данните в още един клас (Западна/Източна България) и чрез подходящ тест от математическата статистика да се убедим, че различието наистина е значимо. Аз тук няма да ви занимавам с това, само ще ви уверя, че математикостатистическите критерии категорично потвърждават различие в разпределението на изписването 'АЛЕКСАНДАР' в западните области, от една страна, и в централните и източните, от друга.

И няколко практически препоръки.

Очевидно, трябва да разучите работата с регулярните изрази, ако още не сте. Програмата grep е направена да работи точно с регулярни изрази.

Може да установите понякога, че grep не обработва шаблона така, както сте свикнали във vim/cream. Нещо повече, grep „владее“ и диалекта на езика на регулярните изрази, разработен в Perl (сходен с този в Python). Така че известни познания по диалектология на езика на регулярните изрази ще са ви необходими. При затруднения търсете в Google: веднага ще намерите и примери, и разяснения. Щото не сте първият човек на света, който се е сблъскал с това.

В сглобките на линукс програмата grep е включена, понякога с още няколко варианта — egrep, rgrep, igrep. Не е включена обикновена програмата pcregrep (Perl-Compatible Regular Expression) — инсталирайте си я от хранилищата. Тя е твърде удобна, когато търсите израз, на който началната част е на горния ред, а крайната — на долния.

С известен опит извличането на данните от извадката отнема не повече от няколко минути. Повечко време отнема задължителният преглед на извлечените данни и евентуалната им редакция. И тук не бързайте.

Какъвто по качество материал „налеете“ в количествените обработки по-нататък, такъв резултат и ще получите. Покойният геолог Живко Иванов казваше „статистиката е празно тенеке, воденица — сипваш й кюспе, получаваш брашно от кюспе“. Та трябва да се стараем да пускаме във воденицата добро жито, за да получим добро брашно.

На мене ми отне повече време изработването на екселската таблица, преди всичко защото данните в първите три графи трябваше да ги въведа аз. Това също донякъде може да се автоматизира, но надали ще спестите много време при таблица с 31 реда. При това е задължително, наистина задължително числовите данни да бъдат внимателно проверени поне още веднъж след въвеждането. За да си нямате ядове после.

Пресмятането на стойностите в четвъртата и в петата колона, както и пренареждането на данните в електронните таблици се извършва „автоматично“, та не отнема много време.

Цялото занимание, заедно с оглеждането и осмислянето на материала, надали ще ви отмене повече от един предиобед.

Какво искам да ви кажа?

Работата с количествени данни е бърз и ефективен подход. Като експеримент опитайте по „описателно-разказвателния“ метод, традиционно характерен за филологията, да достигнете до изводите, до които аз достигнах за един предиобед. Или да ги опровергаете.

Правете таблици! Дори ако това отнема повечко време.

Таблиците обобщават (събират) количествените ви данни. И ги правят нагледни. Най-напред — за вас.

* * *

Сега ще ви предложа няколко „тежки“ обработки на данните. Те за вас няма да са тежки, но ще понатоварят малко софтуера, който използваме.

Целта е да ви покажа как може да си направите речници — фреквентни, рангови или a tergo — за личните, бащините или фамилните имена от извадката. При това ще ви показвам алтернативни начини — как да свършите работа в редактора (vim/cream) и как да я направите със стандартните инструменти на линукс.

Разумно е от данните в извадката да си направим един текстов файл. Той ще бъде „суровият материал“ за всякакви речници по-нататък.

Очевидно в този файл трябва да препишем последователно съдържанието на всеки файл text_all.txt от всяка от 265-те директории в архива. Пак е очевидно, че този файл ще дублира данните от архива и ще бъде доста големичък.

Идеята да отворим в редактора нов файл, например all_text.txt, и да „лепим“ в него 265 файла от всяка последователна директория е осъществима, но бавна и съдържа голям риск от човешка грешка: твърде лесно е да копираме някой файл два пъти или да пропуснем някой файл, а откриването на подобно грешка по-нататък е трудно. Затова ще ви предложа нещо по-умно.

Но нека първо ви запозная с програмката cat. Ако и подадете име на текстов файл, тя просто отпечатва на екрана съдържанието му. Но ако й подадете списък от имена на текстови файлове, тя ги „навързва“ плътно един след друг без никакъв разделител. То и името на програмата е съкращение от англ. catenate. Та ако я пуснем с предиката -exec във find, ще трябва само да пренасочим резултата към желания нов файл all_text.txt:

$ find . -name 'text_all.txt' -exec cat {} + > all_text.txt

И файлът all_text.txt, съдържащ текста от всичките 265 файла text_all.txt, е готов. Тук няма нищо ново — просто съм заменил програмата grep от предишния пример с програмата cat.

Сигурно ще поискате да видите новосъздадения файл с ls -l и ще срещнете трудности: в директорията ~/imena вече има 265 директории и новосъздаденият файл е забутан накъде между тях. Как да намерим само файловете?

Ето едно възможно решение:

$ ls -l | grep -v '^d'

Както знаете, списъкът, извеждан с ls -l, съдържа d в първа позиция на реда, ако елементът е директория. Филтрирам с grep този резултат и извеждам само редовете, които НЕ съдържат d в първа позиция. Условието за търсене (^d) е зададено, разбира се, като регулярен израз. Новото тук е ключето -v, което „обръща“, инвертира условието за търсене.

Сигурно ще се сетите, че и във vim/cream вариантът на командата g[lobal], който търси по противоположното условие, е v[global]. Буквата v може би е мнемоника от versus (’противоположното’, от лат. verto).

Аз толкова често използвам тази последователност от команди, че съм си ги „вързал“ към съкращение:

$ alias lf="ls -l | grep -v '^d'"

Създаването на такива съкращения чрез alias може много да облекчи живота, а примерчето показва и защо в bash се използват два вида кавички — за да може по-лесно да ги влагате едни в други.

Новосъздаденият файл all_text.txt е голям, над 300 MB и е с около шест милиона и осемстотин хиляди реда.

Много от популярните текстови редактори се затрудняват дори да го прочетат, камо ли да работят с него. Редакторът vim/cream се справя съвсем задоволително. Но е очевидно, че това количество данни се приближава до границата на възможното данните да се обработват като текстов файл.

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

Но ще мога да правя това само донякъде: с натрупването на големи количества данни филологът глотометрист ще трябва да разучи и работата с бази от данни. Няма да му се размине. Само ще го моля и тогава да не забравя колко лесно и бързо се обработват данните в текстов файл. Тъй де, нещата трябва да се правят по възможно най-простия начин.

Копирайте сега файла all_text.txt така:

cp all_text.txt all_names.txt

И изчете в редактора all_names.txt — целта е да премахнем „служебната“ информация. За направата на речници тя не ни е нужна. И понеже знаем, че всеки „служебен ред“ започва с #, изтриваме ги:

:%g/^#/d

Запишете файла all_names.txt. Копирайте го с ново име proper_names.txt. Изчетете в редактора proper_names.txt. Сега целта е да изтрием бащините и фамилните имена, но да запазим класификаторите за пол. Следователно ни трябва търсене от първата шпация до табулатора:

Маркиране на бащино и фамилно име.

Или по-точно — шпацията и вдясно от нея всичко, което не е табулатор. Сега можем да изтрием маркирания текст:

:%s: [^\t]\+::

Натиснете Enter, пък вървете да си сипете кафе или да си свършите друга някоя дребна работа за минута-две. Дори на булдозер като vim ще му е нужно известно време, за да извърши толкова редакции. Когато се върнете, нещата трябва да изглеждат така:

Изтриване на бащино и фамилно име.

Запишете файла proper_names.txt и го копирайте с име proper_names.freq, изчетете го в редактора — сега трябва да превърнем списъка с лични имена във фреквентен речник на личните имена.

Тук няма да се впускам в подробности — работата по нищо не се отличава от онова, което съм описал в Направа на фреквентен или рангов речник. Само да подсетя, преди да пренаредите фреквентния речник като рангов, не забравяйте да препишете файла proper_names.freq като proper_name.range.

Сега, когато имаме общ рангов речник на всички собствени имена в извадката, лесно е да направим от него „сечение“ само за мъжките или само за женските имена. Препишете proper_names.range като proper_names_f.range, отворете го в редактора и изтрийте всички имена, маркирани като мъжки или като неопределени:

:%g/\t[mn]/d

Ако искате да получите от някой от създадените вече речници обратен речник (a tergo), вижте обясненията в Обратен (a tergo) речник.

* * *

Обещах да покажа как може да се свърши работата в конзолата без редактора. Тази информация ще е полезна за онези, които по някакви причини на могат да използват vim/cream. Или работят с много старо, бавничко компютърче…

Опитайте следната последователност от команди:

$ cat all_text.txt | grep -v '^#' > all_names.txt

$ cat all_names.txt | sed 's/ [^\t]\+//' > proper_names.txt

$ cat proper_names.txt | sort | uniq -c | sed 's/^ \+//' | sed 's/\([0-9]\+\) \(.*\)/\2\t\1/' > proper_names.freq

$ cat proper_names.freq | sort -bnrs -t$'\t' -k3,3 > proper_names.range

$ grep 'f' proper_names.range > proper_names_f.range

$ grep 'm' proper_names.range > proper_names_m.range

И ето резултата:

Всички създадени дотук файлове.

Май получих, каквото ни трябваше.

Програмата sed (stream editor) „филтрира“ текста от файла ред по ред и може да извършва замени почти по същия начин, както правите това в редактора със s(ubstitute). Виждате, регулярните изрази не се различават много. Ако разчитането им все пак ви затруднява, заменете наклонените надясно черти (slash) с двоеточие: 's:^ \+::' и 's:\([0-9]\+\) \(.*\):\2\t\1/'. Така може би са по-четливи.

В третия ред аз съм наредил на конвейера май пет програмки последователно. Това е възможно. Всяка от тях изпълнява едно от необходимите действия, за да превърнете списък (proper_names.txt) във фреквентен речник (proper_names.freq).

В последните два реда с grep търся само класификаторите f и m. Това е възможно, защото текстът е добре редактиран и в него няма случайно попаднали латински букви. Но ако ще се чувствате по-добре, въведете и табулатора пред класификатора (с Ctrl+V и Tab).

След като сте си направили речниците, може да решите да замените подчертаващото тире (_) с шпация. Нали помните? Така съм обединил личните имена, когато са повече от едно и не са свързани с дефис. И сега сигурно вече си давате сметка, че е имало полза от това. Но подчертаващото тире си свърши работата — може да го махнете вече. Впрочем, това са малко случаи: под 1600 в извадката.

За да направите речници на бащините и на фамилните имена, ще ви трябва общо взето малко съобразителност. Бащиното име (ако го има) е между първата и втората шпация. Фамилното име е след втората шпация. Но си прегледайте внимателно материала, защото има и по-сложни случаи, които аз не съм обработвал както собствените имена.

* * *

Ще направя сега малко методическо-педагогическо отклонение.

Винаги, когато имам възможност, аз пробвам обработките, които ви показвам, на стари компютърчета.

Последното, на което пробвах нещата, които тук обяснявам, беше десетгодишен (2006 г.) лаптоп Compaq с двуядрен процесор на 800 MHz и с 1024 MB оперативна памет. Погледнете телефона си — вероятно е с по-добри технически характеристики.

Но всичко върви! Вярно, малко по-бавничко, но върви, става.

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

Защото ценността на едно изследване е във вашите идеи и във вашите познания, а не в компютърната техника.

* * *

Щом веднъж сте направили общия файл all_text.txt, ще видите и ползата от него. Лесно може да броите в него име, което ви интересува, или друга някаква характеристика (например, наставки). Лесно е и да нанасяте „масови“ поправки, например да отбележите, че всички ИНГРИД са жени. Или нещо подобно.

Но така пред вас възниква друг проблем: как да „разхвърляте“ по общините направените поправки? Та възниква нужда от програмка, която да чете общия файл all_text.txt и да създава наново „частните“ файлове text_all.txt във всяка една от 265-те директории, отговарящи на общините в България.

Такава програма (read_write.py) има в архива read_write.zip (MD5 02ef6e71ed55548ba5bc610776a52d56). Вътре има и файл obshtini.list, който се изчита от програмата и й помага да транслитерира кирилските имена на общини от общия файл с латинска азбука, тоест да създаде име на директория за всяка община. Развържете архива в общата директория, в моите примери дотук това е ~/imena. Но преди да стартирате програмата, разумно е да направите две неща.

Първо, да си архивирате данните, например така:

$ find . -name 'text_all.txt' -exec zip 07_07_2017.zip {} +

Името на създавания архивен файл при вас ще е друго, но е хубаво да съдържа датата.

Второ, да изтриете файловете text_all.txt в директориите с дани за общините:

$ find . -name 'text_all.txt' -exec rm {} +

Така ако нещо се оплеска (например, откривате по-късно, че някоя масова поправка е довела до грешки), ще може да възстановите статуквото от архивния файл.

* * *

Програмата read_write.py е хубав пример за това, което аз наричам „изследователско програмиране“. Имам предвид, че тази програма е направена със съвсем конкретна цел върху съвсем конкретен набор от данни. И, да! Тя надали ще бъде изпълнявана повече от два-три пъти.

И няма защо да се притеснявате за графичен интерфейс, за избор на алгоритми, за скоростта на изпълнение, дори не е необходим кой знае какъв контрол върху входните данни.

Ако сме сбъркали нещо във входния файл all_text.txt (например, пропуснали сме някой табулатор), програмата, разбира се, ще спре с грешка. Само че няма никакъв смисъл ние да обработваме грешката в програмата, напротив, трябва да отворим файла all_text.txt, да намерим пропуснатия табулатор и да го възстановим.

Такава ситуация при научно изследване е честа, много честа. И не само в глотометрията. Изследователят разполага с някакви данни, често пъти „уникални“, и често се стреми да ги обработи по начин също „уникален“, тоест, както досега не са обработвани.

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

И толкова. Не повече. За изследователя е важно да извърши необходимите обработки върху данните си и да получи желания резултат, а не да накара всички програмисти по света да кажат „Ах!“ и да онемеят.

А да се научи изследователят да програмира по този начин, не е сложно, не изисква много време и не зависи от специалността му. И най-добре е да изучи интерпретаторен език. Може би — пайтън (Pythоn). Защото в конзолата на интерпретатора, в тъй наречения директен режим често може да си спести дори писането на програмка.

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