1
Fork 0
mirror of https://github.com/Steffo99/unisteffo.git synced 2024-11-28 10:54:18 +00:00
triennale-appunti-steffo/pages/year3/gestione/teoria.tsx

1718 lines
89 KiB
TypeScript
Raw Normal View History

2022-02-04 05:04:59 +00:00
import { Heading, Strikethrough, UAnnotation as U } from '@steffo/bluelib-react'
2022-06-28 17:13:40 +00:00
import type { NextPage, NextPageContext } from 'next'
2022-02-04 05:04:59 +00:00
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"
2022-06-28 17:13:40 +00:00
export async function getStaticProps(_context: NextPageContext) {
return {
props: {}
}
}
2022-02-04 05:04:59 +00:00
const Token = ({ children = undefined, indexTerm = undefined, stopword = undefined }: any) => {
if(indexTerm) {
return (
<B builtinColor='yellow'><span className={tokenStyle.token}>{children}</span></B>
)
}
if(stopword) {
return (
<Strikethrough builtinColor='red'><span className={tokenStyle.token}>{children}</span></Strikethrough>
)
}
return (
<span className={tokenStyle.token}>{children}</span>
)
}
const API = () => <Help text={"Application Programming Interface, fonti di dati fruibili attraverso HTTP"}>API</Help>
const Glob = () => <Help text={`La sintassi della ricerca tra file, dove ? sostituisce un singolo carattere, * un qualsiasi numero e ** include le sottocartelle.`}
>Glob</Help>
const IC = () => <Help text={`Information content, self-information, surprisal, Shannon information`}>IC</Help>
const IDF = () => <Help text={"Inverse document frequency, quanto un termine è raro all'interno della collezione di documenti"}><LatexMath>{`idf`}</LatexMath></Help>
const IR = () => <Help text={"Information Retrieval, il nome stesso del corso"}>IR</Help>
const Locuzione = () => <Help text={`Gruppo di parole che funzionano come una unica: a cavallo, forze dell'ordine, etc.`}>locuzione</Help>
const Omonimi = () => <Help text={"Parole che si leggono e scrivono nello stesso ma significano cose diverse."}>Omonimi</Help>
const Predicato = () => <Help text={"La minima unità booleana valutabile. `A`, `B`, etc. Equivalente a un evento in statistica, e a una variabile in matematica."}>predicato</Help>
const RSV = () => <Help text={"Retrieval Status Value, il punteggio assegnato ai documenti dal modello Okapi BM25"}>RSV</Help>
const Regex = () => <Help text={`Regular expressions, espressioni regolari, come /libr[oi]/ o /g.+o/`}>Regex</Help>
const TF = () => <Help text={"Term frequency, quanto un termine è frequente nel singolo documento"}><LatexMath>{`tf`}</LatexMath></Help>
const TFIDF = () => <Help text={"Metodo per calcolare i pesi che moltiplica il peso tf per il peso idf."}>tf-idf</Help>
const UIN = () => <Help text={`User Information Need, una descrizione in linguaggio naturale delle informazioni di cui ha bisogno l'utente`}>UIN</Help>
const Page: NextPage = () => {
return <>
<Heading level={2}>
2022-02-04 17:41:40 +00:00
<Link href="/year3/gestione">
2022-02-04 17:55:04 +00:00
Gestione dell&apos;informazione
2022-02-04 05:04:59 +00:00
</Link>
</Heading>
<Split title={"Information Retrieval"}>
<Box title={"Cos'è?"}>
<P>
È il <B>processo</B> di <B>raccolta documenti</B>, <B>elaborazione query</B> e <B>richiamo di più risposte</B>.
</P>
<P>
Un&apos;applicazione che effettua <IR/> si chiama <B>motore di ricerca</B>.
</P>
</Box>
</Split>
<Split>
<Box title={"Documenti"}>
<P>
Sono le unità con cui lavora il motore di ricerca.
</P>
<P>
Possono essere di vario tipo: <B>pagine web</B>, <B>metadati di file</B>, <B>paper accademici</B>...
</P>
<Aside>
2022-02-04 17:41:40 +00:00
<p>
Ad esempio, i documenti di <Anchor href={"https://google.com"}>Google Search</Anchor> sono le <B>pagine web</B>.
</p>
<Image src={"/images/year3/gestione/documents.png"} alt={"I documenti di Google per il dominio steffo.eu"} width={297} height={112}/>
2022-02-04 05:04:59 +00:00
</Aside>
<P>
Vengono raccolti in svariati modi: possono provenire da <B><API/></B>, essere forniti manualmente e poi processati con un <B>parser</B>, essere scoperti tramite <B>web crawling</B> e processati tramite <B>web scraping</B>...
</P>
<Aside>
Il web crawler più famoso è <Anchor href={"https://it.wikipedia.org/wiki/Googlebot"}>Googlebot</Anchor>, che visita ricorsivamente tutti i collegamenti presenti su ogni pagina.
</Aside>
<P>
Un insieme di documenti è detto <B><I>collezione</I></B>.
</P>
</Box>
<Box title={"Query"}>
<P>
La <B>richiesta di informazioni</B> effettuata da un utente, in un <B>linguaggio</B> che il motore di ricerca è <B>in grado di capire</B>.
</P>
<Aside>
2022-02-04 17:41:40 +00:00
<p>
In pratica, è quello che scrivi sulla casella di ricerca di Google!
</p>
<Image src={"/images/year3/gestione/query.png"} alt={"Un esempio di query su Google"} width={297} height={143}/>
2022-02-04 05:04:59 +00:00
</Aside>
<P>
Solitamente vi è possibile inserire <B>parole chiave</B> e <B>operatori</B> per specificare cosa
si desidera trovare.
</P>
<Aside>
È possibile vedere tutti gli operatori supportati da Google nella pagina <Anchor
href={"https://www.google.it/advanced_search"}
>Advanced Search</Anchor>.
</Aside>
</Box>
<Box title={"Risposte"}>
<P>
I <B>documenti</B> che il motore di ricerca sceglie di mostrare all&apos;utente in quanto li ha
ritenuti <B>rilevanti alla query effettuata</B>.
</P>
<P>
Spesso sono composte da <B>metadati del documento</B> e da un <B>breve estratto</B> della
sezione del documento più rilevante.
</P>
<Aside>
2022-02-04 17:41:40 +00:00
<p>
Google Search mostra <B>URL</B>, <B>titolo</B> e <B>descrizione</B> della pagina (o un
suo <B>estratto</B> se una descrizione non è disponibile).
</p>
<Image src={"/images/year3/gestione/result.png"} alt={"Una risposta di Google"} width={297} height={80}/>
2022-02-04 05:04:59 +00:00
</Aside>
</Box>
</Split>
<Split>
<Box title={"Token"}>
<P>
Astrazione che rappresenta un <B>singolo significato</B> di una parola o <Locuzione/>.
</P>
<Aside>
<P>
Sono token:
</P>
<ul>
<LI><Token>mela 🍎</Token></LI>
<LI><Token>ciao 👋</Token></LI>
<LI><Token>forze dell&apos;ordine 👮</Token></LI>
<LI>...</LI>
</ul>
</Aside>
</Box>
<Box title={<span><LatexMath>{`q`}</LatexMath>-grammi</span>}>
<P>
<B>Sequenze</B> di <B><LatexMath>{`q`}</LatexMath> caratteri</B> e <B>spazi vuoti</B> (indicati con ).
</P>
<Aside>
<P>
I <LatexMath>{`q`}</LatexMath>-grammi assumono vari nomi in base al valore
di <LatexMath>{`q`}</LatexMath>:
</P>
<ul>
<LI><U>Bigrammi</U>: <LatexMath>{`q = 2`}</LatexMath></LI>
<LI><U>Trigrammi</U>: <LatexMath>{`q = 3`}</LatexMath></LI>
<LI><U>Quadrigrammi</U>: <LatexMath>{`q = 4`}</LatexMath></LI>
<LI>...</LI>
</ul>
</Aside>
<Aside>
<P>
I trigrammi del token <Token>ciao</Token> sono:
</P>
<P>
<Token>c</Token> <Token>ci</Token> <Token>cia</Token> <Token>iao</Token> <Token>ao</Token> <Token>o</Token>
</P>
</Aside>
</Box>
</Split>
<Split title={"Preprocessing dei documenti"}>
<Box title={"Cos'è?"}>
<P>
Una <B>procedura</B> svolta quando un documento viene <B>aggiunto</B> al motore di ricerca, permettendone l&apos;indicizzazione e in seguito il richiamo.
</P>
<P>
È suddivisa in varie fasi, generalmente 5 o 6.
</P>
</Box>
</Split>
<Split>
<Box title={"1. Analisi lessicale"}>
<P>
Tutte le parole del documento vengono trasformate in <B>token</B>.
</P>
<Aside>
Treno per Modena <Token>Treno</Token> <Token>per</Token> <Token>Modena</Token>
</Aside>
<P>
Spesso si decide di <B>distinguere</B> tra gli <B><Omonimi/></B> attraverso algoritmi di <B><I>word sense disambiguation</I></B>, in grado di dedurre il contesto analizzando i significati delle
parole circostanti.
</P>
<Aside>
<Token>Sale 🧂</Token> oppure <Token>Sale 🪜</Token>?
</Aside>
</Box>
<Box title={"2. Normalizzazione dei token"}>
<P>
Il motore di ricerca decide come trattare i <B>simboli</B> tipografici, la <B><Help text={"Quello che in inglese si chiama 'case'. Sono grafie il maiuscolo, il minuscolo, il corsivo..."}>grafia</Help></B> delle lettere, le <B>cifre</B>, modificando l&apos;insieme di token come ritiene necessario.
</P>
<Aside>
<P>
Alcune possibili modifiche:
</P>
<ul>
<LI>
Rimozione degli accenti
<Aside>
<Token>caffè</Token> <Token>caffe</Token>
</Aside>
</LI>
<LI>
Rimozione maiuscole non-significative:
<Aside>
<Token>Treno</Token> <Token>per</Token> <Token>Modena</Token> <Token>treno</Token> <Token>per</Token> <Token>Modena</Token>
</Aside>
</LI>
<LI>
Separazione dei trattini
<Aside>
<Token>state-of-the-art</Token> <Token>state</Token> <Token>of</Token> <Token>the</Token> <Token>art</Token>
</Aside>
</LI>
<LI>
Correzione dei typo
<Aside>
<Token>vetr</Token> <Token>vetro</Token>
</Aside>
</LI>
</ul>
</Aside>
</Box>
<Box title={"3. Eliminazione delle stopwords"}>
<P>
Le <I>stopwords</I>, i token ritenuti <B>inutili</B> ai fini delle ricerche, vengono <B>eliminate</B> dall&apos;insieme di token ottenuto nel passo precedente.
</P>
<P>
Stopwords comuni sono gli <B><Help text={"Il, lo, la, un, una..."}>articoli</Help></B>, le <B><Help text={"E, perchè, ma, così..."}>congiunzioni</Help></B> e, in generale, tutte le <B>parole più frequenti</B> di una lingua.
</P>
<Aside>
<Token>basi</Token> <Token stopword={true}>di</Token> <Token>dati</Token>
</Aside>
<P>
Talvolta capita di dover <B>distinguere</B> tra stopwords e <B>nomi propri</B>, soprattutto
nell&apos;inglese; per risolvere il problema ci si affida alla disambiguazione degli Omonimi
effettuata durante l&apos;analisi lessicale.
</P>
<Aside>
La band <Anchor href={"https://en.wikipedia.org/wiki/The_Who"}>The Who</Anchor> è l&apos;incubo dei
motori di ricerca che eliminano indiscriminatamente le stopwords:
<Aside>
<Token stopword={true}>The</Token> <Token stopword={true}>Who</Token>
</Aside>
</Aside>
</Box>
</Split>
<Split>
<Box title={"4. Stemming / Lemmatizzazione"}>
<P>
Ai token del passo precedente vengono sostituite le <B>radici</B> (<I>stems</I>) oppure le <B>forme base</B> (<I>lemmas</I>) delle parole.
</P>
<Aside>
<P>
Alcune delle operazioni di <B>stemming</B> che possono essere effettuate sono:
</P>
<ul>
<LI>
Plurale Singolare
<Aside>
<Token>flowers</Token> <Token>flower</Token>
</Aside>
</LI>
<LI>
Verbo Infinito
<Aside>
<Token>goes</Token> <Token>go</Token>
</Aside>
</LI>
</ul>
</Aside>
<Aside>
<P>
Alcune delle operazioni di <B>lemmatizzazione</B> che possono essere effettuate sono:
</P>
<ul>
<LI>
Plurale Singolare
<Aside>
<Token>fiori</Token> <Token>fiore</Token>
</Aside>
</LI>
<LI>
Verbo Infinito
<Aside>
<Token>vado</Token> <Token>andare</Token>
</Aside>
</LI>
</ul>
</Aside>
<P>
Gli algoritmi che realizzano questo passo sono detti rispettivamente <B><I>stemmer</I></B> o <B><I>lemmatizer</I></B>.
</P>
<Aside>
Generalmente sono implementati tramite <Help text={"Dizionari che associano ogni parola alla sua forma base."}>lookup tables</Help>, ma i motori di ricerca più avanzati <Anchor href={"https://en.wikipedia.org/wiki/Stemming#Algorithms"}>possono avere implementazioni anche più complesse</Anchor>.
</Aside>
</Box>
<Box title={"5. Selezione degli index term"}>
<P>
Il motore di ricerca stabilisce la <B>relativa importanza</B> di ciascun token dell&apos;insieme, in modo da determinare più facilmente in seguito la rilevanza del documento in cui si trovano.
</P>
<P>
I termini più importanti di un documento sono detti <B><I>index term</I></B>.
</P>
<Aside>
<Token>appunti</Token> <Token>universitari</Token> <Token indexTerm={true}>appunti</Token> <Token>universitari</Token>
</Aside>
<P>
Essi solitamente sono individuati da <B><I>parser</I></B> e <B><I>scanner</I></B>, che
analizzano la semantica di ciascun token.
</P>
</Box>
<Box title={"6. Categorizzazione"}>
<P>
Opzionalmente, l&apos;intero documento può essere inserito in una o più <B>categorie</B> di un <B><I>thesaurus</I></B>, una gerarchia predeterminata di categorie di documenti.
</P>
<Aside>
Un esempio di thesaurus per delle sculture:
<ul>
<LI>
[Radice]
<ul>
<LI>
Materiale
<ul>
<LI>
Legno
<ul>
<LI>Pino</LI>
<LI>Betulla</LI>
<LI>Mogano</LI>
</ul>
</LI>
<LI>
Pietra
</LI>
</ul>
</LI>
<LI>
Forma
<ul>
<LI>Cubica</LI>
<LI>Sferica</LI>
<LI>Umanoide</LI>
</ul>
</LI>
</ul>
</LI>
</ul>
</Aside>
<Aside>
Un (simil-)thesaurus generale per l&apos;inglese è <Anchor
href={"https://wordnet.princeton.edu/"}
>WordNet</Anchor>, mentre uno per l&apos;italiano è <Anchor
href={"https://thes.bncf.firenze.sbn.it/thes-dati.htm"}
>Nuovo soggettario</Anchor>.
</Aside>
</Box>
</Split>
<Split title={"Similitudine"}>
<Box title={"Cos'è?"}>
<P>
Una <B>misura</B> di quanto due token hanno <B>significati in comune</B>.
</P>
<Aside>
<P>
<Token>uccello</Token> e <Token>pennuto</Token> sono molto simili, in quanto sono sinonimi
</P>
<P>
<Token>merlo</Token> e <Token>piccione</Token> sono abbastanza simili, in quanto sono entrambi uccelli, ma non sono sinonimi
</P>
<P>
<Token>merlo</Token> e <Token>ala</Token> non sono per niente simili
</P>
</Aside>
<P>
Generalmente si basa su un <B>thesaurus</B>.
</P>
</Box>
<Box title={"A cosa serve?"}>
<P>
La <B><I>word sense disambiguation</I></B> sfrutta la <B>similitudine</B> tra l&apos;ononimo e i <B>token circostanti</B> per stabilire il significato corretto.
</P>
<P>
Talvolta alla similitudine sono aggiunte anche altre informazioni, come la <B>distanza</B> tra i token e dati provenienti da <B>sorgenti esterne</B>.
</P>
</Box>
</Split>
<Split>
<Box title={"Similitudine path-based"}>
<P>
Un modo di misurare la similitudine tra due token basato sulla loro <B>posizione</B> all&apos;interno del <B>thesaurus</B>.
</P>
<Split>
<Box title={"Path-distance"}>
<P>
Si basa sull&apos;<B>inverso della distanza</B> tra i due token all&apos;interno dell&apos;albero:
</P>
<B><LatexMath
block={true}
>{`sim_{pd}(t_1, t_2) = \\frac{1}{dist(t_1, t_2) + 1}`}</LatexMath></B>
</Box>
<Box title={"Wu-Palmer"}>
<P>
Si basa sulla <B>profondità</B> del <B>minimo antenato comune</B> tra i due token:
</P>
<B><LatexMath
block={true}
>{`sim_{wp}(t_1, t_2) = 2 \\cdot \\frac{depth(mac_{\\ t_1,t_2})}{depth(t_1) + depth(t_2)}`}</LatexMath></B>
<Aside>
Varia più lentamente rispetto alla Path-distance.
</Aside>
</Box>
</Split>
</Box>
</Split>
<Split>
<Box title={<span>Similitudine <IC/>-based</span>}>
<P>
L&apos;<IC/> è una misura <B>probabilistica</B> di quanto un token sia inaspettato all&apos;interno di un documento.
</P>
<P>
Definendo <LatexMath>{`P(t)`}</LatexMath> come la probabilità che un <B>token scelto a caso</B> sia <LatexMath>{`t`}</LatexMath>, l&apos;<IC/> sarà:
</P>
<B><LatexMath block={true}>{`ic(t) = - \\log \\left( P(t) \\right)`}</LatexMath></B>
<P>
La <I>similitudine <IC/>-based</I> è quindi un modo di misurare la similitudine basato
sull&apos;<B><IC/></B>.
</P>
<Aside>
Le misure <IC/>-based tengono quindi conto della frequenza dei vari token nella collezione.
</Aside>
<Box title={"Resnik"}>
<P>
Si basa sull&apos;<B><IC/></B> del <B>minimo antenato comune</B>:
</P>
<B><LatexMath
block={true}
>{`sim_{r} (t_1,t_2) = ic \\left( mac_{\\ t_1,t_2} \\right)`}</LatexMath></B>
</Box>
</Box>
</Split>
<Split title={"Correzione dei typo"}>
<Box title={"Cos'è?"}>
<P>
Una parte della <B>normalizzazione dei token</B> che corregge gli errori ortografici commessi
durante l&apos;inserimento della query.
</P>
</Box>
<Box title={"A cosa serve?"}>
<P>
Aumenta la <B>soddisfazione</B> dell&apos;utente e gli consente di effettuare ricerche per termini di
cui <B>non conosce lo spelling</B>.
</P>
</Box>
</Split>
<Box title={"Correzione token isolati"}>
<P>
È possibile trovare per ogni token dei suoi <I>vicini</I> utilizzabili per migliorare la query:
</P>
<Box title={"Tramite edit distance"}>
<P>
Dato un token, si cercano tutti i token <B>entro un certo valore</B> di <I>edit distance</I>.
</P>
<Box title={"Edit distance"}>
<P>
Il numero <B>minimo</B> di <I>operazioni</I> per convertire un token in un altro.
</P>
<Split>
<Box title={"Levenshtein distance"}>
<P>
Definisce <I>operazioni</I> le seguenti azioni:
</P>
<ul>
<LI><B>Inserimento</B> di un singolo carattere</LI>
<LI><B>Rimozione</B> di un singolo carattere</LI>
<LI><B>Sostituzione</B> di un singolo carattere</LI>
</ul>
<Aside>
La distanza di Levenshtein tra <Token>pierta</Token> e <Token>pietra</Token> è 2.
</Aside>
<Box title={"Matrice di distanza"}>
<P>
Matrice costruita per calcolare la distanza di Levenshtein con un algoritmo greedy:
</P>
<Aside>
<Anchor href={"https://gist.github.com/Steffo99/ceeb7ed61a7b6a12a783232c0230ce70"}>Guarda
un esempio documentato in Python qui!</Anchor>
</Aside>
</Box>
</Box>
<Box title={"Damerau-Levenshtein distance"}>
<P>
Estende la distanza di Levenshtein con una nuova operazione:
</P>
<ul>
<LI><B>Trasposizione</B> di un singolo carattere</LI>
</ul>
<Aside>
La distanza di Damerau-Levenshtein tra <Token>pierta</Token> e <Token>pietra</Token> è 1.
</Aside>
</Box>
<Box title={"Weighted distance"}>
<P>
Differenzia i costi delle varie operazioni, diffenenziando ad esempio in base al carattere sostituito.
</P>
<Aside>
<code>m</code> ed <code>n</code> sono vicini sulla tastiera e quindi la loro sostituzione &quot;costa&quot; meno, rispetto a <code>q</code> e <code>p</code>.
</Aside>
</Box>
</Split>
<P>
Calcolare l&apos;edit distance <LatexMath>{`E`}</LatexMath> tra due token è un processo computazionalmente <B>molto costoso <LatexMath>{`O(n^2)`}</LatexMath></B>.
</P>
<Box title={"Pre-filtraggio"}>
<P>
È possibile evitare di calcolare l&apos;edit distance per la maggior parte dei termini del
vocabolario <I>pre-filtrandoli</I> su <B>criteri computazionalmente più veloci</B>.
</P>
<Split>
<Box title={"Differenza di lunghezza"}>
<Aside>
L&apos;edit distance come minimo è la differenza tra il numero di caratteri dei due
token.
</Aside>
<B><LatexMath block={true}>{r`E \geq \left| size(X) - size(Y) \right|`}</LatexMath></B>
</Box>
<Box title={<span>Differenza di <LatexMath>{r`q`}</LatexMath>-grammi</span>}>
<Aside>
L&apos;edit distance è limitata superiormente dal numero di <LatexMath>{r`q`}</LatexMath>-grammi per cui i due token differiscono.
</Aside>
<Todo block={true}>
<B><LatexMath block={true}>{r`E \geq \frac{\max ( size(X), size(Y) ) - size(X \cap Y) + q - 1}{q}`}</LatexMath></B>
</Todo>
</Box>
<Box title={<span>Posizione dei <LatexMath>{r`q`}</LatexMath>-grammi</span>}>
<Aside>
Token i cui <LatexMath>{`q`}</LatexMath>-grammi si trovano in posizioni diverse avranno edit distance più alte.
</Aside>
<P>
Richiede che venga tenuto traccia delle posizione dei <LatexMath>{`q`}</LatexMath>-grammi, e prevede che i <LatexMath>{`q`}</LatexMath>-grammi a <B>più di <LatexMath>{`k`}</LatexMath> posizioni di distanza</B> non vengano considerati uguali.
</P>
</Box>
</Split>
</Box>
</Box>
</Box>
<Box title={<span>Tramite overlap dei <LatexMath>{`q`}</LatexMath>-grammi</span>}>
<P>
Dato un token, si <B>ordinano</B> i token del vocabolario in base al numero di <LatexMath>{`q`}</LatexMath>-grammi in comune.
</P>
<Box title={"Coefficiente di Jaccard"}>
<P>
<B>Misura di overlap</B> tra due insiemi di <LatexMath>{`q`}</LatexMath>-grammi <LatexMath>{`X`}</LatexMath> e <LatexMath>{`Y`}</LatexMath>:
</P>
<B><LatexMath block={true}>{r`Jaccard = \frac{size(X \cap Y)}{size(X \cup Y)}`}</LatexMath></B>
<Aside>
<P>
Usando trigrammi, il <I>coefficiente di Jaccard</I> tra <Token>novembre</Token> e <Token>dicembre</Token> è:
</P>
<ul>
<LI>
<LatexMath>{`X \\cap Y =\\ `}</LatexMath>
<Token>emb</Token>&nbsp;
<Token>mbr</Token>&nbsp;
<Token>bre</Token>&nbsp;
<Token>re</Token>&nbsp;
<Token>e</Token>
</LI>
<LI>
<LatexMath>{`X \\cup Y =\\ `}</LatexMath>
<Token>n</Token>&nbsp;
<Token>no</Token>&nbsp;
<Token>nov</Token>&nbsp;
<Token>ove</Token>&nbsp;
<Token>vem</Token>&nbsp;
<Token>d</Token>&nbsp;
<Token>di</Token>&nbsp;
<Token>dic</Token>&nbsp;
<Token>ice</Token>&nbsp;
<Token>cem</Token>&nbsp;
<Token>emb</Token>&nbsp;
<Token>mbr</Token>&nbsp;
<Token>bre</Token>&nbsp;
<Token>re</Token>&nbsp;
<Token>e</Token>
</LI>
<LI>
<LatexMath>{`Jaccard = \\frac{size(X \\cap Y)}{size(X \\cup Y)} = \\frac{5}{15} = 0.33`}</LatexMath>
</LI>
</ul>
</Aside>
</Box>
</Box>
<Box title={"Tramite algoritmi fonetici"}>
<P>
Esistono motori di ricerca che usano un algoritmo per convertire i token nella loro
corrispondente <B>pronuncia</B> ed effettuano match sulla base di quest&apos;ultima.
</P>
<Aside>
Un metodo usato per correggere errori tipografici durante confronto di nomi propri è il <Anchor href={"https://en.wikipedia.org/wiki/Soundex"}>Soundex</Anchor>, un algoritmo che converte le parole in codici rappresentanti i loro suoni.
</Aside>
</Box>
<Box title={"Proposte di correzione"}>
<P>
Scoperti i token &quot;vicini&quot;, si può optare per varie soluzioni:
</P>
<Split>
<Box title={"Sostituzione"}>
<P>
<I>Sostituire</I> automaticamente il token originale con il più vicino ad esso.
</P>
<P>
Richiede che le possibili correzioni siano <B>ordinate</B>.
</P>
<Aside>
<P>
È quello che fa di default Google:
</P>
2022-02-04 17:41:40 +00:00
<Image src={"/images/year3/gestione/replacement.png"} alt={"Google ha corretto il token errato per me."} width={284} height={98}/>
2022-02-04 05:04:59 +00:00
</Aside>
</Box>
<Box title={"Visualizzazione"}>
<P>
<i>Visualizzare</i> l&apos;errore all&apos;utente, e permettergli di correggerlo rapidamente.
</P>
<P>
Richiede più <B>interazione</B> da parte dell&apos;utente.
</P>
<Aside>
<P>
È quello che fa Google quando non è sicuro della correzione proposta:
</P>
2022-02-04 17:41:40 +00:00
<Image src={"/images/year3/gestione/suggestion.png"} alt={"Google suggerisce di correggere il token errato."} width={238} height={80}/>
2022-02-04 05:04:59 +00:00
</Aside>
</Box>
<Box title={"Aggiunta"}>
<P>
<i>Aggiungere</i> automaticamente alla query i token corretti.
</P>
<P>
Richiede più <B>tempo di ricerca</B>, perchè nella query saranno presenti più token.
</P>
</Box>
</Split>
</Box>
</Box>
<Box title={"Correzione contestualizzata"}>
<P>
È possibile confrontare ogni token con il contesto dei termini circostanti per rilevare ulteriori errori.
</P>
<Split>
<Box title={"Conteggio dei risultati"}>
<P>
Un metodo che prevede di <B>enumerare</B> varie alternative aventi contesti concordi e di restituire quella con il <B>maggior numero di risultati</B>.
</P>
</Box>
<Box title={"Conteggio delle ricerche"}>
<P>
Un metodo che prevede di <B>enumerare</B> varie alternative aventi contesti concordi e di restituire quella che <B>è stata ricercata più volte</B>.
</P>
</Box>
</Split>
</Box>
<Split title={"Indici"}>
<Box title={"Cosa sono?"}>
<P>
Gli indici sono <B>strutture dati</B> in cui vengono inseriti i documenti e i loro token dopo essere stati preparati.
</P>
<P>
L&apos;<B><I>indicizzazione</I></B> è la procedura che crea e mantiene aggiornati uno o più <B><I>indici</I></B>.
</P>
</Box>
<Box title={"A cosa servono?"}>
<P>
Sono fondamentali per <B>velocizzare notevolmente</B> le ricerche e per permettere certi tipi di operazioni sulle query.
</P>
</Box>
</Split>
<Box title={"Matrice di incidenza"}>
<P>
Un indice basato sulla costruzione di una matrice in cui le righe sono i <B>documenti</B>, le colonne i <B>token</B> e le celle valori booleani che descrivono se il token compare nel documento.
</P>
<P>
È terribilmente <B>inefficiente</B> in termini di spazio, perchè la matrice è <B>sparsa</B>.
</P>
<P>
Una sua evoluzione spazialmente più efficiente è l&apos;<B><I>inverted index</I></B>.
</P>
</Box>
<Box title={"Inverted index"}>
<P>
L&apos;<B>indice</B> più comune, costituito da tante <B><I>posting list</I></B> raggiungibili attraverso un <B><I>vocabolario</I></B>.
</P>
<Split>
<Box title={"Posting list"}>
<P>
L&apos;<B>insieme</B> di tutte le <B>occorrenze</B> di un dato token.
</P>
<P>
Può essere realizzata in due modi:
</P>
<ul>
<LI>
<U>Document-based</U>: lista ordinata di documenti con la <B>frequenza del token</B> in essi
</LI>
<LI>
<U>Word-based</U>: lista ordinata di documenti che punta a una lista ordinata delle <B>posizioni</B> del token in essi
</LI>
</ul>
<P>
Essendo le liste <B>ordinate</B>, vi è possibile effettuare operazioni di <B>unione</B> e <B>intersezione</B> in <B>tempo lineare</B> utilizzando dei <B>cursori</B>.
</P>
<P>
Non è però altrettanto efficiente in operazioni di <B>negazione</B>.
</P>
</Box>
<Box title={"Vocabolario"}>
<P>
L&apos;insieme delle <B>associazioni</B> tra <B>token</B> e la loro <B>posting list</B>.
</P>
<P>
Ci sono tanti modi diversi di implementarlo:
</P>
<ul>
<LI>
<U>Doppia lista ordinata</U>: <B>lista di token</B> che punta a una <B>lista di occorrenze</B>
</LI>
<LI>
<U>Trie</U>: <B>albero</B> in cui ogni arco rappresenta una <B>stringa</B> e ogni nodo una <B>concatenazione</B> delle stringhe tra e la radice
<ul>
<LI><U>Prefix tree</U>: <B>trie</B> che usa i <B>prefissi</B> dei token</LI>
<LI><U>Suffix tree</U>: <B>trie</B> che usa i <B>suffissi</B> dei token</LI>
</ul>
</LI>
<LI>
<U>B+ tree</U>: <B>albero</B> particolarmente ottimizzato, in cui le foglie sono le occorrenze
</LI>
<LI>
<U>Dizionario</U>: <B>hashmap</B> che usa come chiave il <B>token</B> stesso, e una lista di occorrenze come <B>valore</B>
</LI>
</ul>
<P>
Generalmente, occupano <B>spazio logaritmico</B> rispetto al numero di token.
</P>
</Box>
</Split>
</Box>
<Split title={"Query languages"}>
<Box title={"Cosa sono?"}>
<P>
Ogni motore di ricerca implementa un diverso <B><I>query language</I></B>, un&apos;<B>interfaccia</B> per l&apos;utente che gli permette di effettuare ricerche in base alla sua necessità di informazioni <I><UIN/></I>.
</P>
<Aside>
Su Google puoi scrivere la tua domanda in linguaggio naturale e ricevere una risposta, ma ci puoi anche aggiungere qualche operatore come <code>site:stackoverflow.com</code> per restringere la ricerca!
</Aside>
<P>
Ogni query language può poi implementare diverse <B>funzionalità</B> in base al tipo di documento indicizzato.
</P>
</Box>
<Box title={"A cosa servono?"}>
<P>
Essendo una <B>via di mezzo</B> tra linguaggio naturale e linguaggio di programmazione, permettono a un <B>utente qualunque</B> di fruire del motore di ricerca, senza bisogno di conoscenze approfondite sul suo funzionamento.
</P>
</Box>
</Split>
<Split>
<Box title={"Keywords semplici"}>
<P>
All&apos;interno della query vengono inserite <B>una o più keywords</B> da ricercare all&apos;interno dei documenti.
</P>
<Aside>
<P>
Praticamente tutti i motori di ricerca le supportano!
</P>
<Code language={"text"}>
Divina Commedia Dante
</Code>
</Aside>
</Box>
<Box title={"Keyword consecutive"}>
<P>
Prevedono la possibilità di richiedere che due o più keyword siano <B><I>consecutive</I></B>.
</P>
<Aside>
<P>
Solitamente è possibile specificarlo circondando di virgolette le keyword in questione.
</P>
<Code language={"python"}>
&quot;Nel mezzo del cammin di nostra vita&quot;
</Code>
</Aside>
</Box>
<Box title={"Keyword distanziate"}>
<P>
Prevedono la possibilità di richiedere che due o più keyword siano a una certa <B><I>distanza</I></B> una dall&apos;altra.
</P>
<Aside>
<P>
È molto raro al giorno d&apos;oggi che un motore di ricerca permetta di ricercare la distanza tra le keyword.
</P>
<P>
Uno dei pochi motori di ricerca che lo permette ancora è <Anchor href={"https://en.wikipedia.org/wiki/Westlaw"}>Westlaw</Anchor>.
</P>
<Code language={"text"}>
Dante /3 Beatrice
</Code>
</Aside>
</Box>
</Split>
<Split>
<Box title={"Patterns"}>
<P>
Prevedono la possibilità di cercare <B>prefissi</B>, <B>suffissi</B>, <B>sottostringhe</B> e <B>intervalli</B> di keyword.
</P>
<Aside>
<P>
Le <B><Regex/></B> e i <B><Glob/></B> sono i pattern utilizzati più di frequente.
</P>
<Code language={"regex"}>
/^V.?rgilio/
</Code>
<Code language={"glob"}>
**/V?rgilio.png
</Code>
</Aside>
</Box>
<Box title={"Concetti"}>
<P>
Prevedono la possibilità di usare tag provenienti da un <B>thesaurus limitato</B> di cui è <B>garantita</B> la precisione.
</P>
<Aside>
<P>
Il più famoso motore di ricerca a concetti è <Anchor href={"https://pubmed.ncbi.nlm.nih.gov/"}>PubMed</Anchor>, e i concetti ricercabili possono essere trovati su <Anchor href={"https://www.ncbi.nlm.nih.gov/mesh/"}>MeSH</Anchor>.
</P>
<Code language={"text"}>
&quot;Plague&quot;[Mesh]
</Code>
</Aside>
</Box>
</Split>
<Split>
<Box title={"Struttura"}>
<P>
Prevedono la possibilità di limitare la query a <B>specifiche sezioni</B> del documento.
</P>
<Aside>
<P>
Un esempio di query strutturali è <Anchor href={"https://books.google.it/advanced_book_search?hl=it"}>Google Books</Anchor>.
</P>
<Code language={"text"}>
inauthor:Dante inauthor:Alighieri
</Code>
</Aside>
</Box>
<Box title={"Operatori booleani"}>
<P>
Prevedono la possibilità di effettuare più query e applicare le operazioni di <B>intersezione</B>, <B>unione</B> e <B>negazione</B> sui risultati.
</P>
<Aside>
<P>
Moltissimi motori di ricerca permettono boolean query, inclusa la <Anchor href={"https://www.postgresql.org/docs/current/textsearch.html"}>Full Text Search di PostgreSQL</Anchor>.
</P>
<Code language={"python"}>
&quot;Dante&quot; and &quot;Vergil&quot; and (&quot;Devil May Cry&quot; or &quot;DMC&quot;) and not &quot;Divina Commedia&quot;
</Code>
</Aside>
</Box>
</Split>
<Split title={<span>Implementazione dei <I>patterns</I></span>}>
<Box title={"Tramite prefix e suffix tree"}>
<ol>
<LI>
Separa <B>prefisso</B> e <B>suffisso</B> in due parti collegate da un <code>AND</code>:
<Aside>
<Token>ca*e</Token> <Token>ca*</Token> <code>AND</code> <Token>*e</Token>
</Aside>
</LI>
<LI>
Trova i risultati delle due parti attraverso un doppio vocabolario implementato con sia
prefix sia suffix tree:
<Aside>
<ul>
<LI><Token>ca*</Token> 1:1, 1:8, 2:113, 4:231</LI>
<LI><Token>*e</Token> 1:8, 1:32, 2:113, 3:12, 4:1 </LI>
</ul>
</Aside>
</LI>
<LI>
Effettua l&apos;<B>intersezione</B> delle due parti:
<Aside>
<Token>ca*</Token> <code>AND</code> <Token>*e</Token> 1:8, 2:113
</Aside>
</LI>
</ol>
<P>
È costoso in termini di tempo: ci saranno tanti risultati che andranno processati, e
l&apos;intersezione è <LatexMath>{`O(n + m)`}</LatexMath>.
</P>
</Box>
<Box title={"Tramite permuterm tree"}>
<Box title={"Permuterm tree"}>
<P>
Un particolare <B>prefix tree</B> in cui vengono inserite tutte le possibili permutazioni di ogni token, con in aggiunta un marcatore per la fine della parola ():
</P>
<Aside>
<Token>ciao</Token> <Token>ciao</Token> <Token>iaoc</Token> <Token>aoci</Token> <Token>iaoc</Token>
</Aside>
</Box>
<P>
È possibile effettuare ricerche wildcard <B>ruotando la wildcard a destra</B>, trasformando
tutti i pattern in <B>prefissi</B>:
</P>
<Aside>
<ul>
<LI>
Ricerca semplice:
<Aside>
<Token>ciao</Token> <Token>ciao</Token>
</Aside>
</LI>
<LI>
Ricerca di prefisso:
<Aside>
<Token>ci*</Token> <Token>ci*</Token>
</Aside>
</LI>
<LI>
Ricerca di suffisso:
<Aside>
<Token>*ao</Token> <Token>ao*</Token>
</Aside>
</LI>
<LI>
Ricerca di sottostringa:
<Aside>
<Token>*ia*</Token> <Token>ia*</Token>
</Aside>
</LI>
<LI>
Ricerca di intervallo:
<Aside>
<Token>c*o</Token> <Token>oc*</Token>
</Aside>
</LI>
</ul>
</Aside>
<P>
È costoso in termini di spazio: ogni termine va salvato molte volte nel vocabolario (<I>permuterm problem</I>).
</P>
<Aside>
In inglese, in cui i token sono lunghi in media <LatexMath>4</LatexMath>, questo porta a una quadruplicazione <LatexMath>{r`\times 4`}</LatexMath> dello spazio usato.
</Aside>
</Box>
<Box title={<span>Tramite <LatexMath>{`q`}</LatexMath>-gram indexes</span>}>
<Box title={<span><LatexMath>{`q`}</LatexMath>-gram index</span>}>
<P>
<B>Vocabolario aggiuntivo</B> che associa <LatexMath>{`q`}</LatexMath>-grammi ai token corrispondenti del vocabolario principale.
</P>
<Aside>
<Token>ci</Token> <Token>ciao</Token> <Token>cibo</Token> <Token>cinefilo</Token>
</Aside>
</Box>
<P>
È possibile interpretare la ricerca come <B>intersezione di <LatexMath>{`q`}</LatexMath>-grammi</B>:
</P>
<Aside>
<P>
Utilizzando dei bigrammi:
</P>
<Aside>
<Token>lun*</Token> <Token>l</Token> <code>AND</code> <Token>lu</Token> <code>AND</code> <Token>un</Token>
</Aside>
</Aside>
<P>
I risultati della ricerca andranno <B>post-filtrati</B>, in quanto ci potrebbero essere dei <B>falsi positivi</B>:
</P>
<Aside>
<P>
Utilizzando dei bigrammi:
</P>
<Aside>
<Token>mon*</Token> <Token>m</Token> <code>AND</code> <Token>mo</Token> <code>AND</code> <Token>on</Token> <Token stopword={true}>moon</Token> <Token>monday</Token>
</Aside>
</Aside>
<Aside>
<P>
È un&apos;ottima via di mezzo tra prefix-suffix tree e permuterm tree sia per il tempo impiegato sia per lo spazio richiesto.
</P>
</Aside>
</Box>
</Split>
<Split title={<span>Modelli di <IR/></span>}>
<Box title={"Cosa sono?"}>
<P>
Sono <B>modelli matematici</B> in grado di <B>selezionare</B> e <B>ordinare</B> i documenti in base alla loro <B>rilevanza</B> rispetto alla query.
</P>
</Box>
<Box title={"A cosa servono?"}>
<P>
Stabiliscono i <B>risultati richiamati</B> dal motore di ricerca e l&apos;<B>ordine con cui vengono visualizzati</B>.
</P>
</Box>
</Split>
<Box title={"Modelli classici"}>
<P>
Rappresentano la query come un <B>insieme di index term</B>, e assegnano le rilevanze confrontando l&apos;insieme con gli index term dei documenti.
</P>
<Aside>
Sono usati solitamente dai motori di ricerca web.
</Aside>
<P>
Ad ogni index term del documento viene <B>indipendentemente</B> assegnato un <B><I>peso</I></B> in base alla sua rilevanza nella query.
</P>
</Box>
<Split>
<Box title={"Modello booleano"}>
<P>
<B>Modello classico</B> che rappresenta la query come un <B><Predicato/> <I>booleano</I></B>, e genera la rilevanza valutandolo su ogni documento:
</P>
<ul>
<LI><B><code>1</code></B> se il <Predicato/> è <B>vero</B></LI>
<LI><B><code>0</code></B> se il <Predicato/> è <B>falso</B></LI>
</ul>
</Box>
<Box title={"Modello fuzzy"}>
<P>
Variante del <B>modello booleano</B> che permette ai documenti di <B>soddisfare
parzialmente</B> il <Predicato/>:
</P>
<ul>
<LI><B><code>1.00</code></B> se il <Predicato/> è <B>vero</B></LI>
<LI><B><code>0.XX</code></B> se il <Predicato/> è <B>parzialmente vero</B></LI>
<LI><B><code>0.00</code></B> se il <Predicato/> è <B>falso</B></LI>
</ul>
<P>
Le <B>operazioni fuzzy</B> diventano quindi:
</P>
<ul>
<LI><U><code>AND</code></U>: <B><LatexMath>{`min( x_{A},\\ x_{B} )`}</LatexMath></B></LI>
<LI><U><code>OR</code></U>: <B><LatexMath>{`max( x_{A},\\ x_{B} )`}</LatexMath></B></LI>
2022-02-04 05:04:59 +00:00
<LI><U><code>NOT</code></U>: <B><LatexMath>{`1 - x_{A}`}</LatexMath></B></LI>
</ul>
</Box>
</Split>
<Split>
<Box title={"Modello vettoriale"}>
<P>
Modello classico che rappresenta il vocabolario come uno <B>spazio vettoriale</B>, in cui ogni dimensione rappresenta un token.
</P>
<P>
Ogni documento viene rappresentato come un <B>vettore <LatexMath>{`d`}</LatexMath></B>, i cui valori sono <B>pesi <LatexMath>{`d_i`}</LatexMath></B> assegnati in base a quanto il token è signficativo all&apos;interno del documento.
</P>
<Aside>
Il metodo più comunemente usato per assegnare i pesi è il <TFIDF/>, descritto successivamente.
</Aside>
<Aside>
La matrice della collezione <LatexMath>{`\\mathbf{D}`}</LatexMath> è estremamente sparsa: viene implementata <B>per colonne</B> attraverso un <B>inverted index</B>.
</Aside>
<P>
Le query vengono anch&apos;esse trasformate in <B>vettori <LatexMath>{`q`}</LatexMath></B>, e le rilevanze vengono ottenute dalla <B>similitudine vettoriale</B> tra i vettore query e i vettori documenti.
</P>
<Split>
<Box title={<span>Peso <TFIDF/></span>}>
<P>
Un metodo di assegnamento peso che si basa sul <B>prodotto</B> dei fattori <B><TF/></B> e <B><IDF/></B>:
</P>
<B><LatexMath block={true}>{`d_i = tf_{norm}(i) \\cdot idf_{log}(i)`}</LatexMath></B>
<Box title={<span><TF/>: Term frequency</span>}>
<P>
Misura quanto un token è <B>frequente</B> nel <B>singolo documento</B>:
</P>
<B><LatexMath
block={true}
>{`tf(i) = \\frac{occorrenze}{totale\\ token}`}</LatexMath></B>
<P>
Nella formula principale, viene <B>normalizzato</B> dividendolo per il <TF/> più alto del documento, limitandolo così a valori tra 0 e 1:
</P>
<B><LatexMath
block={true}
>{`tf_{norm}(i) = \\frac{tf(i)}{\\max_{j:\\ docs}\\ tf(j)}`}</LatexMath></B>
</Box>
<Box title={<span><IDF/>: Inverse document freq.</span>}>
<P>
Misura quanto un token è <B>raro</B> nella <B>collezione di documenti</B>:
</P>
<B><LatexMath
block={true}
>{`idf(i) = \\frac{totale\\ documenti}{documenti\\ con\\ occ.}`}</LatexMath></B>
<P>
Nella formula principale, viene <B>logaritmizzato</B>, al fine di ridurre significativamente il suo impatto:
</P>
<B><LatexMath block={true}>{`idf_{log}(i) = \\log(idf(i))`}</LatexMath></B>
</Box>
</Box>
<Box title={"Similitudine vettoriale"}>
<P>
Un modo di misurare la similitudine tra <B>insiemi di token</B> rappresentati come <B>dimensioni vettoriali</B>.
</P>
<Box title={"Coseno di similitudine"}>
<P>
Si basa sulla <B>norma a 2</B>, e corrisponde a cercare l&apos;angolo centrato all&apos;origine tra i due vettori:
</P>
<B><LatexMath block={true}>{`
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})
}
`}</LatexMath></B>
<Aside>
Solitamente viene usata nei modelli di <IR/> vettoriali, descritti in seguito.
</Aside>
</Box>
<Aside>
<P>
Altre misure comuni di similitudine vettoriale sono:
</P>
<ul>
<LI>La <Anchor href={"https://it.wikipedia.org/wiki/Distanza_euclidea"}>distanza euclidea</Anchor></LI>
<LI>Il <Anchor href={"https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient"}>SørensenDice coefficient</Anchor></LI>
<LI>Il <Anchor href={"https://en.wikipedia.org/wiki/Jaccard_index"}>Jaccard Index</Anchor></LI>
<LI>La <Anchor href={"https://it.wikipedia.org/wiki/Distanza_di_Minkowski"}>distanza di Minkowski</Anchor></LI>
</ul>
</Aside>
</Box>
</Split>
<Box title={"Modello probabilistico"}>
<P>
Implementazione del modello vettoriale che ordina i documenti <LatexMath>{`d`}</LatexMath> in base alla <B>probabilità <LatexMath>{`R`}</LatexMath></B> che siano <B>rilevanti</B> per la query <LatexMath>{`q`}</LatexMath>:
</P>
<B><LatexMath block={true}>{`sim_{prob} = \\frac{P(R\\ |\\ d, q)}{P(\\overline{R}\\ |\\ d, q)}`}</LatexMath></B>
<P>
Si dimostra che è possibile determinare quanto la presenza di un dato token <LatexMath>{`k_i`}</LatexMath> in un documento <LatexMath>{r`d`}</LatexMath> ne <B>contribuisca alla rilevanza</B> per la query <LatexMath>{r`\vec{q}`}</LatexMath>:
</P>
<B><LatexMath block={true}>{`
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})}
`}</LatexMath></B>
<Split>
2022-02-04 17:41:40 +00:00
<Aside builtinColor="lime">
<B><LatexMath block={true}>{`
\\log \\frac{P(k_i\\ |\\ R, \\vec{q})}{1 - P(k_i\\ |\\ R, \\vec{q})}
`}</LatexMath></B>
<P>
Il valore del primo &quot;blocco&quot; dipende dalla presenza del token <LatexMath>{`k_i`}</LatexMath> nei documenti <B>rilevanti</B>: più il token vi appare, più il valore sarà <B>alto</B>.
</P>
</Aside>
<Aside builtinColor="red">
<B><LatexMath block={true}>{`
\\log \\frac{1 - P(k_i\\ |\\ \\overline{R}, \\vec{q})}{P(k_i\\ |\\ \\overline{R}, \\vec{q})}
`}</LatexMath></B>
<P>
Il valore del primo &quot;blocco&quot; dipende dalla presenza del token <LatexMath>{`k_i`}</LatexMath> nei documenti <B>non rilevanti</B>: più il token vi appare, più il valore sarà <B>basso</B>.
</P>
</Aside>
2022-02-04 05:04:59 +00:00
</Split>
<Aside>
In generale, <LatexMath>{`c_i`}</LatexMath> avrà un valore <Color builtin={"lime"}>positivo</Color> se è più probabile che il termine appaia in documenti rilevanti e non in quelli irrilevanti; in caso contrario, esso avrà valore <Color builtin={"red"}>negativo</Color>.
</Aside>
</Box>
</Box>
</Split>
<Box title={"Modello Okapi BM25"}>
<P>
Modello classico che ordina i documenti in base a un <B>punteggio <RSV/></B> ad essi assegnato.
</P>
<P>
L&apos;<RSV/> deriva dalla somma per ogni termine della query del prodotto di tre fattori:
</P>
<B><LatexMath block={true}>{`RSV = \sum_{t \in q} (x \\cdot y \\cdot z)`}</LatexMath></B>
<Split>
<Box title={<span>Fattore <LatexMath>{`x`}</LatexMath></span>}>
<P>
Un moltiplicatore basato sull&apos;<B><IDF/></B> dei termini della query presenti nel documento:
</P>
<B><LatexMath block={true}>{r`
x = ( idf_{\log} )
`}</LatexMath></B>
</Box>
<Box title={<span>Fattore <LatexMath>{`y`}</LatexMath></span>}>
<P>
Un moltiplicatore basato sulla <B><TF/> nel documento</B> dei termini nella query:
</P>
<B><LatexMath block={true}>{r`
y' = \frac{ (k_1 + 1) \cdot tf_{td} }{ k_1 + tf_{td} }
`}</LatexMath></B>
<Aside>
<LatexMath>{r`k_1`}</LatexMath> regola la <B>priorità data al fattore</B>: se <LatexMath>0</LatexMath> la <TF/> viene ignorata e il modello diventa binario, se molto elevata invece il fattore <LatexMath>{r`b`}</LatexMath> monopolizza gli altri.
</Aside>
<P>
Ad esso viene in genere applicata una normalizzazione basata sulla <B>lunghezza del documento</B>:
</P>
<B><LatexMath block={true}>{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}}
`}</LatexMath></B>
<Aside>
<LatexMath>{r`b`}</LatexMath> regola <B>quanto viene applicata la normalizzazione</B>: se <LatexMath>0</LatexMath>, essa viene disattivata, mentre se <LatexMath>1</LatexMath> viene applicata completamente.
</Aside>
</Box>
<Box title={<span>Fattore <LatexMath>{`z`}</LatexMath></span>}>
<P>
Un moltiplicatore basato sulla <B><TF/> nella query stessa</B> dei termini nella query:
</P>
<B><LatexMath
block={true}
>{`z = \\frac{(k_3 + 1) \\cdot tf_{tq}}{k_3 + tf_{tq}}`}</LatexMath></B>
<Aside>
<LatexMath>{r`k_3`}</LatexMath> regola la <B>priorità data ai vari token</B> in base alla loro <TF/> nella query stessa: se <LatexMath>0</LatexMath>, questa funzionalità viene disattivata, mentre se
</Aside>
<P>
Ad esso non viene ovviamente applicata alcuna normalizzazione.
</P>
</Box>
</Split>
</Box>
<Box title={"Link Analysis Model"}>
<P>
Modello per classificare documenti intercollegati in base a <B>come essi sono collegati</B> tra loro.
</P>
<Aside>
Una pagina non è importante in base a quanto dice di esserlo, ma in base a quanto le altre pagine dicono che lo è.
</Aside>
<Split>
<Box title={"PageRank"}>
<P>
Algoritmo di <I>Link Analysis Ranking</I> <B>query-independent</B> che assegna un <B>grado</B> a ogni pagina indicizzata.
</P>
<Aside>
È il primo algoritmo utilizzato da Google.
</Aside>
<Box title={"Rank"}>
<P>
Misura <B>iterativa</B> di quanto una pagina è importante rispetto a tutte le altre indicizzate.
</P>
<B><LatexMath block={true}>{r`
R'_i(p) = (1 - \alpha) \cdot \sum_{q:\ parents} \left( \frac{R_{i-1}(q)}{N_q} \right) + \alpha \cdot E(p)
`}</LatexMath></B>
<P>
In cui:
</P>
<ul>
<LI>
<B><LatexMath>{`q`}</LatexMath></B> è una pagina che <B>referenzia</B> quella in questione;
</LI>
<LI>
<B><LatexMath>{`R_{i-1}(q)`}</LatexMath></B> è il <B>rank normalizzato</B> della pagina <LatexMath>{r`q`}</LatexMath>;
</LI>
<LI>
<B><LatexMath>{`N_q`}</LatexMath></B> è il numero <B>totale di link</B> presenti nella pagina <LatexMath>q</LatexMath>;
</LI>
<LI>
<B><LatexMath>{`E(p)`}</LatexMath></B> è una <B><I>sorgente di rank</I></B>;
</LI>
<LI>
<B><LatexMath>{`\\alpha`}</LatexMath></B> è un parametro che regola l&apos;<B>emissione della sorgente</B> di rank e la <B>dissipazione</B> del rank preesistente.
</LI>
</ul>
<Aside>
Converge molto in fretta: <LatexMath>{`O(log\\ n)`}</LatexMath>!
</Aside>
<Box title={"Sorgenti di rank"}>
<P>
Funzione che introduce nuovo rank nel sistema ad ogni iterazione.
</P>
<Aside>
Se non venisse introdotto nuovo rank nel sistema, si formerebbero lentamente dei <B>pozzi</B> in presenza di cicli o pagine senza nessun collegamento uscente.
</Aside>
<P>
PageRank normale prevede che questa funzione sia costante; è possibile però <B>personalizzarlo</B> rendendo la funzione variabile, facendo in modo che vengano assegnati rank più alti a certi tipi di pagine.
</P>
<Aside>
Ad esempio, per prioritizzare le homepage rispetto alle sottopagine è possibile fare che:
<LatexMath block={true}>{r`
E(p) = \begin{cases}
1 \qquad pagina\ principale\\
0 \qquad sottopagine
\end{cases}
`}</LatexMath>
</Aside>
</Box>
</Box>
<Box title={"Rank normalizzato"}>
<P>
<B>Rank</B> riscalato a valori inclusi <B>tra 0 e 1</B>.
</P>
<B><LatexMath block={true}>{r`
R_i(p) = \frac{R'_i(p)}{\sum_{d:\ pages} \left( R'_i(d) \right)}
`}</LatexMath></B>
<P>
Solitamente, il rank viene rinormalizzato ad ogni iterazione.
</P>
</Box>
</Box>
<Box title={"HITS"}>
<P>
Algoritmo di <I>Link Analysis Ranking</I> <B>query-dependent</B> che attribuisce <B>due diversi valori</B> ad ogni pagina: <B><I>autorità</I></B> e <B><I>hubness</I></B>.
</P>
<Aside>
Viene utilizzato per determinare l&apos;importanza delle <B>riviste scientifiche</B>.
</Aside>
<P>
Viene applicato solo a un <I>base set</I>, ovvero all&apos;unione del <I>root set</I> (i match
della query) con tutti i nodi ad essi <B>direttamente connessi</B>.
</P>
<Split>
<Box title={"Autorità"}>
<P>
Misura di quanto la pagina in questione <B>viene referenziata</B> da altri siti
autoritativi.
</P>
<Aside>
Quanto una pagina riceve collegamenti &quot;importanti&quot; in entrata.
</Aside>
<B><LatexMath block={true}>{r`
a'_i(p) = \sum_{e:\ entering} h_{i-1}(e)
`}</LatexMath></B>
</Box>
<Box title={"Hubness"}>
<P>
Misura di quanto la pagina in questione <B>referenzia siti</B> autoritativi.
</P>
<Aside>
Quanto una pagina ha collegamenti &quot;importanti&quot; in uscita.
</Aside>
<B><LatexMath block={true}>{r`
h'_i(p) = \sum_{l:\ leaving} a_{i-1}(l)
`}</LatexMath></B>
</Box>
</Split>
<Split>
<Box title={"Autorità normalizzata"}>
<P>
<B>Autorità</B> riscalata a valori inclusi <B>tra 0 e 1</B>.
</P>
<Todo block={true}><B><LatexMath block={true}>{r`
a_i(p) = \frac{a'_i(p)}{\sum_{d:\ pages} \left( a'_i(d) \right)}
`}</LatexMath></B></Todo>
</Box>
<Box title={"Hubness normalizzata"}>
<P>
<B>Hubness</B> riscalata a valori inclusi <B>tra 0 e 1</B>.
</P>
<Todo block={true}><B><LatexMath block={true}>{r`
h_i(p) = \frac{h'_i(p)}{\sum_{d:\ pages} \left( h'_i(d) \right)}
`}</LatexMath></B></Todo>
</Box>
</Split>
<Aside>
Purtroppo, è facile da manipolare, quindi non si applica molto bene ad ambienti non-regolati come l&apos;intero web.
</Aside>
</Box>
</Split>
</Box>
<Split title={<span>Profilazione sistemi <IR/></span>}>
<Box title={"Cos'è?"}>
<P>
<B>Misurazioni</B> che vengono effettuate sui sistemi di <IR/>.
</P>
<Aside>
Solitamente trattano la <B>velocità di indicizzazione</B>, la <B>velocità di ricerca</B>, l&apos;efficacia del <B>query language</B>, l&apos;<B>user interface</B>, il <B>prezzo</B>...
</Aside>
</Box>
<Box title={"A cosa serve?"}>
<P>
Per vedere <B>quanto funziona bene</B> un sistema di <IR/>!
</P>
<Aside>
Solitamente, la misura più importante è la <B>soddisfazione dell&apos;utente</B>, che generalmente coincide con la <B>rilevanza dei risultati di ricerca</B>.
</Aside>
</Box>
</Split>
<Box title={"Benchmark"}>
<P>
Per ottenere delle misure, solitamente si preparano in anticipo delle <B>query</B> dette <I>benchmark</I> delle quali si è <B>già a conoscenza dei documenti rilevanti</B>.
</P>
<Aside>
I documenti rilevanti possono essere selezionati a mano, o ricavati dai dati di utilizzo degli utenti (link cliccati o ignorati).
</Aside>
</Box>
<Box title={"Misure comuni"}>
<P>
Le due misure usate più di frequente per misurare l&apos;utilità dei risultati sono <B><I>recall</I></B> e <B><I>precision</I></B>.
</P>
<Split>
<Box title={"Recall"}>
<P>
Misura <B>quanti documenti rilevanti sono stati <I>richiamati</I></B> dalla collezione:
</P>
<B><LatexMath block={true}>{`Recall = \\frac{size(A \\cap R)}{size(R)}`}</LatexMath></B>
</Box>
<Box title={"Precision"}>
<P>
Misura <B>quanti documenti richiamati sono rilevanti</B>:
</P>
<B><LatexMath block={true}>{`Precision = \\frac{size(A \\cap R)}{size(A)}`}</LatexMath></B>
</Box>
</Split>
<Aside>
Generalmente, recall e precision sono <B>inversamente proporzionali</B>!
</Aside>
</Box>
<Box title={"Misure derivate"}>
<Split>
<Box title={"R-Precision"}>
<P>
La <B>precisione</B> di una query che richiama <LatexMath>{`R`}</LatexMath> elementi.
</P>
</Box>
<Box title={"R-Recall"}>
<P>
A precisione <LatexMath>{`R`}</LatexMath>, il <B>richiamo</B> relativo ad una query.
</P>
</Box>
</Split>
<Split>
<Box title={"Curva di richiamo"}>
<P>
Curva che associa <B>percentili di richiamo</B> ai corrispondenti valori di <B>R-Precision</B>.
</P>
<Aside>
<P>
Ad esempio:
</P>
<Aside>
<table>
<thead>
<tr>
<th>Richiamo</th>
<th>R-Precision</th>
</tr>
</thead>
<tbody>
<tr>
<td>10%</td>
<td>90%</td>
</tr>
<tr>
<td>20%</td>
<td>60%</td>
</tr>
<tr>
<td>30%</td>
<td>10%</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>100%</td>
<td>2%</td>
</tr>
</tbody>
</table>
</Aside>
</Aside>
<P>
È detta <I>naturale</I> se include un punto <B>per ogni documento richiamato</B>.
</P>
<P>
È detta <I>standard</I> se usa le <B>percentuali da 10% a 100%</B> come punti.
</P>
</Box>
<Box title={"Curva di richiamo interpolata"}>
<P>
Mostra il <B>valore massimo di precisione</B> per valori di richiamo <B>maggiori o uguali</B> a quelli del punto.
</P>
<Aside>
<P>
Ad esempio:
</P>
<Aside>
<table>
<thead>
<tr>
<th>Richiamo</th>
<th>Precisione</th>
<th>Interpolata</th>
</tr>
</thead>
<tbody>
<tr>
<td>10%</td>
<td>90%</td>
<td>90%</td>
</tr>
<tr>
<td>20%</td>
<td>40%</td>
<td><B>50%</B></td>
</tr>
<tr>
<td>30%</td>
<td>30%</td>
<td><B>50%</B></td>
</tr>
<tr>
<td>40%</td>
<td>50%</td>
<td>50%</td>
</tr>
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
<tr>
<td>100%</td>
<td>2%</td>
<td>2%</td>
</tr>
</tbody>
</table>
</Aside>
</Aside>
<Aside>
È sempre una curva <B>monotona decrescente</B>.
</Aside>
</Box>
</Split>
</Box>
<Box title={"Misure medie"}>
<P>
Esistono misure che riassumono i risultati di più benchmark in una sola.
</P>
<Split>
<Box title={"Curva di precisione media"}>
<P>
Se si hanno più benchmark, corrispondenti a <B>più curve di richiamo</B>, si possono
ottenere le <B>medie</B> dei valori ai vari livelli, ottenendo così una <B><I>curva di
precisione media</I></B>.
</P>
</Box>
<Box title={"Mean average precision"}>
<P>
La <B>media</B> di tutti i livelli di <B>precisione media</B>.
</P>
</Box>
</Split>
<Split>
<Box title={"Media armonica"}>
<P>
Misura che combina <B>richiamo</B> e <B>precisione</B> in un singolo valore:
</P>
<B><LatexMath block={true}>{r`
F = \frac{2}{\frac{1}{Recall} + \frac{1}{Precision}} = 2 \cdot \frac{Recall \cdot Precision}{Recall + Precision}
`}</LatexMath></B>
</Box>
<Box title={"Misura E"}>
<P>
Complemento della <B>media armonica</B> configurabile che permette di selezionare se
dare <B>priorità <LatexMath>{`b`}</LatexMath></B> alla precisione
(<LatexMath>{`b > 1`}</LatexMath>) oppure al richiamo (<LatexMath>{`b < 1`}</LatexMath>):
</P>
<B><LatexMath block={true}>{r`
E = 1 - \frac{1 + b^2}{\frac{b^2}{Recall} + \frac{1}{Precision}}
`}</LatexMath></B>
</Box>
</Split>
<Aside>
Attenzione: non è sufficiente confrontare le misure medie per determinare l&apos;efficacia di un motore
di ricerca, perchè esse potrebbero <B>nascondere problemi</B> di <B>tipi specifici di query</B>!
</Aside>
<Split>
<Box title={"Discounted Cumulative Gain"}>
<P>
Misura che attribuisce <B><I>guadagni</I> decrescenti</B> in base alla precisione di ogni
documento richiamato.
</P>
<Aside>
<P>
Una formula per il DCG potrebbe essere:
</P>
<LatexMath
block={true}
>{r`DCG = \sum_{Docs} \left( Stars \cdot 2^{- Position} \right)`}</LatexMath>
<P>
Applicata, sarebbe:
</P>
<Aside>
<table>
<thead>
<tr>
<th>Posizione</th>
<th>Stelle</th>
<th>Punti</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td></td>
<td><LatexMath>{r`4 \cdot 2^{0} =\ `}</LatexMath><Color
builtin={"lime"}
><LatexMath>{`+4.00`}</LatexMath></Color></td>
</tr>
<tr>
<td>1</td>
<td></td>
<td><LatexMath>{r`2 \cdot 2^{-1} =\ `}</LatexMath><Color
builtin={"lime"}
><LatexMath>{`+1.00`}</LatexMath></Color></td>
</tr>
<tr>
<td>2</td>
<td></td>
<td><LatexMath>{r`3 \cdot 2^{-2} =\ `}</LatexMath><Color
builtin={"lime"}
><LatexMath>{`+0.75`}</LatexMath></Color></td>
</tr>
<tr>
<td>3</td>
<td></td>
<td><LatexMath>{r`5 \cdot 2^{-3} =\ `}</LatexMath><Color
builtin={"lime"}
><LatexMath>{`+0.63`}</LatexMath></Color></td>
</tr>
<tr>
<td><B>Tot</B></td>
<td><B>-----</B></td>
<td><B><LatexMath>{r`4 + 1 + 0.75 + 0.63 =\ `}</LatexMath><Color
builtin={"lime"}
><LatexMath>{`+6.38`}</LatexMath></Color></B></td>
</tr>
</tbody>
</table>
</Aside>
</Aside>
</Box>
<Box title={"Normalized DCG"}>
<P>
Variante del <B>Discounted Cumulative Gain</B> che <B>divide</B> il punteggio finale per il
valore <B>perfetto</B> ottenibile.
</P>
<Aside>
<P>
Normalizzando la formula precedente si ottiene:
</P>
<LatexMath
block={true}
>{r`NDCG = \frac{\sum_{Docs} \left( Stars \cdot 2^{- Position} \right)}{\sum_{Docs} \left( 5 \cdot 2^{- Position} \right)}`}</LatexMath>
</Aside>
</Box>
</Split>
</Box>
<Split title={"Presentazione"}>
<Box title={"Cos'è?"}>
<P>
Il modo in cui i <B>risultati</B> vengono visualizzati all&apos;utente.
</P>
</Box>
<Box title={"A cosa serve?"}>
<P>
Permettere all&apos;utente di <B>vedere velocemente</B> tutti i risultati e di <B>scegliere</B> il
risultato a lui più utile.
</P>
</Box>
</Split>
<Box title={"Elenco di collegamenti"}>
<P>
Il motore di ricerca web mostra all&apos;utente un <B><I>elenco di collegamenti</I></B> ai documenti
richiamati.
</P>
<P>
Solitamente include alcuni dati del documento, come <B>titolo</B>, <B>sommario</B> e <B>url</B>.
</P>
<Box title={"Sommario"}>
<P>
Un breve <B>riassunto del contenuto</B> del documento richiamato.
</P>
<Split>
<Box title={"Sommario statico"}>
<P>
Un sommario i cui contenuti dipendono solo dal <B>documento</B>, e non dalla query
immessa.
</P>
<Aside>
Sono sommari statici quelli ottenuti dai <B><code>manifest.json</code></B>, dai
tag <B>OpenGraph</B>, dalle <B>prime righe</B> del documento e quelli che Google genera
dalle <B>applicazioni web</B> (Web 3.0).
</Aside>
</Box>
<Box title={"Sommario dinamico"}>
<P>
Un sommario che <B>varia da query a query</B>, evidenziando le parti rilevanti del
documento.
</P>
<Aside>
Sono sommari dinamici quelli che Google genera dalle <B>pagine web statiche</B> (Web
1.0) e <B>dinamiche</B> (Web 2.0).
</Aside>
</Box>
</Split>
</Box>
</Box>
</>
}
export default Page