Sari la conținut
Danube Labs

Vocea unui autor, măsurată cu cod, nu din impresii

„Scrie în stilul meu” este o instrucțiune pe care modelul nu o poate verifica. Măsoară vocea din proza autorului și notează fiecare variantă față de profil.

De Alexandru Secureanu9 min de citit
O pagină de proză cu lungimile propozițiilor măsurate deasupra ei

„Scrie în stilul meu” este o instrucțiune pe care modelul nu o poate verifica. Nu are o copie a stilului tău și nicio definiție a lui, așa că nu poate spune dacă paragraful tocmai scris este mai aproape de vocea ta decât cel dinainte. Are doar eșantionul tău comprimat într-o impresie, iar impresia nu se poate testa. Instrucțiunea sună precis și nu schimbă nimic verificabil.

Alternativa este să măsori vocea înainte să ceri cuiva să o potrivească. Iei un corp de texte publicate și editate ale autorului, calculezi cu un script un set fix de caracteristici și păstrezi rezultatul ca profil. Apoi notezi fiecare variantă de text față de profil. Rezultatul este un tabel de numere și o distanță, nu o părere.

De ce „potrivește stilul meu” nu funcționează ca instrucțiune

O instrucțiune verificabilă are nevoie de trei lucruri: o valoare, o toleranță și un mod de a eșua. „Scrie propoziții mai scurte” nu are niciunul. Mai scurte decât ce, cu cât, și cum ai ști că nu s-a întâmplat? Modelul nu poate răspunde, așa că face ce fac modelele cu cerințele vagi: produce media a tot ce a văzut și pare apropiat de cerere.

Să ceri modelului să își judece propria ieșire nu ajută. Este conciliant prin antrenament și nu are un text de referință în afara ferestrei de context. Chiar dacă lipești eșantioane, atenția favorizează ce e distinctiv și recent. Un paragraf liric lung din eșantion poate trage un capitol întreg în acel registru, iar cele douăzeci de paragrafe simple din jur sunt ignorate.

Un script nu are aceste probleme. Numără. Același text dă aceleași numere indiferent cine rulează scriptul, iar o variantă fie cade în intervalul profilului, fie nu. Asta face instrucțiunea verificabilă: devine o măsurătoare cu prag.

Ce poți extrage dintr-un corpus

Tot ce urmează sunt numărători peste text. Niciuna nu cere să înțelegi ce înseamnă propozițiile, exact de aceea pot fi calculate determinist.

Lungimea propozițiilor și distribuția ei

Reține media, mediana, percentilele 10 și 90 și ponderea propozițiilor mai lungi de 40 de cuvinte. Media singură ascunde exact ce observă cititorul. Un autor care alternează propoziții de șase cuvinte cu unele de patruzeci și cinci poate avea aceeași medie ca unul care scrie fiecare propoziție la douăzeci și cinci de cuvinte, iar cei doi nu seamănă deloc. Păstrează distribuția.

Mecanica e simplă. Taie pe punctuația finală cu o expresie regulată, apoi repară tăieturile produse de abrevieri: dl., dr., etc., inițiale și puncte de suspensie. Numără cuvintele după ce normalizezi apostrofurile. În Python, statistics.quantiles(lengths, n=10) dă decilele într-un singur apel.

Lungimea paragrafelor

Cuvinte pe paragraf și propoziții pe paragraf. În ficțiune, aici se despart decorul și dialogul; în non-ficțiune este ritmul cel mai vizibil după lungimea propoziției. Numără paragrafele pe linii goale, nu pe indentare, pentru că indentarea rareori supraviețuiește conversiei între formate.

Dialogul față de narațiune

Merită păstrate două rapoarte. Ponderea paragrafelor care conțin vorbire citată arată cât de des trece textul la dialog. Ponderea cuvintelor din interiorul ghilimelelor arată cât din text este dialog. Se mișcă independent: un capitol poate avea multe replici scurte și totuși să fie în mare parte narațiune. Normalizează întâi caracterele de citare, pentru că ghilimelele drepte, cele curbe și cele românești sunt caractere diferite pentru o expresie regulată.

