Indice inverso per modello booleano
Transcript
Indice inverso per modello booleano
Indice inverso per modello booleano termine documenti a 1,3,4,6,7 b 1,7 c 3,7 d 97 4,7 Indice inverso per modello vettoriale termine documenti a 1[w],3[w],4[w],6[w],7[w] b 1[w], 7[w] c 3[w], 7[w] d 4[w], 7[w] w: peso di un certo termine indice in un certo documento 98 Indice inverso per query prossimita’ in modello vettoriale termine a 99 documenti 1[w][p1,…,pn],3[w],4[w],6[w],7[w] b 1[w], 7[w] c 3[w], 7[w] d 4[w], 7[w] p1,…,pn: posizioni in cui un certo termine compare in un certo documento Gestione di testi in Oracle 9i Oracle 9i Text permette di – indicizzare testi e documenti memorizzati in Oracle 9i, in file del sistema operativo o URL, in maniera integrata con i dati relazionali tradizionali con possibilità di interrogazioni basate sul contenuto – 100 possibilità di utilizzare un thesaurus classificare documenti in base al loro contenuto vedremo solo il primo aspetto Gestione di testi in Oracle 9i Formati – – – – – Linguaggi – – 101 File di testo HTML, XML documenti Word PDF … per ricerche tematiche, inglese e francese possibilità di estendere i linguaggi caricando opportuni thesauri per il linguaggio di interesse Sviluppo applicazione testuale Tre fasi – – – 102 Caricamento documenti Indicizzazione Manipolazione Esempio create table docs (id number primary key, text varchar2(80)); insert into docs values (1,'first document'); insert into docs values (2, 'second document'); create index doc_index on docs(text) indextype is ctxsys.context; select id from docs where contains(text, 'first') > 0; RISPOSTA: 1 103 insert into docs values (3, ‘first second document'); select id from docs where contains(text, 'first') > 0; RISPOSTA CORRETTA: 1 Rappresentazione documenti A B C 104 Rappresentazione documenti 105 A. Documento contenuto in un campo di tipo CHAR, VARCHAR, VARCHAR2, LONG, LONG RAW, BLOB, CLOB B. Campo di tipo BFILE C. Campo di tipo URIType la tabella deve avere una chiave primaria, utilizzata per identificare i documenti Caricamento documenti 106 Direttamente con statement INSERT SQL Loader procedure ad hoc Libreria proprietaria (ORACLE Call Interface – OCI) Indicizzazione documenti Oracle supporta diverse tipologie di indice – – – 107 CONTEXT, per ricerche su documenti arbitrari CTXCAT, per ricerche combinate su documenti brevi e dati strutturati MATCHES, per classificazione documenti noi vedremo solo il tipo CONTEXT la creazione dell’indice è un passo necessario per l’esecuzione di interrogazioni sul documento Indice CONTEXT Determina i termini indice associati ad ogni documento – – 108 crea il surrogato organizza il surrogato come indice inverso Indicizzazione documenti comando per la creazione di indici create index INDEXNAME on TABLE(COLUMN) indextype is ctxsys.context il comando per default assume che: – – – – 109 la colonna sia di tipo A il linguaggio sia quello specificato durante l’installazione Usa lista di stopword di default (e quindi le elimina dal testo senza indicizzarle) Abilita stemming è possibile modificare le impostazioni di base, customizzando il comando CREATE INDEX – sistema di preferences Indicizzazione documenti 110 In generale, il comando di creazione di indice esegue un insieme di processi che creano oggetti intermedi per ogni processo è possibile specificare delle preferenze Indicizzazione documenti 111 Indicizzazione documenti - processi Datastore: scorre le righe della tabella e legge i dati della colonna, restituendo i dati contenuti nel documento Filter: prende i documenti restituiti dal datastore e li trasforma in una rappresentazione testuale – – 112 non necessaria per plain text, XML o HTML documenti Word, PDF, ecc. Vengono convertiti in un testo con mark-up (esempio HTML) Indicizzazione documenti - processi 113 Sectioner: divide l’informazione strutturale (markup) dal contenuto Lexer: suddivide il plain text in token (parole) e crea token tematici (in relazione alle preferenze specificate) Indexing engine: crea l’inverted index, eliminando stopword, contenute in STOPLIST e crea indici per stemming utilizzando informazioni in WORDLIST Indicizzazione documenti preferenze 114 per ciascun processo ci sono uno o più oggetti che rappresentano i possibili comportamenti in generale, gli oggetti sono raggruppati in classi: Indicizzazione documenti preferenze tali oggetti non possono essere usati direttamente negli indici: – – – 115 si crea una preference a partire da tali oggetti template la si personalizza settandone gli attributi si usa tale preference per customizzare l’oggetto durante la creazione dell’indice Indicizzazione documenti Esempio ctx_ddl.create_preference('mypref', 'FILE_DATASTORE'); Tipo preferenza ctx_ddl.set_attribute('mypref', 'PATH', '/docs'); Attributo 116 create index doc_index on docs(text) indextype is ctxsys.context parameters ('datastore mypref'); Oggetto con preferenza Indicizzazione documenti preferenze nella clausola parameters si possono specificare più classi, semplicemente aggiungendo una coppia keyword-preference – 117 parameters('datastore mypref filter myfilter') questo meccanismo è usato per tutte le classi tranne SECTION GROUP e STOPLIST, che hanno una API propria esistono dei parametri utilizzati dal sistema di default (quelli per LEXER, WORDLIST e STOPLIST dipendono dal linguaggio) Datastore 118 DIRECT_DATASTORE (default) assume che il documento sia memorizzato direttamente nella colonna indicizzata, ne restituisce semplicemente il contenuto FILE_DATASTORE interpreta la colonna come un nome di file, lo apre e ne restituisce il contenuto URL_DATASTORE interpreta la colonna come un URL, effettua una GET e restituisce il contenuto ... Filter 119 NULL_FILTER (default) utilizzato quando il contenuto del documento non è in formato binario, passa semplicemente il testo dal datastore al sectioner CHARSET_FILTER converte i documenti da un insieme di caratteri straniero al character set del database USER_FILTER/PROCEDURE_FILTER filtering ad hoc (es. per convertire tutto in lettere maiuscole) in forma di procedura INSO_FILTER riconosce automaticamente e filtra oltre un centinaio di formati diversi, tra cui Word e Acrobat, producendo HTML come output Lexers BASIC_LEXER: per la maggioranza delle lingue europee, si può modificare il comportamento di default attraverso gli attributi – – – – 120 JOINS per specificare caratteri non alfanumerici da trattare come lettere valide PUNCTUATION per specificare i simboli di punteggiatura (importanti per sezioni SENTENCE e PARAGRAPH) per la normalizzazione del testo (es. accenti, maiuscole/minuscole, parole composte) per selezionare indicizzazione di testo o tematica Stoplist lista delle stopword, che non vengono considerate per l’indicizzazione API separata: ctx_ddl.create_stoplist('mylist'); ctx_ddl.add_stopword('mylist', 'the'); stoplist di default, che dipendono dal linguaggio si possono aggiungere stopword all’indice senza doverlo ridefinire alter index myidx rebuild parameters ('add stopword AND'); 121 stop classes (es. NUMBERS) e stop themes Wordlist non ha effetto sull’indicizzazione, ma contiene i setting per espansione stem e fuzzy dei termini utilizzati per rispondere alle interrogazioni un solo oggetto BASIC_WORLDLIST con attributi: – – – – 122 STEMMER (espansione di una parola a forme differenti, es. ENGLISH, ITALIAN, NULL) FUZZY_MATCH (considera parole mistyped, es. varie lingue e OCR) FUZZY_SCORE (score floor per espansione fuzzy) FUZZY_NUMRESULT (max. numero parole per espansione fuzzy) Section Groups La classe section group prende un formato di testo (es. XML o HTML) come input e restituisce i section boundaries e plain text i section group non sono creati con create_preferences, ma con una API separata – 123 ctx_ddl.create_section_group('mygroup’, 'html_section_group'); il primo argomento è il nome del section group, il secondo è il tipo, che specifica il formato del testo di input e le regole per individuare le sezioni Section Groups tipi di section groups: – NULL_SECTION_GROUP: da usare quando non ci sono sezioni o ci sono solo sezioni speciali: SENTENCES e PARAGRAPH – – – – 124 Default Vedremo solo questo BASIC_SECTION_GROUP: per XML o HTML, rimuove semplicemente i markup tags, che devono essere bilanciati, non supporta attributi e commenti HTML_SECTION_GROUP: per HTML XML_SECTION_GROUP: per XML NEWS_SECTION_GROUP: per newsgroup style postings, rimuove header lines Section Groups Le sezioni create possono essere di vario tipo Utili in caso di documenti con tag Noi vedremo solo sezioni di tipo SPECIAL – non sono riconosciute attraverso tag, ma dal lexer attraverso la punteggiatura 125 SENTENCE PARAGRAPH Section Groups 126 Section Groups - esempio Documento plain text Creazione section group ctx_ddl.create_section_group('mygroup', ’null_section_group'); aggiunta sezioni di tipo SPECIAL ctx_ddl.add_special_section('mygroup', ’SENTENCE'); Si specifica il section group durante la creazionde dell’indice create index doc_index on docs(text) indextype is ctxsys.context parameters (‘section group mygroup'); 127 A questo punto e’ possibile eseguire interrogazioni all’interno delle dezioni definite – Si veda oltre Aggiornamento degli indici L’indice creato non viene aggiornato automaticamente dopo ogni operazione DML – – – possibilità di ricostruzione totale o parziale – 128 indicizzare un singolo documento richiede molto tempo gli inverted index si aggiornano meglio su un insieme di documenti per volta le applicazioni in genere sono abbastanza statiche, e non è necessaria una completa consistenza Procedura ctx_ddl.sync_index Interrogazioni La creazione di un indice di tipo CONTEXT permette di eseguire interrogazioni sul contenuto dei documenti funzione CONTAINS permette di specificare interrogazioni di tipo – – – – – – Ogni interrogazione viene rappresentata come una stringa – 129 Keyword based Pattern-based Booleane Di contesto Thesaurus Su sezioni Interrogazioni in linguaggio naturale Interrogazioni – funzione CONTAINS select id from texttab where contains(textcol,'query') > 0 – – il primo argomento è il nome della colonna, il secondo è il testo dell’interrogazione (max 2000 byte) restituisce un numero, che rappresenta un valore di similarita’ e quindi quantifica il match 130 0 = no match Interrogazioni - scoring select id, score(1) from texttab where contains(textcol, 'query', 1) > 0 order by score(1) desc 131 1 è contains label e può essere un qualsiasi numero, utilizzato per associare lo score nella select list con quello nella clausola where lo score è un numero compreso tra 0 e 100, ed è relativo (significativo solo per la query considerata) Interrogazioni - scoring Modello vettoriale Pesi wij = 3 f(i,j)(1+log(N/ni)) con – – 132 N numero totale tuple normalizzati tra 0 e 100 la similarità è un valore tra 0 e 100 Vari operatori di composizione Interrogazioni - tipologie A. Ricerca di documenti che contengono parole o frasi – – 133 Per default case insensitive (modificabile con preferenze BASIC_LEXER) Keyword based, pattern based, contesto B. Ricerca all’interno di sezioni di documenti (WITHIN) C. Ricerca di documenti che trattano un certo argomento (ABOUT) o utilizzo di thesaurus D. Interrogazioni booleane E. operatori di score Interrogazioni A – keyword-based Keyword based semplice contains(text, 'dog') > 0 Keyword based con frasi contains(text,'dog my cat') > 0 134 le stopword sono trattate come wildcard (matchano qualsiasi parola) contains(text, 'dog the cat') > 0 restituisce 'dog my cat’, 'dog your cat’, 'dog the cat' le stopword da sole vengono eliminate dalla query Interrogazioni A – pattern-based WILDCARD (%_) per pattern matching (come in LIKE di SQL) FUZZY (?) trova parole con spelling simile a quella data (usa wordlist): ?termine STEM ($) trova parole con radice comune (usa wordlist): $termine SOUNDEX (!) trova parole con stesso suono (usa una specifica espansione fuzzy): !termine EQUIV (=) permette di indicare esplicitamente varie forme della stessa parola: labradors = alsatians are big dog – 135 Si considera indifferentemente labrador o alsatians E’ possibile applicare questi operatori anche all’italiano, settando opportuni parametri Interrogazioni A - contesto operatore NEAR, che ha due forme dog ; cat ; boat il punteggio dipende da quanto i termini sono vicini l’uno all’altro, in termini di numero di parole NEAR((dog,boat), 10, TRUE) 136 – primo argomento è lista di parole – secondo è distanza massima (numero di parole) tra tutte le parole indicate – terzo specifica se tenere conto dell’ordine in cui appaiono nella lista True: considero ordine Default false Interrogazioni B - sezioni WITHIN: limita una query a una particolare sezione Approccio – – Documento plain text Creazione section group ctx_ddl.create_section_group('mygroup', – ’null_section_group'); aggiunta sezioni di tipo ZONE ctx_ddl.add_special_section('mygroup', ’SENTENCE'); – Creazione indice con preferenza create index myindex on docs(text) parameters (section group mygroup) – 137 Query di tipo within contains(text, ’tiger & cat within sentence') > 0 Interrogazioni tematiche C Si vogliono determinare i documenti che trattano un certo concetto – la stringa specifica rappresenta il concetto (tema) cercato, rappresentato da ‘frase’ solo per inglese e francese richiede la presenza di una knowledge base – – 138 ABOUT(frase) gerarchia di concetti con 6 sottoalberi: scienza-tecnologia, affari e finanza, politica e militare, sociale, geografia, idee astratte E’ case sensitive l’indice deve avere una componente tematica se non ce l’ha, l’interrogazione viene espansa in una query non tematica Interrogazioni tematiche C esempio contains(text, 'about(canines)') 139 se esiste l’indice, può restituire documenti che contengono “dog” se non esiste, about(go home now) è trasformata in $go,$home,$now Interrogazioni C - Thesaurus Possibilità di creare Thesaurus che definiscono sinonimi e relazioni gerarchiche tra parole o frasi il thesaurus non viene installato di default ma deve essere caricato – 140 il sistema contiene un thesaurus di default per l’inglese il caricamento di un Thesaurus permette di espandere le ricerche ai sinomini di una certa parola o ad altre parole ad essa associate Interrogazioni C - Thesaurus file con formattazione particolare alcune relazioni considerate 141 – SYN: sinonimi – PT: preferred term – BT: broader term – NT: narrower term – RT: related term – TR: traduzione in altri linguaggi gli stessi identificatori corrispondono a procedure che permettono di utilizzare queste relazioni nelle interrogazioni Interrogazioni C - Thesaurus 142 SYN( term [, thesname] ) PT( term [, thesname] ) BT( term [, level [,thesname]] ) NT( term [, level [,thesname]] ) TT( term [, thesname] ) RT( term [,thesname] ) TR( term [,lan [,thesname] ]) Thesname: nome del thesaurus Lan: linguaggio Se non si specifica il thesaurus, si considera quello di default Interrogazioni C - esempio Contains(textcol,’SYN(veicolo)’) Veicolo Se SYN(veicolo,mezzo) e’ presente nel thesaurus anche i documenti che contengono mezzi vengono restituiti 143 Interrogazioni C – esempio espansione Se la query corrisponde a – contains(textcol,BT(dog)) E nel thesaurus vale: – la query viene riscritta in dog OR animal Si veda dopo per il significato di OR – 144 BT(animal,dog), quindi dog viene generalizzato con animal Interrogazioni D - booleane AND (&): documenti che contengono almeno un’occorrenza di ciascun termine indicato – OR (|): documenti che contengono almeno un’occorrenza di almeno un termine indicato – 145 Restituisce il punteggio minimo tra quelli degli operandi Restituisce il punteggio massimo tra quelli degli operandi NOT (~) è "AND NOT” (differenza): – 'dog NOT cat' restituisce i documenti che contengono "dog" ma non contengono "cat” – il punteggio restituito è quello del figlio sinistro Interrogazioni D - esempio Dog AND cat – – – Dog OR cat – – – 146 1. dog 0.6 2. cat 0.2 Combino 0.6 AND 0.2 e restituisco 0.2 come valore di similarita’ 1. dog 0.6 2. cat 0.2 Combino 0.6 OR 0.2 e restituisco 0.6 come valore di similarita’ Interrogazioni D – booleane rilassate 147 MINUS (-) sottrae il punteggio dell’operando destro a quello del sinistro contains(text, 'tiger MINUS rabbit') > 0 – tiger e preferibilmente non rabbit – sottrae i punteggi e restituisce un documento solo se il punteggio risultante e’ positivo ACCUM (,) raggruppa più parole o frasi e ne accumula i punteggi contains(text, 'tiger ACCUM rabbit)') > 0 – tiger e preferibilmente rabbit – Peso maggiore a chi contiene un maggior numero di termini Interrogazioni D - osservazione AND – – – ACCUM – – 148 nella logica a due valori, richiede che entrambi gli argomenti siano veri interpretando vero = 1 e falso = 0, viene restituito il valore minimo stesso discorso nel caso di valori compresi tra 0 e 1 Il calcolo tiene conto di vari fattori più termini compaiono, più il documento è rilevante Interrogazioni D - osservazione OR – – – MINUS – – 149 nella logica a due valori, richiede che almeno un argomento sia vero interpretando vero = 1 e falso = 0, viene restituito il valore massimo stesso discorso nel caso di valori compresi tra 0 e 1 toglie punteggi un documento è più rilevante se i termini a destra non compaiono Interrogazioni E - operatori di score WEIGHT (*) moltiplica il punteggio di un termine di ricerca per renderlo più o meno importante nella query (peso tra .1 e 10) contains(text,'(dog*2) AND cat') > 0 Se il valore di una query pesata diventa maggiore di 100, lo si setta a 100 150 Esempio di score per weight 151 Interrogazioni E - operatori di score THRESHOLD (>) permette di non selezionare i documenti con similarita’ inferiore ad una certa soglia rispetto alla query contains(text,'(dog*2) AND cat') > 50 152 Interrogazioni E – Weight + Score In presenza di operatori di weight nel contesto di una query ACCUM: – – – 153 Si determina il peso dei termini per ciascun documento come somma dei pesi che compaiono nella query e che hanno score diverso da 0 nel documento Lo score assegnato ad un documento e’ direttamente proporzionale ad peso dei termini in ciascun documento Tra documenti con lo stesso peso dei termini, lo score maggiore verra’ assegnato ai documenti con un maggiore score medio Esempio 154