import { Heading, Strikethrough, UAnnotation as U } from '@steffo/bluelib-react' import type { NextPage } from 'next' import { Link } from '../../../components/link' import { Box, Split, r, Help, Color, Code, I, Todo, B, LI, Anchor, P, Aside, LatexMath } from "../../../components/compat-old" import tokenStyle from "./tokenStyle.module.css" import Image from "next/image" const Token = ({ children = undefined, indexTerm = undefined, stopword = undefined }: any) => { if(indexTerm) { return ( {children} ) } if(stopword) { return ( {children} ) } return ( {children} ) } const API = () => API const Glob = () => Glob const IC = () => IC const IDF = () => {`idf`} const IR = () => IR const Locuzione = () => locuzione const Omonimi = () => Omonimi const Predicato = () => predicato const RSV = () => RSV const Regex = () => Regex const TF = () => {`tf`} const TFIDF = () => tf-idf const UIN = () => UIN const Page: NextPage = () => { return <> Ottimizzazione lineare intera

Si parla di come processare enormi quantità di testo al fine di effettuarvi ricerche.

🎓 Il corso è stato tenuto dalla Prof.ssa Federica Mandreoli.

📘 Le dispense sono disponibili su Dolly (FIM).

🎥 Le videolezioni sono state eliminate.

È il processo di raccolta documenti, elaborazione query e richiamo di più risposte.

Un'applicazione che effettua si chiama motore di ricerca.

Sono le unità con cui lavora il motore di ricerca.

Possono essere di vario tipo: pagine web, metadati di file, paper accademici...

Vengono raccolti in svariati modi: possono provenire da , essere forniti manualmente e poi processati con un parser, essere scoperti tramite web crawling e processati tramite web scraping...

Un insieme di documenti è detto collezione.

La richiesta di informazioni effettuata da un utente, in un linguaggio che il motore di ricerca è in grado di capire.

Solitamente vi è possibile inserire parole chiave e operatori per specificare cosa si desidera trovare.

I documenti che il motore di ricerca sceglie di mostrare all'utente in quanto li ha ritenuti rilevanti alla query effettuata.

Spesso sono composte da metadati del documento e da un breve estratto della sezione del documento più rilevante.

Astrazione che rappresenta un singolo significato di una parola o .

{`q`}-grammi}>

Sequenze di {`q`} caratteri e spazi vuoti (indicati con ␣).

Una procedura svolta quando un documento viene aggiunto al motore di ricerca, permettendone l'indicizzazione e in seguito il richiamo.

È suddivisa in varie fasi, generalmente 5 o 6.

Tutte le parole del documento vengono trasformate in token.

Spesso si decide di distinguere tra gli attraverso algoritmi di word sense disambiguation, in grado di dedurre il contesto analizzando i significati delle parole circostanti.

Il motore di ricerca decide come trattare i simboli tipografici, la grafia delle lettere, le cifre, modificando l'insieme di token come ritiene necessario.

Le stopwords, i token ritenuti inutili ai fini delle ricerche, vengono eliminate dall'insieme di token ottenuto nel passo precedente.

Stopwords comuni sono gli articoli, le congiunzioni e, in generale, tutte le parole più frequenti di una lingua.

Talvolta capita di dover distinguere tra stopwords e nomi propri, soprattutto nell'inglese; per risolvere il problema ci si affida alla disambiguazione degli Omonimi effettuata durante l'analisi lessicale.

Ai token del passo precedente vengono sostituite le radici (stems) oppure le forme base (lemmas) delle parole.

Gli algoritmi che realizzano questo passo sono detti rispettivamente stemmer o lemmatizer.

Il motore di ricerca stabilisce la relativa importanza di ciascun token dell'insieme, in modo da determinare più facilmente in seguito la rilevanza del documento in cui si trovano.

I termini più importanti di un documento sono detti index term.

Essi solitamente sono individuati da parser e scanner, che analizzano la semantica di ciascun token.

Opzionalmente, l'intero documento può essere inserito in una o più categorie di un thesaurus, una gerarchia predeterminata di categorie di documenti.

Una misura di quanto due token hanno significati in comune.

Generalmente si basa su un thesaurus.

La word sense disambiguation sfrutta la similitudine tra l'ononimo e i token circostanti per stabilire il significato corretto.

Talvolta alla similitudine sono aggiunte anche altre informazioni, come la distanza tra i token e dati provenienti da sorgenti esterne.

