Migliorare l’elaborazione dei documenti scientifici con il Nougat

Migliorare la redazione dei documenti scientifici con il Nougat

Introduzione

Nel campo in continua evoluzione del trattamento del linguaggio naturale e dell’intelligenza artificiale, la capacità di estrarre informazioni preziose da fonti di dati non strutturati, come i PDF scientifici, è diventata sempre più critica. Per affrontare questa sfida, Meta AI ha introdotto Nougat, o “Neural Optical Understanding for Academic Documents”, un modello all’avanguardia basato su Transformer progettato per trascrivere i PDF scientifici in un formato Markdown comune. Nougat è stato presentato nel lavoro intitolato “Nougat: Neural Optical Understanding for Academic Documents” di Lukas Blecher, Guillem Cucurull, Thomas Scialom e Robert Stojnic.

Questo prepara il terreno per una trasformazione rivoluzionaria nella tecnologia di riconoscimento ottico dei caratteri (OCR) e Nougat è l’ultima aggiunta all’impressionante linea di modelli di intelligenza artificiale di Meta AI. In questo articolo, esploreremo le capacità di Nougat, capiremo la sua architettura e mostreremo un esempio pratico di utilizzo di questo modello per trascrivere documenti scientifici.

Obiettivi di apprendimento

  • Comprendere Nougat, l’ultimo modello Transformer di Meta AI per i documenti scientifici.
  • Imparare come Nougat si basa sul suo predecessore, Donut, e introduce un approccio all’avanguardia all’intelligenza artificiale documentale.
  • Imparare Nougat, inclusi il suo codificatore di visione, decodificatore di testo e processo di addestramento end-to-end.
  • Acquisire conoscenze sull’evoluzione della tecnologia OCR, dai primi giorni delle ConvNets al potere trasformativo delle architetture Swin e dei decodificatori auto-regressivi.

Questo articolo è stato pubblicato come parte della Data Science Blogathon.

La nascita di Nougat

Nougat non è il primo modello Transformer nella famiglia di Meta AI. Segue le orme del suo predecessore “Donut”, che ha mostrato il potere di encoder di visione e decoder di testo in un modello basato su Transformer. Il concetto era semplice: alimentare pixel nel modello e ottenere un output di testo. Questo approccio end-to-end rimuove pipeline complesse e dimostra che l’attenzione era tutto ciò che era necessario.

Discutiamo brevemente il concetto sottostante del paradigma “encoder di visione, decoder di testo” che alimenta modelli come Nougat. Donut, il predecessore di Nougat, ha introdotto la capacità di combinare l’elaborazione di visione e testo in un singolo modello. A differenza delle tradizionali pipeline di elaborazione documentale, questi modelli operano in modo end-to-end, prendendo dati di pixel grezzi e producendo contenuti testuali. Questo approccio sfrutta la funzionalità di attenzione dell’architettura Transformer per ottenere risultati.

Nougat prende il testimone

Basandosi sul successo di Donut, Meta AI ha lanciato Nougat per portare l’OCR al livello successivo. Come il suo predecessore, Nougat utilizza un encoder di visione sotto forma di Swin Transformer e un decoder di testo basato su mBART. Nougat predice il markdown del testo dai pixel grezzi dei PDF scientifici. Questo rappresenta una svolta fondamentale verso la semplificazione della trascrizione delle conoscenze scientifiche in un formato familiare come il Markdown.

Meta AI ha visto il paradigma visione-testo e lo ha applicato per affrontare le sfide dei documenti scientifici. I PDF, sebbene ampiamente adottati, spesso rappresentano una sfida per le macchine nel comprendere ed estrarre informazioni significative dalle conoscenze scientifiche.

I PDF possono essere un ostacolo al recupero efficace delle conoscenze a causa della perdita di informazioni semantiche, soprattutto quando si tratta di strutture matematiche. Per colmare questa lacuna, Meta AI ha introdotto Nougat.

Perché Nougat?

Le persone hanno tradizionalmente conservato le conoscenze scientifiche in libri e riviste, spesso sotto forma di PDF. Tuttavia, il formato PDF porta spesso alla perdita di informazioni semantiche cruciali, ad esempio quando si tratta di strutture matematiche. Nougat colma questa lacuna eseguendo l’OCR sui documenti scientifici e convertendoli in un linguaggio di markup. Questa svolta raccoglie le conoscenze scientifiche e rimuove la distanza tra i documenti leggibili dall’uomo e il testo leggibile dalla macchina.