Varietatea lexicală

Rata tip-token este numărul de cuvinte distincte împărțit la numărul total de cuvinte. Este măsura evidentă și cea mai des folosită greșit. Diversitatea lexicală scade pe măsură ce textul crește, pentru că orice autor repetă cuvinte, deci un raport brut compară lungimi la fel de mult ca vocabular. Compară ferestre de lungime egală, de exemplu 1.000 de cuvinte, și fă media ferestrelor. Un număr al cuvintelor folosite o singură dată, ponderea hapax, este un companion util.

Densitatea adverbelor

Adverbe la 1.000 de cuvinte. Aici depinde de limbă. În engleză, sufixul -ly prinde multe adverbe și le ratează pe altele precum fast, well sau very, iar numără în plus cuvinte ca only și early. Un etichetator morfologic este mai precis: spaCy atribuie eticheta generală ADV, iar numărarea tokenilor cu ea ia câteva linii. În română trucul cu sufixul eșuează rău, pentru că -mente nu este productiv cum este -ly; ai nevoie de un etichetator sau de o listă curată.

Obiceiuri de punctuație

Numărători la 1.000 de cuvinte pentru punct și virgulă, două puncte, linie de pauză, puncte de suspensie, semnul exclamării, semnul întrebării și paranteze. Sunt ieftine de calculat și surprinzător de personale. Numără code pointuri, nu aparențe: linia de pauză este un caracter, cratima altul. Trece corpusul într-o singură codificare și un singur stil de citare înainte de numărare, altfel numeri conversia fișierelor, nu autorul.

Deschiderile propozițiilor

Ia primul cuvânt al fiecărei propoziții și prima parte de vorbire, apoi păstrează primele douăzeci. Scriitorii au ticuri care supraviețuiesc editării: încep cu Și, cu o construcție gerunzială, cu un pronume, cu o subordonată. Distribuția deschiderilor este mai distinctivă decât vocabularul, pentru că e mai greu de falsificat conștient.

Timpul și persoana

Măsoară ponderea verbelor finite la trecut și la prezent și frecvența persoanei întâi singular, a persoanei întâi plural, a persoanei a doua și a persoanei a treia. Fă-o pe capitol. Perspectiva și timpul sunt de obicei constante într-un capitol și variază între cărți, deci o medie pe tot corpusul poate descrie o voce pe care nicio pagină nu o folosește.

Profilul se calculează cu un script

Pipeline-ul are cinci pași. Păstrează corpusul ca text simplu UTF-8, un fișier pe capitol, cu o ordine în nume. Normalizează ghilimelele și liniile de pauză și notează ce ai normalizat. Rulează funcțiile peste fiecare capitol și păstrează valorile pe capitol, nu doar media pe corpus. Agregă în medie, abatere standard și câteva cuantile. Salvează rezultatul ca JSON lângă regulile de preprocesare și dimensiunea corpusului.

Cele mai multe caracteristici cer doar biblioteca standard Python: re pentru tăiere, statistics pentru agregări, collections.Counter pentru tabelele de frecvență. Densitatea adverbelor și timpul cer un etichetator. Fișierul de profil arată cam așa, cu numere ilustrative:

{"sentence_length": {"mean": 17.4, "sd": 6.1, "p10": 8, "p90": 29}, "dialogue_paragraph_share": 0.31, "semicolons_per_1k": 2.4}

Contează două proprietăți mai mult decât lista exactă de caracteristici. Prima este determinismul: niciun model în buclă, deci profilul poate fi reconstruit și comparat. A doua este proveniența: notează ce fișiere au intrat, care au fost excluse și cum a fost curățat textul. Un profil fără această evidență nu poate fi comparat cu altul, iar peste un an nimeni nu își va mai aminti de ce a fost scos un capitol.

Cum notezi o variantă, ca răspunsul să fie un număr

