Che cos'è il parsing dei dati?

Mar-06-20245 minuti di lettura

Il parsing dei dati è un termine che si incontra spesso quando si lavora con grandi quantità di dati, soprattutto per coloro che effettuano lo scraping dei dati dal web e per gli ingegneri informatici. Tuttavia, il data parsing è un argomento che deve essere approfondito. Ad esempio, che cos'è esattamente il parsing dei dati, e come

Il parsing dei dati è un termine che si incontra spesso quando si lavora con grandi quantità di dati, soprattutto per coloro che effettuano lo scraping dei dati dal web e per gli ingegneri informatici. Tuttavia, il data parsing è un argomento che deve essere approfondito. Ad esempio, che cos'è esattamente il parsing dei dati e come lo si implementa nel mondo reale.

Questo articolo risponderà a tutte le domande di cui sopra e fornirà una panoramica delle terminologie significative associate al parsing dei dati.

Cosa significa parsing?

Quando si estraggono grandi quantità di dati dal web scraping, questi sono in formato HTML. Sfortunatamente, non è un formato leggibile per i non programmatori. È quindi necessario lavorare ulteriormente sui dati per renderli in un formato leggibile dall'uomo e quindi adatto all'analisi da parte degli scienziati dei dati. È il parser a svolgere la maggior parte di questo lavoro pesante.

Cosa fa un parser di dati?

Un parser converte i dati in un formato in dati in un'altra forma. Ad esempio, il parser converte i dati HTML ottenuti tramite scraping in JSON, CSV e persino in una tabella, in modo da renderli leggibili e analizzabili. Vale la pena ricordare che il parser non è legato a un particolare formato di dati.

Il parser non analizza ogni stringa HTML, perché un buon parser distingue i dati richiesti nei tag HTML dal resto.

Diverse tecnologie che utilizzano il parser

Come si è detto nella sezione precedente, poiché il parser non è legato a una tecnologia specifica, è per sua natura eccezionalmente flessibile. Per questo motivo è utilizzato da un'ampia varietà di tecnologie:

Linguaggi di scripting: sono i linguaggi che non necessitano di un compilatore per l'esecuzione, poiché si basano su una serie di comandi all'interno di un file. Esempi tipici sono PHP, Python e JavaScript.

Java e altri linguaggi di programmazione - I linguaggi di programmazione ad alto livello, come Java, utilizzano un compilatore per convertire il codice sorgente in linguaggio assembly. Il parser è un componente importante di questi compilatori che crea una rappresentazione interna del codice sorgente.

HTML e XML: nel caso dell'HTML, il parser estrae il testo contenuto nei tag HTML come titolo, intestazioni, paragrafi ecc. Mentre un parser XML è una libreria che facilita la lettura e la manipolazione dei documenti XML.

Linguaggi SQL e di database: il parser SQL, ad esempio, analizza una query SQL e genera i campi definiti nella query SQL.

Linguaggi di modellazione: il parser dei linguaggi di modellazione consente a sviluppatori, analisti e stakeholder di comprendere la struttura del sistema che viene modellato.

I linguaggi interattivi per i dati sono utilizzati per l'elaborazione interattiva di grandi quantità di dati, tra cui le scienze spaziali e la fisica solare. 

Perché è necessario il parsing dei dati?

La ragione principale della necessità del parsing è che diverse entità hanno bisogno di dati in formati diversi. Il parsing consente quindi di trasformare i dati in modo che possano essere compresi da un essere umano o, in alcuni casi, dal software. Un esempio importante di quest'ultimo è rappresentato dai programmi per computer. In primo luogo, gli esseri umani li scrivono in un formato comprensibile con un linguaggio di alto livello analogo a una lingua naturale come l'inglese che usiamo quotidianamente. Poi i computer li traducono in una forma di codice a livello macchina che i computer possono comprendere.

Il parsing è necessario anche nelle situazioni in cui è necessaria la comunicazione tra due software diversi, ad esempio la serializzazione e la deserializzazione di una classe.

La terminologia del parsing e la struttura del parser

Fino a questo punto si conoscono i concetti fondamentali del parsing dei dati. Ora è il momento di esplorare i concetti significativi associati al parsing dei dati e al funzionamento del parser. 

Terminologia

Espressioni regolari

