Verificare la presenza di artefatti come rumore, distorsioni prospettiche o ombre, correggendo inclinazioni con algoritmi di trasformazione geometrica (homography). Strumenti consigliati: OpenCV con funzioni `cv2.phaseOtsu()` e `cv2.findHomography()`, integrati in Python.
Esempio pratico:
import cv2
import numpy as np
from pdf2image import convert_from_path
pages = convert_from_path(“documento_scansionato.pdf”, dpi=300)
for i, page in enumerate(pages):
gray = cv2.cvtColor(np.array(page), cv2.COLOR_RGB2GRAY)
thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_OTSU, cv2.THRESH_BINARY, 11, 2)
cv2.imwrite(f”page_{i+1}.png”, thresh)
Questo passaggio riduce drasticamente errori di OCR dovuti a basso contrasto o distorsione, ponendo le basi per un riconoscimento preciso.
Utilizzare Tesseract OCR con addestramento personalizzato (`–tessdata` o addestramento via `tessdata` o `tesseract-train`).
Esempio di addestramento con `tesseract-train`:
tesseract input.png output.txt –tessdata /italian-tessdata –oem 3 –psm 6 –psm 6 –oem 1 –psm 6 –psm 6
O addestrare modelli deep learning con framework come CRNN o CRNN-OCR (es. CRNN-OCR con TensorFlow), addestrati su dataset di testo scansionato italiano con annotazioni di entità.
Integrare output in JSON strutturato per ogni pagina, includendo riconoscimento testo, bounding box e livello di confidenza:
{“page”:0, “text”:[“Il consiglio comunale approva il bilancio 2024.”, “Firma digitale obbligatoria entro 15 giorni”], “confidence”:[0.94, 0.88], “bounding_boxes”:[[50, 100, 300, 250], [450, 80, 400, 220]]}
Questo formato supporta parsing semantico e validazione automatica, fondamentale per il Tier 3.
Adottare un approccio ibrido:
1. **Regole linguistiche**: Usare pattern NER in italiano basati su regex e dizionari di entità (es. `shd` per codici, `regex` per date gg, 9, 9.0), integrati in Python con `spaCy` addestrato su dataset legali/amministrativi.
2. **Modelli NLP multilingue (italiano)**: Caricare modelli `spaCy-it` o `flau` con embedding fine-tunati su corpora istituzionali regionali (es. documenti fiscali o contratti).
Esempio di pipeline:
import spacy
nlp = spacy.load(“it_core_news_sm”)
doc = nlp(“Il pagamento di 1.250,50 € è stato effettuato il 12 marzo 2024. Consiglio comunale approvato 2024/03/15.”)
for ent in doc.ents:
print(f”{ent.text} → {ent.label_} (confidence: {ent.kb_get_score():.2f})”)
Per gestire formule e tabelle complesse (es. estratti contabili), applicare algoritmi di riconoscimento layout (tabula-py o custom segmentazione con OpenCV) per identificare righe, colonne e celle.
Implementare una pipeline di validazione a livelli:
– **Controllo formato**: Normalizzare date (gg/mm/aaaa → AADDAA), numeri (9 → 9.0, 9, gg → 99), codici fiscali (convalidazione lunghezza e checksum).
– **Cross-check contestuale**: Verificare che importi rispettino soglie aziendali o normative (es. importi > 10.000€ richiedono approvazione).
– **Dizionari di contesto**: Utilizzare ontologie di entità (es. codici ISTAT, normative regionali) per filtrare valori errati.
– **Gestione ambiguità**: Applicare modelli di disambiguazione basati su contesto (es. “2024” come anno o mese) con regole basate su date precedenti o ciclicità.
Esempio di correzione automatica:
def normalizza_importo(valore):
if valore.endswith(“€”) and valore.replace(“€”, “”).replace(“,”, “”) == “1000”:
return 1000.00
return float(valore.replace(“,”, “”).replace(“€”, “”))
Il feedback umano (annotazioni su errori ricorrenti) alimenta cicli di apprendimento attivo, migliorando il modello con il tempo.
- Sovrapposizione testo background: Mitigata con pre-processing avanzato (rimozione sfondi con Gabor filter o U-Net semantic segmentation) e segmentazione basata su profondità di campo.
- Ambiguità numeri/date: Risolte con dizionari contestuali e regole di parsing dinamico (es. “9.0” → 9.0, “2024/03” → 2024-03).
- Caratteri latini speciali non riconosciuti: Validazione UTF-8 rigorosa e addestramento OCR su dataset multilingue con esempi di grafia italiana regionale (es. “ghj” in siciliano).
- Incoerenza formati (gg, 9, 9.0): Normalizzazione automatica tramite regole esplicite e validazione post-OCR con checksum contestuale.
- Falsi positivi in OCR: Ottimizzazione con threshold dinamici (es. confidence > 0.9) e post-filtro basato su contesto semantico (es. “il pagamento di 9.0 €” è probabile errore in un contesto di importi).