Discussioni utente:Alex brollo/varie/djvuXml2Txt.py

Contenuti della pagina non supportati in altre lingue.
Da Wikisource.

Nuovo prodotto[modifica]

@Ruthven condivido un attrezzo che sto usando con soddisfazione per la collana Wikisource:Scrittori d'Italia, con molti indici "vuoti" e spesso con OCR molto scadente (ottenuto con pdf2djvu e rispecchiante lo strato testo BEIC originale) --Alex brollo (disc.) 22:07, 28 mag 2020 (CEST)[rispondi]

@Ruthven Ripingo, il primo ping è certamente fallito. --Alex brollo (disc.) 22:08, 28 mag 2020 (CEST)[rispondi]
Grazie per il ping. Usi il file xml perché estrarre il testo dà risultati scadenti?
Oggi ho fatto le mie prime prove con djvutext, con risultati medi (ma dipende dall'OCR suppongo). Ci sarebbe un modo di splittare un testo che fornisco io (magari perché trascritto da google o da un'altra fonte)) e poi caricarlo (sempre automaticamente) su Wikisource?
Avevo un'altra domanda: che aspetto hanno i tuoi file regex.txt? Ciao --Ruthven (msg) 02:22, 30 mag 2020 (CEST)[rispondi]
@Ruthven Quello che tu vuoi è il match, ma purtroppo l'esplorazione (ennesima) dell'xml djvu mi ha sviato dalla (ostica) conversione python2-python3 della "mia" versione. Appena lo riprendo ti avviso. Penso però che ti troveresti meglio a studiare il file originale, più a<datto ad essere montato su server (il mio è fortemente modificato per uso locale). Purtroppo non so più dove sia.
L'estrazione dello strato testo con djvutxt riproduce fedelmente l'OCR, ma con una certa perdita di informazione (es. suddivisione in paragrafi). Poi nell'XML ci sono numerosissime altre informazioni, che sarebbe bello utilizzare.... un vecchio sogno, difficile ma a cui mi pare di avvicinarmi (centrature, font-size, prose/poesie....), allenarmi a maneggiarlo mi lascia aperta questa porta. In più, alcuni djvu BEIC avevano, al loro interno, non l'OCR IA, ma l'OCR del pdf BEIC, importato con psf2djvu, abbastanza disgustoso.
Ti copio qua l'attuale regex.txt che sto usando, sono tre stringhe per riga, separate da caratteri tab.
\t	 	0
¬	-	0
'	’	0
 +\n	\n	0	
-\n		0
^\s+	\n	0
à	á	0
ì	í	0
ù	ú	0
« 	«	0
 »	»	0