Il nougat trascrive con successo complessi documenti scientifici effettuando l’ingegnerizzazione inversa di un motore OCR e basandosi sull’architettura del Transformer. Questo ha aperto le porte all’AI dei documenti. Bloccate nei PDF, le conoscenze scientifiche possono ora essere liberate e elaborate con il nougat.

Il viaggio dell’OCR

Il viaggio del nougat è una testimonianza della tecnologia OCR. Alla fine degli anni ’80, l’applicazione delle reti neurali convoluzionali (ConvNets) all’OCR è stata rivoluzionaria. Tuttavia, l’idea di addestrare un sistema end-to-end in grado di leggere un’intera pagina era solo un sogno a causa delle limitazioni dell’epoca.

Oggi, le architetture Swin, che combinano ConvNets con trasformatori e decodificatori auto-regressivi, hanno reso possibile la trascrizione di intere pagine. Come il donut, il nougat segue il paradigma testo-visione, un codificatore di immagini basato sul trasformatore e un decodificatore di testo auto-regressivo.

Utilizzo di Nougat: Un esempio pratico

Ora che abbiamo esplorato il nougat, immergiamoci in un esempio pratico di come utilizzare questo potente modello per trascrivere file scientifici PDF in un formato Markdown standard. Cammineremo passo dopo passo nel codice, fornendo spiegazioni e approfondimenti lungo il percorso. Il codice completo per questo articolo si trova qui https://github.com/inuwamobarak/nougat.

Configura l’ambiente

Installeremo le librerie. Queste includono pymupdf, per leggere i PDF come immagini, e altre librerie, python-Levenshtein e NLTK, per compiti di post-elaborazione.

!pip install -q pymupdf python-Levenshtein nltk!pip install -q git+https://github.com/huggingface/transformers.git

Carica il modello e il processore

In questo passaggio, caricheremo il modello nougat e il suo processore associato per preparare il modello per la trascrizione dei file PDF.

from transformers import AutoProcessor, VisionEncoderDecoderModelimport torch# Carica il modello nougat e il processore dal hubprocessor = AutoProcessor.from_pretrained("facebook/nougat-small")model = VisionEncoderDecoderModel.from_pretrained("facebook/nougat-small")

Gestiamo le risorse di memoria.

%%capturedevice = "cuda" if torch.cuda.is_available() else "cpu"model.to(device)

Ora passiamo a scrivere una funzione per rasterizzare il documento PDF nel passaggio successivo.

from typing import Optional, Listimport ioimport fitzfrom pathlib import Pathdef rasterize_paper(    pdf: Path,    outpath: Optional[Path] = None,    dpi: int = 96,    return_pil=False,    pages=None,) -> Optional[List[io.BytesIO]]:    """    Rasterizza un documento PDF in immagini PNG.    Args:        pdf (Path): Il percorso del file PDF.        outpath (Optional[Path], optional): La directory di output. Se None, verranno restituite le immagini PIL al loro posto. Defaults to None.        dpi (int, optional): La DPI di output. Defaults to 96.        return_pil (bool, optional): Se restituire le immagini PIL invece che scriverle su disco. Defaults to False.        pages (Optional[List[int]], optional): Le pagine da rasterizzare. Se None, verranno rasterizzate tutte le pagine. Defaults to None.    Returns:        Optional[List[io.BytesIO]]: Le immagini PIL se `return_pil` è True, altrimenti None.    """    pillow_images = []    if outpath is None:        return_pil = True    try:        if isinstance(pdf, (str, Path)):            pdf = fitz.open(pdf)        if pages is None:            pages = range(len(pdf))        for i in pages:            page_bytes: bytes = pdf[i].get_pixmap(dpi=dpi).pil_tobytes(format="PNG")            if return_pil:                pillow_images.append(io.BytesIO(page_bytes))            else:                with (outpath / ("%02d.png" % (i + 1))).open("wb") as f:                    f.write(page_bytes)    except Exception:        pass    if return_pil:        return pillow_images

Carica il PDF

In questo passaggio, carichiamo un esempio di PDF e utilizziamo il modulo fitz per convertirlo in una lista di immagini Pillow, ognuna delle quali rappresenta una pagina del PDF. Useremo Crouse et al. 2023.

dalla huggingface_hub import hf_hub_downloadfrom typing import Optional, Listimport ioimport fitzfrom pathlib import Pathfrom PIL import Imagefilepath = hf_hub_download(repo_id="inuwamobarak/random-files", filename="2310.08535.pdf", repo_type="dataset")immagini = rasterize_paper(pdf=filepath, return_pil=True)immagine = Image.open(images[0])immagine

Generare Trascrizione