Un modo di misurare la similitudine tra due token basato sulla loro posizione all'interno del thesaurus.

Si basa sull'inverso della distanza tra i due token all'interno dell'albero:

{`sim_{pd}(t_1, t_2) = \\frac{1}{dist(t_1, t_2) + 1}`}

Si basa sulla profondità del minimo antenato comune tra i due token:

{`sim_{wp}(t_1, t_2) = 2 \\cdot \\frac{depth(mac_{\\ t_1,t_2})}{depth(t_1) + depth(t_2)}`}
Similitudine -based}>

L' è una misura probabilistica di quanto un token sia inaspettato all'interno di un documento.

Definendo {`P(t)`} come la probabilità che un token scelto a caso sia {`t`}, l' sarà:

{`ic(t) = - \\log \\left( P(t) \\right)`}

La similitudine -based è quindi un modo di misurare la similitudine basato sull'.

Si basa sull' del minimo antenato comune:

{`sim_{r} (t_1,t_2) = ic \\left( mac_{\\ t_1,t_2} \\right)`}

Una parte della normalizzazione dei token che corregge gli errori ortografici commessi durante l'inserimento della query.

Aumenta la soddisfazione dell'utente e gli consente di effettuare ricerche per termini di cui non conosce lo spelling.

È possibile trovare per ogni token dei suoi vicini utilizzabili per migliorare la query:

Dato un token, si cercano tutti i token entro un certo valore di edit distance.

Il numero minimo di operazioni per convertire un token in un altro.

Definisce operazioni le seguenti azioni:

  • Inserimento di un singolo carattere
  • Rimozione di un singolo carattere
  • Sostituzione di un singolo carattere

Matrice costruita per calcolare la distanza di Levenshtein con un algoritmo greedy:

Estende la distanza di Levenshtein con una nuova operazione:

  • Trasposizione di un singolo carattere

Differenzia i costi delle varie operazioni, diffenenziando ad esempio in base al carattere sostituito.

Calcolare l'edit distance {`E`} tra due token è un processo computazionalmente molto costoso {`O(n^2)`}.

È possibile evitare di calcolare l'edit distance per la maggior parte dei termini del vocabolario pre-filtrandoli su criteri computazionalmente più veloci.

{r`E \geq \left| size(X) - size(Y) \right|`} Differenza di {r`q`}-grammi}> {r`E \geq \frac{\max ( size(X), size(Y) ) - size(X \cap Y) + q - 1}{q}`} Posizione dei {r`q`}-grammi}>

Richiede che venga tenuto traccia delle posizione dei {`q`}-grammi, e prevede che i {`q`}-grammi a più di {`k`} posizioni di distanza non vengano considerati uguali.

Tramite overlap dei {`q`}-grammi}>

Dato un token, si ordinano i token del vocabolario in base al numero di {`q`}-grammi in comune.

Misura di overlap tra due insiemi di {`q`}-grammi {`X`} e {`Y`}:

{r`Jaccard = \frac{size(X \cap Y)}{size(X \cup Y)}`}

Esistono motori di ricerca che usano un algoritmo per convertire i token nella loro corrispondente pronuncia ed effettuano match sulla base di quest'ultima.

Scoperti i token "vicini", si può optare per varie soluzioni:

Sostituire automaticamente il token originale con il più vicino ad esso.

Richiede che le possibili correzioni siano ordinate.

Visualizzare l'errore all'utente, e permettergli di correggerlo rapidamente.

Richiede più interazione da parte dell'utente.

Aggiungere automaticamente alla query i token corretti.

Richiede più tempo di ricerca, perchè nella query saranno presenti più token.

È possibile confrontare ogni token con il contesto dei termini circostanti per rilevare ulteriori errori.

Un metodo che prevede di enumerare varie alternative aventi contesti concordi e di restituire quella con il maggior numero di risultati.

Un metodo che prevede di enumerare varie alternative aventi contesti concordi e di restituire quella che è stata ricercata più volte.

Gli indici sono strutture dati in cui vengono inseriti i documenti e i loro token dopo essere stati preparati.

L'indicizzazione è la procedura che crea e mantiene aggiornati uno o più indici.

Sono fondamentali per velocizzare notevolmente le ricerche e per permettere certi tipi di operazioni sulle query.

Un indice basato sulla costruzione di una matrice in cui le righe sono i documenti, le colonne i token e le celle valori booleani che descrivono se il token compare nel documento.

È terribilmente inefficiente in termini di spazio, perchè la matrice è sparsa.