Le espressioni regolari sono una serie di caratteri che definiscono uno schema particolare. Sono comunemente utilizzate dai linguaggi di alto livello e di scripting per convalidare un indirizzo e-mail o una data di nascita. Sebbene siano considerate inadatte al parsing dei dati, possono comunque essere utilizzate per il parsing di input semplici. Questo equivoco nasce dal fatto che alcuni programmatori utilizzano le espressioni regolari per ogni operazione di parsing, anche quando non dovrebbero essere utilizzate. In queste circostanze, il risultato è una serie di espressioni regolari che sono state manipolate insieme.

È possibile utilizzare le espressioni regolari per analizzare alcuni semplici linguaggi di programmazione, noti anche come linguaggi regolari. Tuttavia, questo non include l'HTML, che può essere considerato un linguaggio semplice. Ciò è dovuto al fatto che all'interno dei tag HTML si trova un numero qualsiasi di tag arbitrari. Inoltre, secondo la sua grammatica, ha elementi ricorsivi e annidati che non possono essere classificati come linguaggio regolare. Pertanto, non è possibile analizzarli, per quanto si possa essere abili. 

Grammatiche

La grammatica è un insieme di regole che descrive una lingua dal punto di vista sintattico. Pertanto, si applica solo alla sintassi e non alla semantica di una lingua. In altre parole, la grammatica si applica alla struttura di una lingua e non al suo significato. Consideriamo l'esempio seguente:

HI: "HI"

NOME: [a-zA-z] +

Saluto: CIAO NOME

Due dei possibili output per il codice di cui sopra possono essere "HI SARA" o "HI Coding". Per quanto riguarda la struttura del linguaggio, entrambi sono corretti. Tuttavia, nel secondo output, poiché "Coding" non è il nome di una persona, non è corretto dal punto di vista semantico.

Anatomia della grammatica

Possiamo osservare l'anatomia della grammatica con le forme comunemente utilizzate, come la Backus-Naur Form (BNF). Questa forma ha una variante, che è la forma Backus-Naur estesa, e indica la ripetizione. Un'altra variante della BNF è la forma Backus-Naur aumentata. Si usa quando si descrivono protocolli di comunicazione bidirezionali.

Quando si utilizza una regola tipica del modulo Backus-Naur, l'aspetto è questo:

<symbol> : : _expression_

The <symbol> is nonterminal, which means you can replace it with elements on the right,  _expression_. The _expression_ could contain terminal symbols as well as nonterminal symbols. 

Vi starete chiedendo cosa sono i simboli terminali? Sono quelli che non appaiono come simboli in nessun componente della grammatica. Un tipico esempio di simbolo terminale è una stringa di caratteri come "Programma".

Poiché la regola come quella sopra riportata definisce tecnicamente la trasformazione tra il nonterminale e il gruppo di nonterminali e terminali a destra, può essere chiamata regola di produzione.

Tipo di grammatica 

Esistono due tipi di grammatiche: le grammatiche regolari e le grammatiche libere da contesto. Le grammatiche regolari sono utilizzate per definire un linguaggio comune. Esiste anche un tipo di grammatica più recente, nota come Parsing Expression Grammar (PEG), che rappresenta i linguaggi liberi dal contesto ed è anche potente come grammatica libera dal contesto. In ogni caso, la differenza tra i due tipi dipende dalla notazione e da come vengono implementate le regole.

Un modo più semplice per distinguere due grammatiche sono le _espressioni_, o il lato destro della regola potrebbe essere nella forma di :

  • Una stringa vuota
  • Un simbolo di un singolo terminale
  • Un singolo simbolo terminale è seguito da un simbolo non terminale.

In realtà, questo è più facile a dirsi che a farsi, perché un particolare strumento potrebbe consentire più simboli terminali in una definizione. Quindi potrebbe trasformare l'espressione in una serie corretta di espressioni che appartengono a uno dei due casi precedenti.

Quindi anche un'espressione volgare che scrivete sarà trasformata in forma corretta, anche se non è compatibile con un linguaggio naturale.

Componenti di un parser

Poiché il parser è responsabile dell'analisi di una stringa di simboli in un linguaggio di programmazione conforme alle regole grammaticali appena discusse, possiamo suddividere la funzionalità del parser in un processo a due fasi. In genere, il parser viene incaricato di leggere, analizzare e trasformare programmaticamente i dati non strutturati in un formato strutturato.

I due componenti principali che costituiscono un parser sono l'analisi lessicale e l'analisi sintattica. Inoltre, alcuni parser implementano anche un componente di analisi semantica che prende i dati strutturati e li filtra come: positivi o negativi, completi o incompleti. Sebbene si possa pensare che questo processo migliori ulteriormente il processo di analisi dei dati, non è sempre così.  

