Progetto:Trascrizioni/Progetto Phe: differenze tra le versioni

Da Wikisource.
Contenuto cancellato Contenuto aggiunto
Riga 108: Riga 108:


In conclusione: datiPagina esiste solo in fase di edit di una pagina ed è inaccessibile all'utente, tranne che con javascript; la gestione è del tutto analoga a quella di proofreadpage_quality e di proofreadpage_username.
In conclusione: datiPagina esiste solo in fase di edit di una pagina ed è inaccessibile all'utente, tranne che con javascript; la gestione è del tutto analoga a quella di proofreadpage_quality e di proofreadpage_username.

== To do bot ==
* scaricare da Commons il file djvu
* dumparlo e parsare il dump; memorizzare il numero pagine e l'array delle dimensioni delle pagine in un oggetto python
* liberare una directory djvutxt e per ogni pagina estrarre il txt con djvutxt -page=[numero] -detail=line >tex/[numero].txt
* caricare il contenuto dei file nell'oggetto python (trasfromato in unicode)
* aggiornare una lista di oggetti con coppia nome originale file-nome oggetto normalizzato e salvare l'oggetto con il nome normalizzato come pcl
* cancellare il djvu

secondo programma (caricamento pagine):
* dalla lista file ottenere il nome pcl normalizzato e leggere l'oggetto
* per ogni pagina richiesta:
** verificare che la pagina sia vuota
** caricare il pure-txt ottenuto per concatenamento delle righe di testo + i dati per datiPagina pronti per il parsing js

All'apertura di una pagina:
* riconoscimento dell'area dati grezza
* parsing, memorizzazione in datiPagina, cancellazione area dati grezza

Versione delle 12:45, 9 dic 2011

Il "progetto Phe", da un suggerimento di Phe (attuale manovratore del robot Match and Split), consiste nel far ricevere alla pagina Pagina, all'atto della creazione, anche dati sulle coordinate del testo nell'immagine, oltre che il puro testo.

L'obiettivo originale di Phe è quello di consentire l'evidenziazione del testo sull'immagine, sincronizzandola con il puntatore nel testo in modifica. Ma in base ai nostri obiettivi locali, disporre di questi dati potrebbe consentire anche una analisi automatica di alcuni elementi della formattazione; ed effettivamente la cosa è estremamente interessante.

Attualmente, Phe riferisce che:

  • per ogni djvu con testo OCR, il djvu viene caricato una volta su toolserver e viene estratto il testo delle pagine con la routine djvutxt e i testi vengono montati in un oggetto python serializzato;
  • subito dopo il file djvu viene cancellato;
  • alla creazione di una pagina l'oggetto python restituisce il corrispondente testo che viene caricato sul box testo.

Sfruttando questa procedura con modeste modifiche:

  • oltre che il testo base, potrebbe essere ottenuto dal djvu anche il testo suddiviso in linee, con le loro coordinate sulla pagina (comando djvutxt -detail=line);
  • l'output grezzo di djvutxt -detail=line potrebbe essere trasformato in un oggetto python strutturato (lista di liste) e serializzato in una stringa JSON;
  • al momento della creazione della pagina, potrebbe essere caricato nel box testo sia il testo usuale, che la stringa JSON, che sarebbe immediatamente fatta sparire caricandola in un'"area dati" nascosta della pagina Pagina e trasformata in un oggetto js (lista di liste analoga all'originale oggetto python);
  • in fase di submit, la stringa JSON potrebbe essere ricostruita e riaggiunta al testo della pagina.

Così facendo, uno script locale js, in fase di modifica della pagina, potrebbe contemporaneamente accedere, per qualsiasi elaborazione immaginabile, sia al testo in corso di edit, che al testo originale suddiviso in linee mappate sulla sulla pagina djvu originale e - con facili calcoli - sull'immagine jpg visualizzata a fronte.

Tutti i passi elementari:

  • estrazione djvutxt -detail=line;
  • parsing e trasformazione in oggetto python -> serializzazione in oggetto JSON;
  • meccanismo di caricamento/scaricamento dal testo della pagine dell'oggetto JSON;
  • creazione dell'oggetto js (lista di liste)

sono stati sperimentati nelle ultime 48 ore e non sono particolarmente complessi.

Il parsing dell'output djvutxt -detail=line

Testo prodotto da djvutxt -page=55 La pastorizia.djvu:

Ifi	LA PASTORIZIA,
D'antichissime selve avete in cura,
Oreadi benigne, il vostro regno
Ne concedete; perocché, solenne
Ostia votiva, la miglior dell’agnc
A voi cadrà sui coronati altari
Devotamente al rinnovar d’ogn’anno.
Voi dagli estri mortiferi volanti
E dall’orride serpi e da vepraj
E dalle avvelenate erbe guardale
Le pecorelle ai pascoli. Per voi

Testo prodotto da djvutxt -page=55 -detail=line La pastorizia.djvu:

(page 268 465 868 1553 (line 269 1520 681 1553 "Ifi\tLA PASTORIZIA,") 
  (line 268 1479 750 1514 "D'antichissime selve avete in cura,") 
  (line 269 1432 707 1467 "Oreadi benigne, il vostro regno") 
  (line 268 1388 719 1423 "Ne concedete; perocché, solenne") 
  (line 270 1342 727 1379 "Ostia votiva, la miglior dell’agnc") 
  (line 268 1308 694 1335 "A voi cadrà sui coronati altari") 
  (line 268 1258 779 1289 "Devotamente al rinnovar d’ogn’anno.") 
  (line 268 1213 707 1245 "Voi dagli estri mortiferi volanti") 
  (line 268 1165 705 1203 "E dall’orride serpi e da vepraj") 
  (line 269 1124 730 1158 "E dalle avvelenate erbe guardale") 
  (line 269 1078 712 1115 "Le pecorelle ai pascoli. Per voi") 

Script per l'estrazione dei dati da una variabile testo che contiene l'output -detail=line::

righe=[];
patt=/(\d+)\s(\d+)\s(\d+)\s(\d+)\s\"(.+)\"\)\s\n/;
while (patt.test(testo)) {
   l=testo.match(patt);
   l1=l.slice(0,1);
   testo=testo.replace(l1,"");
   lista.push(l.slice(1));
}

Sul testo sopra, si ottiene una lista righe di 11 elementi del tipo:

["269", "1520", "681", "1553", "Ifi\tLA PASTORIZIA,"]

E' quindi possibile caricare su una pagina Pagina locale l'output grezzo di djvutxt -detail=line ed eseguire:

  1. il parsing;
  2. la ricostruzione del puro testo identico all'output di djvutxt per estrazione e accodamento delle stringhe in posizione 4;
  3. il salvataggio in una variabile locale dell'intero array righe;
  4. la serializzazione JSON di righe, che nel caso del testo di esempio è:

"[["269","1520","681","1553","Ifi\\tLA PASTORIZIA,"],["268","1479","750","1514","D'antichissime selve avete in cura,"],["269","1432","707","1467","Oreadi benigne, il vostro regno"],["268","1388","719","1423","Ne concedete; perocché, solenne"],["270","1342","727","1379","Ostia votiva, la miglior dell’agnc"],["268","1308","694","1335","A voi cadrà sui coronati altari"],["268","1258","779","1289","Devotamente al rinnovar d’ogn’anno."],["268","1213","707","1245","Voi dagli estri mortiferi volanti"],["268","1165","705","1203","E dall’orride serpi e da vepraj"],["269","1124","730","1158","E dalle avvelenate erbe guardale"],["269","1078","712","1115","Le pecorelle ai pascoli. Per voi"]]"

Roadmap

Test in locale:

  • programma python per l'estrazione, pagina per pagina, di un output detail=line e il caricamento nelle pagine Pagina
  • creazione di una routine js che all'apertura di una pagina esamini se il testo proviene da un djvutxt -detail=line (es: presenza di una stringa "(page" e multiple stringhe "(line" )
  • se si:
    • lancio del parser javascript, costruzione e caricamento del testo in editbox, caricamento di array righe serializzato caricamento dell'array righe in un array righePagina;
  • se no:
    • nulla
  • al submit partirà una routine per la serializzazione di righePagina e per il caricamento di areaDatiPagina nella pagina.
  • ad ogni edit della pagina l'area dati verrà caricata in areaDatiPagina, righePagina verrà deserializzata e cancellata da editbox.

Gestione datiPagina

datiPagina è un oggetto python, tipo dizionario, inizializzato in Common.js immediatamente prima di functionSALdelete():

datiPagina={};
 
function spanSALdelete() {
...

In fase di apertura in edit di una pagina Pagina, all'interno di spanSALdelete(), l'eventuale area dati viene identificata, cancellata del testo, deserializzata e caricata in datiPagina:

...
areaDatiPagina=find_stringa(editbox.value, "<!-- Area dati\n","\n-->",1);
        if (areaDatiPagina && areaDatiPagina!="") {
           editbox.value=editbox.value.replace(areaDatiPagina, "");
           datiPagina=JSON.parse(areaDatiPagina.replace("<!-- Area dati\n","").replace("\n-->",""));
           }

In fase di submit, un eventuale datiPagina non vuoto viene serializzato, marcato con codice commento html e aggiunto in fondo al testo della pagina nella funzione aggiungiSal():

if (JSON.stringify(datiPagina)!="{}") editbox.value+="<!-- Area dati\n"+JSON.stringify(datiPagina)+"\n-->";

In conclusione: datiPagina esiste solo in fase di edit di una pagina ed è inaccessibile all'utente, tranne che con javascript; la gestione è del tutto analoga a quella di proofreadpage_quality e di proofreadpage_username.

To do bot

  • scaricare da Commons il file djvu
  • dumparlo e parsare il dump; memorizzare il numero pagine e l'array delle dimensioni delle pagine in un oggetto python
  • liberare una directory djvutxt e per ogni pagina estrarre il txt con djvutxt -page=[numero] -detail=line >tex/[numero].txt
  • caricare il contenuto dei file nell'oggetto python (trasfromato in unicode)
  • aggiornare una lista di oggetti con coppia nome originale file-nome oggetto normalizzato e salvare l'oggetto con il nome normalizzato come pcl
  • cancellare il djvu

secondo programma (caricamento pagine):

  • dalla lista file ottenere il nome pcl normalizzato e leggere l'oggetto
  • per ogni pagina richiesta:
    • verificare che la pagina sia vuota
    • caricare il pure-txt ottenuto per concatenamento delle righe di testo + i dati per datiPagina pronti per il parsing js

All'apertura di una pagina:

  • riconoscimento dell'area dati grezza
  • parsing, memorizzazione in datiPagina, cancellazione area dati grezza