In questa fase, prepariamo l’immagine per l’input nel modello Nougat. Criteri di sospensione personalizzati per controllare il processo di generazione autoregressiva. Questi criteri determinano quando il modello dovrebbe smettere di generare testo.

pixel_values = processor(images=image, return_tensors="pt").pixel_values

from transformers import StoppingCriteria, StoppingCriteriaListfrom collections import defaultdictclass RunningVarTorch:    def __init__(self, L=15, norm=False):        self.values = None        self.L = L        self.norm = norm    def push(self, x: torch.Tensor):        assert x.dim() == 1        if self.values is None:            self.values = x[:, None]        elif self.values.shape[1] < self.L:            self.values = torch.cat((self.values, x[:, None]), 1)        else:            self.values = torch.cat((self.values[:, 1:], x[:, None]), 1)    def variance(self):        if self.values is None:            return        if self.norm:            return torch.var(self.values, 1) / self.values.shape[1]        else:            return torch.var(self.values, 1)class StoppingCriteriaScores(StoppingCriteria):    def __init__(self, threshold: float = 0.015, window_size: int = 200):        super().__init__()        self.threshold = threshold        self.vars = RunningVarTorch(norm=True)        self.varvars = RunningVarTorch(L=window_size)        self.stop_inds = defaultdict(int)        self.stopped = defaultdict(bool)        self.size = 0        self.window_size = window_size    @torch.no_grad()    def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor):        last_scores = scores[-1]        self.vars.push(last_scores.max(1)[0].float().cpu())        self.varvars.push(self.vars.variance())        self.size += 1        if self.size < self.window_size:            return False        varvar = self.varvars.variance()        for b in range(len(last_scores)):            if varvar[b] < self.threshold:                if self.stop_inds[b] > 0 and not self.stopped[b]:                    self.stopped[b] = self.stop_inds[b] >= self.size                else:                    self.stop_inds[b] = int(                        min(max(self.size, 1) * 1.15 + 150 + self.window_size, 4095)                    )            else:                self.stop_inds[b] = 0                self.stopped[b] = False        return all(self.stopped.values()) and len(self.stopped) > 0

outputs = model.generate(    pixel_values.to(device),    min_length=1,    max_length=3584,    bad_words_ids=[[processor.tokenizer.unk_token_id]],    return_dict_in_generate=True,    output_scores=True,    stopping_criteria=StoppingCriteriaList([StoppingCriteriaScores()]),)

Postelaborazione

Infine, decodifichiamo gli ID dei token generati in un testo leggibile dall’uomo e applichiamo passaggi di postelaborazione per perfezionare il contenuto Markdown generato. L’output risultante rappresenta il contenuto trascritto del PDF scientifico.

generato = processor.batch_decode(outputs[0], skip_special_tokens=True)[0]generato = processor.post_process_generation(generato, fix_markdown=False)print(generato)

L’output generato è in forma di Markdown:

Ecco come eseguire un’inferenza con Nougat. È facile estrarre questo insieme di testi in markdown. Puoi trovare il codice completo per questo articolo qui https://github.com/inuwamobarak/nougat. Altri link sono disponibili per la consultazione alla fine dell’articolo.

Metriche di Performance

Una serie di metriche è stata utilizzata per valutare le performance di Nougat su un set di test. Queste metriche forniscono una visione completa delle capacità di Nougat nella trascrizione di documenti scientifici in formato Markdown.

Distanza di Modifica

La Distanza di Modifica (Distanza di Levenshtein) quantifica il numero di caratteri necessari per trasformare una stringa in un’altra. Comprende inserzioni, cancellazioni e sostituzioni. La distanza di modifica normalizzata è stata utilizzata per valutare Nougat, dividendo la distanza calcolata per il numero totale di caratteri. Questa metrica fornisce informazioni su quanto accuratamente Nougat trascrive i contenuti, tenendo conto delle sfumature dei documenti scientifici.

Punteggio BLEU

Questa è una metrica inizialmente progettata per valutare la qualità della traduzione automatica, il punteggio BLEU (Bilingual Evaluation Understudy) allinea il testo candidato generato da Nougat con il testo di riferimento. Calcola un punteggio basato sul numero di n-grammi corrispondenti tra i due testi. Questo mostra come Nougat cattura l’essenza del contenuto originale e le similarità di n-grammi.

Punteggio METEOR

Un’altra importante metrica per la traduzione automatica, METEOR, tiene conto della completezza rispetto alla precisione. Sebbene non sia la scelta abituale per la valutazione dell’OCR, fornisce una prospettiva unica su come Nougat conserva il contenuto principale e i materiali di origine. METEOR, come BLEU, aiuta a valutare la qualità del testo trascritto.