eh’ *   ch’ 0
Alex brollo (disc.) 18:44, 6 giu 2020 (CEST)[rispondi]
Grazie mille Alex brollo! Alla fine, l'idea del server è svanita, anche perché sarei il solo utente a usare tale script, quindi tanto vale far fare tutto al bot da locale. Appena trovi la tua versione del match, giramela, che magari ci penso io alla conversione (se non mi lancio prima in un'implementazione diversa). A presto! Ruthven (msg) 18:51, 6 giu 2020 (CEST)[rispondi]
@Ruthven Trovati; caricati in Utente:Alex brollo/testAlign.py, con l'aggiunta delle dipendenze (find_stringa, produci_lista, parseTemplate). Alle prime due funzioni sono legato da un profondo rapporto affettivo: con loro, e poco altro, senza regex nè partser xml, ho fatto tutto quello che riuscivo ad immaginare, lavorando perfino sul dump xml dell'intera wikisource. Bei tempi, con neuroni scoppiettanti.... :-)
Il codice è ostico, ma in breve: si tratta di estrarre lo strato testo del djvu con djvutxt, ben suddiviso in pagine (quindi l'opzione -detail=page), di convertirlo in una lista di testi, di splittarlo con geniali regex che generano due liste: sole parole e separatore-parola-separatore-parola, di fare lo stesso con il testo da matchare, e poi di usare difflib sulle due liste di parole (dal djvu e dal testo da matchare). A suo tempo l'avevo capito quasi completamente. Alex brollo (disc.) 22:18, 6 giu 2020 (CEST)[rispondi]

Primi risultati da analisi dello shape[modifica]

@Ruthven. Ci riprovo con l'analisi dello shape, che dovrebbe permettere il riconoscimento della natura del testo dalle coordinate delle parole. Il primo passo, riuscito abbastanza bene, è il riconoscimento della riga di intestazione (pagina e capitoletto) in testa alla pagina per la sua eliminazione; ed effettivamente la routine trovaIntestazione() ci riesce, via regex era una procedura lunga e incerta.

Sto raccogliendo le idee in Utente:Alex brollo/Shape. E' alto il rischio di riscoprire l'acqua calda, ma non importa; un testo tosto sull'argomento impossibile da applicare, ma con alcune idee suggestive, è questo. Alex brollo (disc.) 07:12, 14 giu 2020 (CEST)[rispondi]

PS: in corso revisione profonda, devo interiorizzare global, lambda, le list comprehensions e sorted()... sono anni che rimando ma è ora! --Alex brollo (disc.) 10:11, 14 giu 2020 (CEST)[rispondi]
@Alex brollo Ciao, alcune cose sono semplici, come sorted(), e le capisci in 2 minuti. La classificazione baiesiana dell'articolo è più complessa, sopratutto se non sei del campo. Direi di usare direttamente i loro risultati, se sono online, senza preoccuparsi di implementarli daccapo. È roba di 10 anni fa comunque, magari sono andati avanti sull'argomento e gli stessi risultati ci sono con reti neurali, che magari trovi già allenate e non devi far altro che usarle. --Ruthven (msg) 10:38, 15 giu 2020 (CEST)[rispondi]
@Ruthven Il problema è che l'articolo non riguarda, da quello che capisco, le coordinate dei frammenti di testo, ma i frammenti di testo (i caratteri). Ho la sensazione che il "mondo delle coordinate" sia una cosa del tutto diversa, e molto più ricca di dati. E anche più divertente come sfida.... ;-)
E' un po' come il mondo pywikibot. Penso di non aver mai usato uno degli script pronti. Siccome lo faccio per divertimento, faccio quello che mi diverte; lo so benissimo che chi entra nel mio personale "mondo degli script" si diverte, aimè, molto di meno. --Alex brollo (disc.) 11:24, 15 giu 2020 (CEST)[rispondi]
Infatti (sgrunt!) La questione è sempre di sapere se usare tutto questo tempo sulle coordinate serve a qualcosa. Ricordo che a como raccontasti delle meraviglie dello strato sotto al DJVU che permette di identificare lettere e parole nella scansione. Ma poi ho usato il Google OCR su un PDF senza strato testo soggiacente ed ha funzionato benissimo. È vero che poter selezionare una parola permette, in un ebook, di cercarne la definizione e altre amenità simili, ma penso che lo stesso si possa fare con un PDF con un OCR automatico. Detto ciò, come dice un mio caro amico: "Dove c'è gusto, non c'è perdenza", quindi non abbandonare mai i tuoi personali script, che sono una fonte di divertimento per te. Ma oltre a questo, dal lato mio vorrei trovare soluzioni efficienti. Ognuno si diverte come sa ;) Ruthven (msg) 22:15, 15 giu 2020 (CEST)[rispondi]

Ripensamento[modifica]

Primo ripensamento profondo di varie routine (con imprecazioni su BeautifulSoup).

Le routine base di analisi lavorano su variabili globali, fra cui soupPage (oggetto bs4 della pagina corrente); analisiPagina() aggiorna Blines e rectsLines. Il quinto elemento di rectsLines è l'indice delle linee nella lista Blines.

Il primo risultato "grosso" è la ricomposizione del contenuto di linee erroneamente spezzate in parti dall'OCR perchè interpretate come colonne (es. numero dei versi, ma anche personaggi di testi teatrali in versi, oltre che righe di intestazione) --Alex brollo (disc.) 21:53, 18 giu 2020 (CEST)[rispondi]