Una sua evoluzione spazialmente più efficiente è l'inverted index.

L'indice più comune, costituito da tante posting list raggiungibili attraverso un vocabolario.

L'insieme di tutte le occorrenze di un dato token.

Può essere realizzata in due modi:

  • Document-based: lista ordinata di documenti con la frequenza del token in essi
  • Word-based: lista ordinata di documenti che punta a una lista ordinata delle posizioni del token in essi

Essendo le liste ordinate, vi è possibile effettuare operazioni di unione e intersezione in tempo lineare utilizzando dei cursori.

Non è però altrettanto efficiente in operazioni di negazione.

L'insieme delle associazioni tra token e la loro posting list.

Ci sono tanti modi diversi di implementarlo:

  • Doppia lista ordinata: lista di token che punta a una lista di occorrenze
  • Trie: albero in cui ogni arco rappresenta una stringa e ogni nodo una concatenazione delle stringhe tra sè e la radice
    • Prefix tree: trie che usa i prefissi dei token
    • Suffix tree: trie che usa i suffissi dei token
  • B+ tree: albero particolarmente ottimizzato, in cui le foglie sono le occorrenze
  • Dizionario: hashmap che usa come chiave il token stesso, e una lista di occorrenze come valore

Generalmente, occupano spazio logaritmico rispetto al numero di token.

Ogni motore di ricerca implementa un diverso query language, un'interfaccia per l'utente che gli permette di effettuare ricerche in base alla sua necessità di informazioni .

Ogni query language può poi implementare diverse funzionalità in base al tipo di documento indicizzato.

Essendo una via di mezzo tra linguaggio naturale e linguaggio di programmazione, permettono a un utente qualunque di fruire del motore di ricerca, senza bisogno di conoscenze approfondite sul suo funzionamento.

All'interno della query vengono inserite una o più keywords da ricercare all'interno dei documenti.

Prevedono la possibilità di richiedere che due o più keyword siano consecutive.

Prevedono la possibilità di richiedere che due o più keyword siano a una certa distanza una dall'altra.

Prevedono la possibilità di cercare prefissi, suffissi, sottostringhe e intervalli di keyword.

Prevedono la possibilità di usare tag provenienti da un thesaurus limitato di cui è garantita la precisione.

Prevedono la possibilità di limitare la query a specifiche sezioni del documento.

Prevedono la possibilità di effettuare più query e applicare le operazioni di intersezione, unione e negazione sui risultati.

Implementazione dei patterns}>
  1. Separa prefisso e suffisso in due parti collegate da un AND:
  2. Trova i risultati delle due parti attraverso un doppio vocabolario implementato con sia prefix sia suffix tree:
  3. Effettua l'intersezione delle due parti:

È costoso in termini di tempo: ci saranno tanti risultati che andranno processati, e l'intersezione è {`O(n + m)`}.

Un particolare prefix tree in cui vengono inserite tutte le possibili permutazioni di ogni token, con in aggiunta un marcatore per la fine della parola (░):

È possibile effettuare ricerche wildcard ruotando la wildcard a destra, trasformando tutti i pattern in prefissi:

È costoso in termini di spazio: ogni termine va salvato molte volte nel vocabolario (permuterm problem).

Tramite {`q`}-gram indexes}> {`q`}-gram index}>

Vocabolario aggiuntivo che associa {`q`}-grammi ai token corrispondenti del vocabolario principale.

È possibile interpretare la ricerca come intersezione di {`q`}-grammi:

I risultati della ricerca andranno post-filtrati, in quanto ci potrebbero essere dei falsi positivi:

Modelli di }>

Sono modelli matematici in grado di selezionare e ordinare i documenti in base alla loro rilevanza rispetto alla query.

Stabiliscono i risultati richiamati dal motore di ricerca e l'ordine con cui vengono visualizzati.

Rappresentano la query come un insieme di index term, e assegnano le rilevanze confrontando l'insieme con gli index term dei documenti.

Ad ogni index term del documento viene indipendentemente assegnato un peso in base alla sua rilevanza nella query.

Modello classico che rappresenta la query come un booleano, e genera la rilevanza valutandolo su ogni documento:

Variante del modello booleano che permette ai documenti di soddisfare parzialmente il :

Le operazioni fuzzy diventano quindi:

Modello classico che rappresenta il vocabolario come uno spazio vettoriale, in cui ogni dimensione rappresenta un token.