Pentru fiecare caracteristică, calculează cât de departe stă varianta de profil, în unități din împrăștierea profilului: scazi media corpusului și împarți la abaterea standard. Rezultă un scor z pe caracteristică. Raportează caracteristicile separat.

Nu le strânge într-o singură medie prea devreme. O variantă la zero pe nouă caracteristici și la șase abateri standard pe raportul dialogului nu este „aproape în voce”; este o variantă cu o problemă structurală pe care media ar ascunde-o.

Pragul trebuie să vină de la autor, nu de la gustul tău. Ține deoparte câteva capitole când construiești profilul, apoi notează-le față de el. Împrăștierea lor este variația proprie a autorului. O variantă nouă în acel interval este la fel de aproape de profil pe cât este opera autorului însuși. Una din afara lui este măsurabil diferită. Fără pasul acesta, orice toleranță alegi este arbitrară și vei petrece discuția apărând numărul în loc de text.

Două controale fac scorul demn de încredere. Notează un capitol al altui autor: dacă scorul nu îl separă de țintă, profilul e prea slab ca să folosească. Notează o variantă timpurie, needitată, a aceluiași autor: dacă ia același scor ca textul publicat, caracteristicile nu prind ce a schimbat editarea.

Ce nu pot spune numerele

Metricile prind ritmul de suprafață, nu judecata. Îți pot spune că o variantă are distribuția de lungimi de propoziție, rata de adverbe și obiceiurile de punctuație ale autorului. Nu îți pot spune că metafora e obosită, că scena nu își merită locul sau că argumentul se prăbușește în al treilea paragraf. O pagină poate fi perfect în voce și totuși slabă.

Un autor care scrie romane, eseuri și e-mailuri are cel puțin trei voci. Un profil mediat peste toate nu o descrie pe niciuna. Construiește un profil pe registru, iar într-un roman separă scenele cu mult dialog de cele descriptive dacă diferența e mare.

Există și o problemă Goodhart. Un model căruia i se cere să atingă fiecare metrică le va atinge pe toate. Va pune punct și virgulă la rata corectă, va tăia propozițiile la mediană și va începe cu cuvintele preferate, iar rezultatul se va citi ca ceva asamblat ca să treacă o inspecție. Metricile sunt un prag minim. Prind deriva și prind un ghostwriter care a schimbat discret registrul. Nu produc calitate și nu ar trebui să fie singurul cititor.

Nici regulile nu sunt mai bune decât cazurile lor limită. Tăierea propozițiilor eșuează la abrevieri, la dialogul fără atribuire și la limbi cu altă punctuație. Verifică manual un eșantion înainte să ai încredere în numărători și reverifică atunci când adaugi o carte în corpus.

Cum construiești corpusul

Corpusul decide rezultatul mai mult decât codul.

  • Text publicat și editat, nu ciorne. O ciornă conține procesul autorului, inclusiv tot ce a scos editorul mai târziu. Dacă vrei vocea pe care o cunosc cititorii, folosește versiunea publicată.
  • Curăță paratextul. Pagini de titlu, drepturi de autor, dedicații, mulțumiri, note despre autor, publicitate a editurii. Fișierele din domeniul public au antet și subsol; scoate-le pe amândouă și verifică manual prima și ultima pagină, pentru că textele standard diferă între surse.
  • Păstrează granițele capitolelor. Un fișier pe capitol, în ordine. Granițele îți permit să măsori variația pe capitol, să ții capitole deoparte pentru calibrare și să nu amesteci un capitol la persoana întâi cu unul la persoana a treia.
  • Elimină duplicatele. Edițiile complete repetă povestiri. Un capitol duplicat primește greutate dublă în fiecare medie.
  • Compară ferestre egale la măsurile lexicale. Rata tip-token scade cu lungimea, deci folosește ferestre fixe de 1.000 de cuvinte, nu cărți întregi de dimensiuni diferite.
  • Respectă drepturile. Folosește text din domeniul public sau fișiere date de autor. Termenii Project Gutenberg trimit la licența proiectului și avertizează că drepturile diferă în afara Statelor Unite, deci „se poate descărca” nu înseamnă „se poate refolosi”.

