Recuperação de Informação em Bases de Texto Aula 3 1 Recuperação de Informação em Bases de Texto • Construção dos índices – Selecção dos documentos – Identificação dos termos dos documentos – Processamento dos termos: “normalização” – Criação da estrutura de dados em que cada termo está associado à lista dos documentos onde ocorre. 2 Recuperação de Informação em Bases de Texto • Selecção dos documentos – “Granularidade” dos documentos a indexar • Ficheiro • Email – mbox (vários emails) – email com vários “attachments” • tar/zip – vários ficheiros • projecto – latex – java 3 Recuperação de Informação em Bases de Texto • Selecção dos documentos – Representação binária -> sequência de caracteres • Formatos: – MS Word, Excel – pdf – html • Língua (português; chinês, ...) • “character set” 4 Recuperação de Informação em Bases de Texto • Identificação dos termos – Caracteres (in)válidos • espaços: “Monte Novo” ? • sinais de pontuação: “S.L.B” ? • hífen: “guarda-chuva”; • apóstrofo: “Vozes d'Africa” – Números e datas • 26/3/2009 5 Recuperação de Informação em Bases de Texto • Selecção de termos – Exclusão de termos comuns: “stop-words” • artigos, preposições, etc. • termos mais frequentes nos documentos – Problemas • “Presidente da República” vs “Presidente AND República” vs “Presidente República” • “comboio para Lisboa” vs “comboio de Lisboa” 6 Recuperação de Informação em Bases de Texto • Selecção de termos – Sistemas actuais recorrem a uma lista muito reduzida de stopwords ou não usam stopwords! 7 Recuperação de Informação em Bases de Texto • Normalização de termos – SLB vs S.L.B vs Sport Lisboa e Benfica – “re-análise” vs “reanálise” – “carácter” vs “caracter” – “acto” vs “ato” – “texto” vs “textos” – “(ele) fugiu” vs “(ele ia a) fugir” vs “(ele) fugia (quando)” – “carro” vs “automóvel” 8 Recuperação de Informação em Bases de Texto • Normalização de termos – Criação de classes de equivalências: • transformar em minúsculas • retirar acentos • usar sinónimos • usar informação linguística – singulares/plurais; formas verbais 9 Recuperação de Informação em Bases de Texto • Normalização de termos – Lematização • carro, carros -> carro • fugiu, fugiram, fugia -> fugir – Implica conhecimento linguístico, normalmente acesso a um dicionário 10 Recuperação de Informação em Bases de Texto • Normalização de termos – “Stemming” / radicalização • carro, carros -> carr • fugiu, fugiram, fugia -> fugi – Abordagem heurística que trunca as palavras para obter o seu “radical” – Problemas: • carro, carroça, carrinha, ... 11 Recuperação de Informação em Bases de Texto • Normalização de termos – Duas abordagens possíveis: • Indexar pelo representante da classe de equivalência – carro, automóvel -> carro • Expandir a pesquisa – carro -> carro OR automóvel 12 Recuperação de Informação em Bases de Texto • Criação de índices – Operações: • Inserção de um termo • Inserção de um “hit” -- termo num documento • Pesquisa (operação crítica) – Obtenção de lista de “hits” – Intersecção de lista de “hits” – Reunião de lista de “hits” 13 Recuperação de Informação em Bases de Texto • Criação de índices – Como optimizar as operações de pesquisa? • Acesso ao dicionário – Tabela de hash, b-trees, etc. • Operações sobre listas – operação mais comum e mais crítica: intersecção 14 Recuperação de Informação em Bases de Texto • Criação de índices – Intersecção: apontadores extra 128 41 2 4 8 41 64 128 31 11 1 48 2 3 8 11 17 21 31 15 Recuperação de Informação em Bases de Texto • Criação de índices – Intersecção • Criação de apontadores extra (“skip pointers”) para permitir saltos “maiores” • Quantos apontadores extra? – Heurística: sqrt(length(L)) • Necessário alterar algoritmo de intersecção de listas! 16 Recuperação de Informação em Bases de Texto • intersecção_sem_skip_pointers(L1, L2) • L = {} • while L1 <> nil and L2 <> nil – if (docID(first(L1)) = docID(first(L2))) » add(L, first(L1)); L1++; L2++ – else if (docID(first(L1)) < docID(first(L2))) » L1++ – else L2++ • return L 17 Recuperação de Informação em Bases de Texto • intersecção_com_skip_pointers(L1, L2) • L = {} • while L1 <> nil and L2 <> nil – if (docID(first(L1)) = docID(first(L2))) » add(L, first(L1)); L1++; L2++ – else if (docID(first(L1)) < docID(first(L2))) » if hasSkip(first(L1)) and docID(skip(first(L1)))<docID(first(L2)) L1 = skip(first(L1)); » else L1++ – else ... (semelhante para L2) • return L 18 Recuperação de Informação em Bases de Texto • Como lidar com expressões multi-palavra? – “Câmara Municipal” • Solução: – Índices bi-palavra • indexar todas as sequências de duas palavras dos textos 19 Recuperação de Informação em Bases de Texto • Como lidar com expressões multi-palavra? – “Câmara Municipal de Évora” • Solução (parcial): – Conjunção de índices bi-palavra • “câmara municipal” and “municipal de” and “de évora” – A solução encontrada não é equivalente à pergunta inicial! • “O Presidente da Câmara Municipal de Lisboa saiu de Évora às 14:00.” 20 Recuperação de Informação em Bases de Texto • Como lidar com expressões multi-palavra? – “Câmara Municipal de Évora” • Solução extendida: – Índices bi-palavra de nomes próprios – “Câmara Municipal de Évora” -> “câmara municipal” and “municipal évora” – Resolve o problema anterior • “O Presidente da Câmara Municipal de Lisboa saiu de Évora às 14:00.” – Falha para “municipal évora” 21 Recuperação de Informação em Bases de Texto • Como lidar com expressões multi-palavra? – “Câmara Municipal de Évora” • Solução mais geral: – Índices posicionais • Dicionário contém: – termo; nº docs que contêm o termos; » doc1: pos1, pos2, ... » doc2: pos1, pos2 » ... 22 Recuperação de Informação em Bases de Texto • intersecção_pos(L1, L2, k) // termos a distância<k • L = {} • while L1 <> nil and L2 <> nil – if (docID(first(L1)) = docID(first(L2))) » add(L, merge(first(L1),first(L2),k)); » L1++; L2++ – else if (docID(first(L1)) < docID(first(L2))) » L1++ – else L2++ • return L 23 Recuperação de Informação em Bases de Texto • Permite: – Expressões multi-palavra • “câmara municipal” – “câmara” AND/k=1 “municipal – Operadores de proximidade • “câmara” NEAR “municipal” – “câmara” AND/k=5 “municipal 24 Recuperação de Informação em Bases de Texto • Índices posicionais – Listas no dicionário com um elemento por cada ocorrência nos documentos (com a sua posição) • Aumento na dimensão das estruturas de dados e nos tempos de resposta! 25 Recuperação de Informação em Bases de Texto • Abordagem com melhores resultados: – Mista • Índices bi-palavra • Índices posicionais – Bom desempenho para: • “Cavaco Silva” • “Câmara Municipal de Vila Real de Santo António” • Suporta operadores de proximidade 26 Recuperação de Informação em Bases de Texto • Dicionário – Que estrutura de dados? • Tabela de hash • Árvores 27 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados – Tabela de hash • Vantagens – Acesso – O(1) • Desvantagens – Pesquisa por prefixo/sufixo – Ordenação 28 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados – B-tree • Vantagens – Pesquisa por prefixo • Desvantagens – Acesso menos eficiente – O(log N) 29 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados: árvore – Operadores “wildcard” • “fug*” – todos os termos >= “fug” e < “fuh” • “*mente” – solução: árvore duplicada com termos na sua forma inversa: » “mente” -> “etnem” 30 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados: árvore – Operadores “wildcard” • “in*mente” – intersecção dos termos » “in*” e “*mente” – Pouco eficiente, dado implicar intersecção de conjuntos 31 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados: árvore – Operadores “wildcard” • Solução mais eficiente: – Para cada termo, indexar todas as suas permutações/rotações. » Ex: jogo -> jogo$ ; ogo$j ; go$jo ; o$jog » Pesquisa: j*go -> go$j* ; 32 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados: árvore – Operadores “wildcard” • Outra solução eficiente: – Criar índices de bi-gramas (sequências de 2 caracteres) » Ex: “jogo” -> “$j”; “jo”; “og”; “go”; o$” » Construir um índice de bigramas para termos do dicionário: » “$j” -> janela; jogo; ... » “jo” -> jogo; anjo; ... » ... 33 Recuperação de Informação em Bases de Texto • Dicionário – estrutura de dados: árvore – Operadores “wildcard” • Outra solução eficiente: – Pesquisa: mam* – Processamento: » “$m” and “ma” and “am” » Filtrar resultados incorrectos: » “mimam” não é correcto! 34 Recuperação de Informação em Bases de Texto • Em resumo: – O suporte a pesquisas com expressões mutipalavra e o uso de operadores mais complexos, como os de proximidade e wildcards, tem um custo em termos de complexidade das estruturas de dados, algoritmos e desempenho (temporal) dos sistemas de RI. 35