Ogni documento viene rappresentato come un vettore {`d`}, i cui valori sono pesi {`d_i`} assegnati in base a quanto il token è signficativo all'interno del documento.

Le query vengono anch'esse trasformate in vettori {`q`}, e le rilevanze vengono ottenute dalla similitudine vettoriale tra i vettore query e i vettori documenti.

Peso }>

Un metodo di assegnamento peso che si basa sul prodotto dei fattori e :

{`d_i = tf_{norm}(i) \\cdot idf_{log}(i)`} : Term frequency}>

Misura quanto un token è frequente nel singolo documento:

{`tf(i) = \\frac{occorrenze}{totale\\ token}`}

Nella formula principale, viene normalizzato dividendolo per il più alto del documento, limitandolo così a valori tra 0 e 1:

{`tf_{norm}(i) = \\frac{tf(i)}{\\max_{j:\\ docs}\\ tf(j)}`}
: Inverse document freq.}>

Misura quanto un token è raro nella collezione di documenti:

{`idf(i) = \\frac{totale\\ documenti}{documenti\\ con\\ occ.}`}

Nella formula principale, viene logaritmizzato, al fine di ridurre significativamente il suo impatto:

{`idf_{log}(i) = \\log(idf(i))`}

Un modo di misurare la similitudine tra insiemi di token rappresentati come dimensioni vettoriali.

Si basa sulla norma a 2, e corrisponde a cercare l'angolo centrato all'origine tra i due vettori:

{` sim_{\\cos} (d, q) = \\frac{ \\vec{d} \\cdot \\vec{q} }{ \\| \\vec{d} \\|_2 \\cdot \\| \\vec{q} \\|_2 } = \\frac{ \\sum_{i = 0}^{dim.} (d_i \\cdot q_i ) }{ \\sqrt{\\sum_{i = 0}^{dim.} (d_i^2)} \\cdot \\sqrt{\\sum_{i = 0}^{dim.} (q_i^2}) } `}

Implementazione del modello vettoriale che ordina i documenti {`d`} in base alla probabilità {`R`} che siano rilevanti per la query {`q`}:

{`sim_{prob} = \\frac{P(R\\ |\\ d, q)}{P(\\overline{R}\\ |\\ d, q)}`}

Si dimostra che è possibile determinare quanto la presenza di un dato token {`k_i`} in un documento {r`d`} ne contribuisca alla rilevanza per la query {r`\vec{q}`}:

{` c_i = \\log \\frac{P(k_i\\ |\\ R, \\vec{q})}{1 - P(k_i\\ |\\ R, \\vec{q})} + \\log \\frac{1 - P(k_i\\ |\\ \\overline{R}, \\vec{q})}{P(k_i\\ |\\ \\overline{R}, \\vec{q})} `}

Modello classico che ordina i documenti in base a un punteggio ad essi assegnato.

L' deriva dalla somma per ogni termine della query del prodotto di tre fattori:

{`RSV = \sum_{t \in q} (x \\cdot y \\cdot z)`} Fattore {`x`}}>

Un moltiplicatore basato sull' dei termini della query presenti nel documento:

{r` x = ( idf_{\log} ) `}
Fattore {`y`}}>

Un moltiplicatore basato sulla nel documento dei termini nella query:

{r` y' = \frac{ (k_1 + 1) \cdot tf_{td} }{ k_1 + tf_{td} } `}

Ad esso viene in genere applicata una normalizzazione basata sulla lunghezza del documento:

{r` y = \frac{(k_1 + 1) \cdot tf_{td}}{k_1 \cdot \left( 1 - b + \left( b \cdot \frac{L_d}{L_{avg}} \right) \right) + tf_{td}} `}
Fattore {`z`}}>

Un moltiplicatore basato sulla nella query stessa dei termini nella query:

{`z = \\frac{(k_3 + 1) \\cdot tf_{tq}}{k_3 + tf_{tq}}`}

Ad esso non viene ovviamente applicata alcuna normalizzazione.

Modello per classificare documenti intercollegati in base a come essi sono collegati tra loro.

Algoritmo di Link Analysis Ranking query-independent che assegna un grado a ogni pagina indicizzata.

Misura iterativa di quanto una pagina è importante rispetto a tutte le altre indicizzate.

{r` R'_i(p) = (1 - \alpha) \cdot \sum_{q:\ parents} \left( \frac{R_{i-1}(q)}{N_q} \right) + \alpha \cdot E(p) `}