Misura F

Il punteggio F1 combina la precisione e la completezza della trascrizione di Nougat. È una prospettiva equilibrata sulle prestazioni del modello, considerando la sua capacità di catturare i contenuti e conservare informazioni significative con precisione.

Possibili Applicazioni di Nougat Oltre ai Documenti Accademici

Sebbene Nougat sia stato principalmente progettato per la trascrizione di documenti accademici, le sue applicazioni si estendono ben oltre. Ecco alcune aree potenziali in cui Nougat può avere un impatto significativo:

Documenti Medici

Nougat può essere impiegato per trascrivere registri medici e note cliniche. Ciò può facilitare la digitalizzazione delle informazioni sanitarie e il recupero delle informazioni per i professionisti medici.

I documenti legali, i contratti e i documenti giudiziari sono comunemente in formato PDF. Nougat può facilitare la trasformazione di questi documenti in testo leggibile dalle macchine, semplificando i processi legali e la ricerca.

Campi Specializzati

La versatilità di Nougat consente di utilizzarlo in campi specializzati come l’ingegneria, la finanza e altro ancora. Può convertire rapporti tecnici, bilanci finanziari e altri documenti specifici di un determinato dominio.

Nougat rappresenta una pietra miliare nell’IA dei documenti, una soluzione pratica ed efficiente per la trascrizione di documenti scientifici in formato Markdown leggibile dalle macchine. Il suo contributo all’AI dei documenti è uno sguardo al futuro, in cui il recupero delle informazioni sarà più efficiente.

Il Futuro del Riconoscimento del Testo Scientifico

Nougat viene sempre utilizzato nel VisionEncoderDecoder, riprendendo l’architettura di Donut. Le immagini vengono inserite nel modello e il VisionEncoderDecoder di Nougat genera il testo in modo autoregressivo. La classe NougatImageProcessor gestisce la pre-elaborazione dell’immagine e NougatTokenizerFast decodifica i token target generati nella stringa target. Il NougatProcessor combina queste classi per l’estrazione delle caratteristiche e la decodifica dei token.

Questa capacità è all’avanguardia e presto si adatterà ancora di più. Nougat rappresenta l’IA dei documenti. Una soluzione per la trascrizione di documenti scientifici in formato Markdown leggibile dalle macchine. Man mano che questo modello continua a diffondersi, ha il potenziale per rivoluzionare il modo in cui ricercatori e accademici interagiscono con la letteratura scientifica, rendendo le conoscenze più facilmente accessibili e utilizzabili nell’era digitale.

Conclusioni

Nougat è molto più di un dolce aggiunta alla famiglia Meta AI; è un passo rivoluzionario nel mondo della OCR per i documenti scientifici. La sua capacità di convertire PDF complessi in testo Markdown rappresenta una svolta nel campo della conoscenza scientifica. Man mano che la tecnologia continua a crescere, l’impatto di Nougat si farà sentire nell’AI, nell’elaborazione dei documenti e oltre.

In un mondo in cui l’accesso alla conoscenza è fondamentale, Nougat è uno strumento potente per sbloccare il tesoro di informazioni contenute nei documenti scientifici, colmando il divario tra documenti leggibili dall’uomo e testo leggibile dalle macchine. Il suo contributo all’IA dei documenti è uno sguardo al futuro, in cui il recupero delle informazioni sarà più efficiente che mai.

Punto chiave

  • Nougat è il modello di IA avanzata di Meta per la trascrizione di file scientifici in formato Markdown user-friendly.
  • Il modello combina un encoder di visione Swin Transformer e un decoder di testo basato su mBART, consentendo di lavorare in modo end-to-end.
  • Mostra come l’architettura dei transformer semplifichi compiti complessi come la trascrizione di documenti scientifici.
  • L’evoluzione della tecnologia OCR, dai primi ConvNets alle moderne architetture Swin e ai decoder auto-regressivi, ha reso possibili le capacità di Nougat.

Domande frequenti

  • https://huggingface.co/facebook/nougat-base
  • https://github.com/NielsRogge/Transformers-Tutorials/
  • https://github.com/inuwamobarak/nougat
  • https://arxiv.org/abs/2310.08535
  • https://arxiv.org/abs/2308.13418
  • https://huggingface.co/datasets/inuwamobarak/random-files
  • https://huggingface.co/spaces/ysharma/nougat

I contenuti multimediali mostrati in questo articolo non sono di proprietà di Analytics Vidhya e vengono utilizzati a discrezione dell’autore.