L'analisi semantica non è integrata nella maggior parte dei parser, a causa delle pratiche più diffuse di analisi semantica umana. Pertanto, l'analisi semantica dovrebbe essere un passo aggiuntivo e, se si intende effettuarla, deve essere complementare agli obiettivi aziendali.

Parliamo quindi dei due processi principali del parser.

Analisi lessicale

Viene eseguito dai Lexar, chiamati anche scanner o tokenizer, il cui ruolo è quello di trasformare una sequenza di dati grezzi non strutturati o di caratteri in token. Spesso questa stringa di caratteri che entra nel parser è in formato HTML. Il parser crea quindi i token utilizzando unità lessicali, tra cui parole chiave, identificatori e delimitatori. Contemporaneamente, il parser ignora i dati lessicalmente irrilevanti di cui abbiamo parlato nella sezione introduttiva. Ad esempio, includono gli spazi bianchi e i commenti all'interno di un documento HTML.

Dopo aver scartato i token irrilevanti durante il processo lessicale, il resto del processo di parsing si occupa dell'analisi sintattica.

Analisi sintattica

Questa fase del parsing dei dati consiste nella costruzione di un albero di parsing. Ciò implica che, dopo aver creato i token, il parser li organizza in un albero. Durante questo processo, anche i token irrilevanti vengono catturati nella struttura di annidamento dell'albero stesso. I token irrilevanti includono parentesi, punti e virgola e parentesi graffe.

Per farvi capire meglio questo concetto, illustriamolo con una semplice equazione matematica: (a*2)+4

il Lexer del parser li scomporrà in token come segue:

( => Parentesi

a => Valore

* => Moltiplicare

2 => Valore

 )=> Parentesi

+ => Più

4 => Valore

Successivamente, l'albero di parsing viene costruito come segue:

    Quando il parser estrae i dati dagli elementi HTML, seguirà lo stesso principio.

Parser interno o parser esterno?

Ora avete compreso gli aspetti fondamentali di un parser. Ora è il momento di decidere se costruire il proprio parser o affidarlo all'esterno. Per prima cosa, analizziamo i pro e i contro di ciascun metodo. 

I vantaggi di un parser interno

La costruzione di un parser interno comporta numerosi vantaggi. Uno dei vantaggi principali è quello di avere un maggiore controllo sulle specifiche. Inoltre, poiché i parser non sono limitati a un solo formato di dati, si ha la possibilità di personalizzarli per soddisfare diversi formati di dati. 

Altri vantaggi significativi sono il risparmio sui costi e il controllo dell'aggiornamento e della manutenzione del parser integrato. 

Contro del parser interno

Il parser interno non è privo di insidie. Uno dei principali svantaggi è che consumerebbe molto del vostro tempo prezioso quando avete un controllo sostanziale sulla manutenzione, gli aggiornamenti e i test. L'altro inconveniente è la possibilità di acquistare e costruire un server potente per analizzare tutti i dati più velocemente di quanto richiesto. Infine, dovreste formare tutto il vostro personale interno per costruire il parser e fornire formazione su di esso. 

Pro di un parser in outsourcing

Quando esternalizzate un parser, risparmierete il denaro che spendete per le risorse umane, poiché l'azienda acquirente vi fornirà tutti i compiti, compresi i server e il parser. Inoltre, è meno probabile che si verifichino errori significativi, poiché è più probabile che l'azienda che l'ha costruito testi tutti gli scenari prima di rilasciarlo sul mercato.

In caso di errore, l'azienda da cui avete acquistato il parser vi fornirà assistenza tecnica. Inoltre, risparmierete molto tempo, poiché le decisioni sulla costruzione del miglior parser verranno prese in outsourcing. 

Contro di un parser in outsourcing

Sebbene l'outsourcing offra numerosi vantaggi, presenta anche degli svantaggi. I principali svantaggi riguardano la personalizzazione e i costi. Dal momento che l'azienda di parsing ha creato la funzionalità completa, il costo è maggiore. Inoltre, il vostro controllo completo sulle funzionalità del parser sarebbe limitato.

Conclusione

In questo lungo articolo abbiamo appreso il funzionamento del parser, il processo di parsing dei dati in generale e i suoi fondamenti. Il parsing dei dati è un processo lungo e complicato. Quando avrete l'occasione di sperimentare il parsing dei dati, sarete ben equipaggiati con un bagaglio di conoscenze per eseguirlo in modo efficace.

Ci auguriamo che usiate queste conoscenze in modo efficace.