Dimensiunea contează într-o singură direcție: destul ca niciun capitol să nu domine media. Dacă un capitol este o zecime din corpus, ticurile lui sunt o zecime din profil. Câteva zeci de capitole sunt un început rezonabil pentru un roman, iar capitolele lungi cer mai puține.

Unde se leagă asta de practică

Forma merită copiată: un profil construit din material publicat, un scorer rulat pe fiecare variantă și o lectură umană pe tot ce scorerul semnalează sau aprobă. Nu înlocuiește editarea. Face prima trecere mai ieftină, pentru că deriva evidentă se vede deja ca număr.

Vellum, pluginul pentru Claude Code pe care îl publicăm pentru romancieri, măsoară stilul din manuscrisul autorului cu un motor Python, lângă verificările de continuitate și export. Este o implementare a ideii de mai sus.

Dacă ai un corpus și vrei un profil din el, sau o verificare că o variantă scrisă de altcineva rămâne în el, vezi proiectele noastre de sisteme AI sau programează un apel introductiv gratuit. Măsurătoarea este partea ușoară. Decizia ce capitole intră în corpus este unde stă munca.

Întrebări frecvente

Poate AI-ul să potrivească stilul unui autor?
Doar la suprafață și doar dacă îi dai ceva verificabil. Un model poate imita ritmul, lungimea propozițiilor și vocabularul când are eșantioane, dar nu poate verifica dacă a reușit. Un profil măsurat plus un scorer transformă cererea într-o țintă cu prag, așa că vezi cât de aproape este o variantă în loc să ceri modelului să confirme.
Cum măsori stilul unui autor?
Extragi caracteristici care se pot număra: distribuția lungimii propozițiilor, cuvinte și propoziții pe paragraf, ponderea paragrafelor cu dialog, rata tip-token pe ferestre egale, densitatea adverbelor, frecvența semnelor de punctuație, deschiderile preferate, timpul și persoana. Le calculezi pe proza editată a autorului cu un script și păstrezi și valorile pe capitol, nu doar mediile.
De ce nu este rata tip-token de încredere când compari texte?
Rata tip-token scade pe măsură ce textul crește, pentru că orice autor repetă cuvinte. Un raport brut compară deci lungimea la fel de mult ca vocabularul. Compară ferestre fixe de aceeași dimensiune, de exemplu 1.000 de cuvinte, și fă media, sau folosește o măsură care controlează lungimea. Aceeași rezervă apare când compari o povestire cu un roman.
Ce trebuie să conțină un profil de voce?
Pentru fiecare caracteristică, media, abaterea standard și câteva cuantile, plus valorile pe capitol. Trebuie să noteze și dimensiunea corpusului, lista fișierelor, capitolele excluse și regulile de preprocesare, pentru că un profil nu poate fi comparat cu altul dacă nu știi cum a fost construit.
Cum știi dacă o variantă este în vocea autorului?
Notează fiecare caracteristică ca scor z față de profil și raportează-le separat. Calibrează toleranța ținând deoparte capitole din corpus și notându-le: împrăștierea lor este variația proprie a autorului. O variantă în acel interval este la fel de aproape ca opera autorului. Notează și un alt autor ca martor negativ.
Cât text îți trebuie pentru un profil de voce?
Destul ca niciun capitol să nu domine mediile. Dacă un capitol este o zecime din corpus, ticurile lui sunt o zecime din profil. Câteva zeci de capitole sunt un început rezonabil pentru un roman, iar capitolele lungi cer mai puține. Nu există un număr universal de cuvinte, iar un profil construit dintr-o singură carte descrie cartea mai mult decât autorul.
Distribuie

Articole similare

  • 8 min de citit

    Testul cititorului orb pentru texte scrise cu AI

    Nu poți judeca textul pe care l-ai văzut generându-se. Șterge semnele, scrie baremul de eșec înainte de lectură, folosește doi cititori și păstrează verdictul într-un fișier.

    • AI
    • Scriere