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