In cui:

  • {`q`} è una pagina che referenzia quella in questione;
  • {`R_{i-1}(q)`} è il rank normalizzato della pagina {r`q`};
  • {`N_q`} è il numero totale di link presenti nella pagina q;
  • {`E(p)`} è una sorgente di rank;
  • {`\\alpha`} è un parametro che regola l'emissione della sorgente di rank e la dissipazione del rank preesistente.

Funzione che introduce nuovo rank nel sistema ad ogni iterazione.

PageRank normale prevede che questa funzione sia costante; è possibile però personalizzarlo rendendo la funzione variabile, facendo in modo che vengano assegnati rank più alti a certi tipi di pagine.

Rank riscalato a valori inclusi tra 0 e 1.

{r` R_i(p) = \frac{R'_i(p)}{\sum_{d:\ pages} \left( R'_i(d) \right)} `}

Solitamente, il rank viene rinormalizzato ad ogni iterazione.

Algoritmo di Link Analysis Ranking query-dependent che attribuisce due diversi valori ad ogni pagina: autorità e hubness.

Viene applicato solo a un base set, ovvero all'unione del root set (i match della query) con tutti i nodi ad essi direttamente connessi.

Misura di quanto la pagina in questione viene referenziata da altri siti autoritativi.

{r` a'_i(p) = \sum_{e:\ entering} h_{i-1}(e) `}

Misura di quanto la pagina in questione referenzia siti autoritativi.

{r` h'_i(p) = \sum_{l:\ leaving} a_{i-1}(l) `}

Autorità riscalata a valori inclusi tra 0 e 1.

{r` a_i(p) = \frac{a'_i(p)}{\sum_{d:\ pages} \left( a'_i(d) \right)} `}

Hubness riscalata a valori inclusi tra 0 e 1.

{r` h_i(p) = \frac{h'_i(p)}{\sum_{d:\ pages} \left( h'_i(d) \right)} `}
Profilazione sistemi }>

Misurazioni che vengono effettuate sui sistemi di .

Per vedere quanto funziona bene un sistema di !

Per ottenere delle misure, solitamente si preparano in anticipo delle query dette benchmark delle quali si è già a conoscenza dei documenti rilevanti.

Le due misure usate più di frequente per misurare l'utilità dei risultati sono recall e precision.

Misura quanti documenti rilevanti sono stati richiamati dalla collezione:

{`Recall = \\frac{size(A \\cap R)}{size(R)}`}

Misura quanti documenti richiamati sono rilevanti:

{`Precision = \\frac{size(A \\cap R)}{size(A)}`}

La precisione di una query che richiama {`R`} elementi.

A precisione {`R`}, il richiamo relativo ad una query.

Curva che associa percentili di richiamo ai corrispondenti valori di R-Precision.

È detta naturale se include un punto per ogni documento richiamato.

È detta standard se usa le percentuali da 10% a 100% come punti.

Mostra il valore massimo di precisione per valori di richiamo maggiori o uguali a quelli del punto.

Esistono misure che riassumono i risultati di più benchmark in una sola.

Se si hanno più benchmark, corrispondenti a più curve di richiamo, si possono ottenere le medie dei valori ai vari livelli, ottenendo così una curva di precisione media.

La media di tutti i livelli di precisione media.

Misura che combina richiamo e precisione in un singolo valore:

{r` F = \frac{2}{\frac{1}{Recall} + \frac{1}{Precision}} = 2 \cdot \frac{Recall \cdot Precision}{Recall + Precision} `}

Complemento della media armonica configurabile che permette di selezionare se dare priorità {`b`} alla precisione ({`b > 1`}) oppure al richiamo ({`b < 1`}):

{r` E = 1 - \frac{1 + b^2}{\frac{b^2}{Recall} + \frac{1}{Precision}} `}

Misura che attribuisce guadagni decrescenti in base alla precisione di ogni documento richiamato.

Variante del Discounted Cumulative Gain che divide il punteggio finale per il valore perfetto ottenibile.

Il modo in cui i risultati vengono visualizzati all'utente.

Permettere all'utente di vedere velocemente tutti i risultati e di scegliere il risultato a lui più utile.

Il motore di ricerca web mostra all'utente un elenco di collegamenti ai documenti richiamati.

Solitamente include alcuni dati del documento, come titolo, sommario e url.

Un breve riassunto del contenuto del documento richiamato.

Un sommario i cui contenuti dipendono solo dal documento, e non dalla query immessa.

Un sommario che varia da query a query, evidenziando le parti rilevanti del documento.

} export default Page