Introduction to Information Retrieval Introduction to Information Retrieval CS276: Information Retrieval and Web Search Christopher Manning and Prabhakar Raghavan Lecture 5: Index Compression Introduction to Information Retrieval Ch. 5 Today Estatísticas de coleção em maiores detalhes (com RCV1) Quão grandes serão o dicionário e os documentos retornados (postings - docID)? Compressão de dicionário Compressão da lista de ocorrência Introduction to Information Retrieval Ch. 5 Por que compressão(em geral)? Usa menos espaço em disco Economiza um pouco de dinheiro Mantém mais coisas na memória Aumenta a velocidade Aumenta a velocidade da transferência de dados do disco para a memória [ler dado compactado | decompactar] é mais rápido que [ler dado descompactado] Premissa: Algorítimos de descompressão são rápidos Verdade para os algorítmos de descompressão que usamos Introduction to Information Retrieval Ch. 5 Por que compressão para índices invertidos Dicionário Torna-lo pequeno o suficiente para ser mantido na memória principal Torna-lo tão pequeno que você pode manter algumas listas de ocorrencia na memória principal também Arquivo(s) da lista de ocorrência (posting) Reduz o espaço em disco necessário Reduz o tempo necessário para ler a lista de posting do disco Grande sistemas de busca mantém uma parte significante dos postings na memória Compressão permite armazenar mais na memória Nós vamos analisar varios esquemas de compressão específico para RI Sec. 5.1 Introduction to Information Retrieval Relembrando Reuters RCV1 símbolo N L M estatística documentos # médio tokens por doc termos (= palavras dig.) # médio bytes por token valor 800.000 200 ~400.000 6 (incl. espaços/pontuação) # médio bytes por token 4.5 (sem espaços/pontuação) # médio bytes por termo 7.5 postings não posicionais 100,000,000 Sec. 5.1 Introduction to Information Retrieval Parâmetros de índice vs. o que nós indexamos (detalhes IIR Tabela 5.1, p.80) Tamanho de tipos de palavras(termos) postings não posicionais postings posicionais dicionário índice não posicional índice posicional Tamanho ∆ (K) % Tamanho (K) Tamanho (K) ∆% cumul % cumul % 109,971 ∆ % cumul % Não filtrado 484 197,879 Sem números 474 -2 -2 100,680 -8 -8 179,158 -9 -9 Case folding 392 -17 -19 96,969 -3 -12 179,158 0 -9 30 stopwords 391 -0 -19 83,390 -14 -24 121,858 -31 -38 150 stopwords 391 -0 -19 67,002 -30 -39 94,517 -47 -52 stemming 322 -17 -33 63,812 -42 94,517 -52 -4 0 Introduction to Information Retrieval Sec. 5.1 Lossless vs. lossy compression Compressão sem perda: Toda a informação é preservada. Mais usado em RI. Compressão com perda: Descarta alguma informação Muitos dos passos de pré-processamento podem ser vistos como lossy compression: case folding, stop words, stemming, eliminação de números. Introduction to Information Retrieval Sec. 5.1 Vocabulario vs. tamanho da coleção Quão grande é o vocabulário de termos? Ou seja, quantas palavras distintas existem? Podemos assumir um limite superior? Não exatamente: Ao menos 7020 = 1037 palavras diferentes de tamanho 20 Na prática, o vocabulário se mantém em crescimento junto com o tamanho da coleção Especiamente com o Unicode Introduction to Information Retrieval Sec. 5.1 Vocabulario vs. tamanho da coleção Lei de Heaps: M = kTb M é o tamanhdo do vocabulario, T é o número de tokens na coleção Valores típicos: 30 ≤ k ≤ 100 e b ≈ 0.5 Em um gráfico log-log do tamanho do vocabulario M vs. T, a Lei de Heaps prediz uma linha com inclinação em torno de ½ É a relação mais simples possível entre os dois em um espaço log-log Sec. 5.1 Introduction to Information Retrieval Lei de Heaps Para RCV1, a linha pontilhada log10M = 0.49 log10T + 1.64 é o melhor ajuste dos mínimos quadrados Ainda, M = 101.64T0.49 então k = 101.64 ≈ 44 e b = 0.49. Para os primeiros 1.000.020 tokens, a lei prevê 38.323 termos; e na verdade, 38.365 termos. Fig 5.1 p81 Introduction to Information Retrieval Sec. 5.1 Lei de Zipf A Lei de Heaps nos dá o tamanho do vocabulário em coleções. Nós também estudaremos a frequência relativa dos termos. Na linguagem natural, existem muitos termos frequentes, e muitos termos raros. Lei de Zipf: O i-ésimo termo mais frequente tem uma frequencia proporcional a 1/i . cfi ∝ 1/i = K/i onde K é uma constante de normalização cfi é a frequência na coleção: o número de ocorrências do termo ti na coleção. Introduction to Information Retrieval Sec. 5.1 Consequências de Zipf Se o termo mais frequente (the) ocorre cf1 vezes Então o segundo termo mais frequente (of) ocorre cf1/2 vezes O terceiro termo mais frequente (and) ocorre cf1/3 vezes … Equivalente: cfi = K/i onde K é o fator de normalização, então log cfi = log K - log i Relação linear entre log cfi e log i Introduction to Information Retrieval Ch. 5 Compressão Agora, vamos considerar a compressão do espaço para o dicionário e os postings Índice Básico Booleano somente Nenhum estudo dos índices posicionais, etc. Vamos considerar esquemas de compressão Introduction to Information Retrieval COMPRESSÃO DE DICIONÁRIO Sec. 5.2 Introduction to Information Retrieval Sec. 5.2 Porque comprimir dicionário? A busca começa com o dicionário Nós queremos mantê-lo na memória Competição do uso da memória com outras aplicações Dispositivos Embarcados/móveis possuem pouca memória Mesmo se o dicionário não estiver na memória, precisamos que seja pequeno para um tempo de procura inicial mais rápido Então, comprimir o dicionário é importante Introduction to Information Retrieval Armazenamento do Dicionário – primeira redução Array de entradas de largura-fixa ~400,000 termos; 28 bytes/termo = 11.2 MB. Estrutura de busca no Dicionário Terms Freq. a 656,265 aachen 65 …. …. zulu 221 20 bytes Postings ptr. 4 bytes cada Sec. 5.2 Introduction to Information Retrieval Sec. 5.2 Termos de largura-fixa é um desperdício Muitos dos bytes na coluna Termo são desperdiçados – nós alocamos 20 bytes para um termo de 1 letra. E também não podemos tratar supercalifragilisticexpialidoso ou hidroclorofluorocarbono. Média de escrita em Inglês ~4.5 caracteres/palavra. Média do tamanho da palavra em Inglês: ~8 caracteres Como usamos ~8 caracteres por termo do dicionário? Palavras curtas dominam a contagem de token mas não são contados na média. Sec. 5.2 Introduction to Information Retrieval Comprimindo a lista de termos: Dicionário-como-uma-String O dicionário é armazenado como uma (longa) string de characteres: Ponteiro para a próxima palavra indica o fim da palavra corrente Espera-se ganhar mais de 60% de espaço no dicionário. ….systilesyzygeticsyzygialsyzygyszaibelyiteszczecinszomo…. Freq. 33 Postings ptr. Term ptr. Tamanho total da string = 400K x 8B = 3.2MB 29 44 126 Ponteiros determinam 3.2M posições: log23.2M = 22bits = 3bytes Introduction to Information Retrieval Sec. 5.2 Tamanho para dicionários como uma a string 4 bytes por termo para Frequência. Agora média 11 4 bytes por termo para ponteiro para bytes/termo, não 20. Postings. 3 bytes por ponteiro do termo Média de 8 bytes por termo 400K termos x 19 7.6 MB (contra 11.2MB para largura-fixa) Sec. 5.2 Introduction to Information Retrieval Blocking Armazena ponteiros para todo késimo string do termo. Exemplo abaixo: k=4. Precisa armazenar o tamanho do termo (1 byte extra) ….7systile9syzygetic8syzygial6syzygy11szaibelyite8szczecin9szomo…. Freq. Postings ptr. Term ptr. 33 29 44 126 7 Libera 9 bytes em 3 ponteiros. Perde 4 bytes para tamanho de termo. Introduction to Information Retrieval Sec. 5.2 Net Exemplo para tamanho do bloco k = 4 Onde nós usamos 3 bytes/ponteiro sem blocking 3 x 4 = 12 bytes, Agora nós usamos 3 + 4 = 7 bytes. Liberado outros ~0.5MB. Isto reduz o tamanho do dicionário de 7.6 MB para 7.1 MB. Podemos liberar mais com um k maior. Por que não usar um k maior? Introduction to Information Retrieval Procura pelo Dicionário sem blocking Assumindo cada termo do dicionário igual como uma consulta (não exatamente assim na prática!), a média do número de comparações = (1+2∙2+4∙3+4)/8 ~2.6 Sec. 5.2 Introduction to Information Retrieval Sec. 5.2 Procura pelo Dicionário com blocking Busca binária reduz em blocos de 4 termos; Então a busca linear busca através dos termos no bloco. Blocos de 4 (árvore binária), média = (1+2∙2+2∙3+2∙4+5)/8 = 3 comparações Sec. 5.2 Introduction to Information Retrieval Front coding Front-coding: Palavras comumente possuem um longo prefixo em comum – armazena apenas a diferença (para o último k-1 em um bloco de tamanho k) 8automata8automate9automatic10automation 8automat*a1e2ic3ion Codifica automat Conteúdo extra apósautomat. Começa a se assemelhar à compressão geral de string. Introduction to Information Retrieval Sec. 5.2 RCV1 sumário de compressão de dicionário Tecnica Largura-fixa Tamanho em MB 11.2 Dicionário-como-string com ponteiros para cada termo 7.6 Também, blocking k = 4 7.1 Também, Blocking + front coding 5.9 Introduction to Information Retrieval COMPRESSÃO DE POSTINGS Sec. 5.3 Introduction to Information Retrieval Sec. 5.3 Compressão de Postings Os arquivos de postings são muito maiores que o dicionário, com fator de pelo menos 10. Objetivo chave:armazenar cada posting de forma compacta. Trataremos um posting como um docID. Para Reuters (800,000 documentos), nós usaremos 32 bits por docID quando usado inteiros de 4 bytes. Alternativamente, podemos usar log2 800,000 ≈ 20 bits por docID. Nosso objetivo: usar muito menos que 20 bits por docID. Introduction to Information Retrieval Sec. 5.3 Postings: duas forças conflitando Um termo como arachnocentric ocorre em talvez um documento dentre um milhão – desejamos armazenar este posting usando log2 1M ~ 20 bits. Um termo como the ocorre em praticamente todo documento, então 20 bits/posting é muito caro. Prefira 0/1 vetor de bitmap neste caso Introduction to Information Retrieval Sec. 5.3 Entrada de arquivo Postings Nós armazenamos a lista dos documentos contendo em ordem incremental de docID. computer: 33,47,154,159,202 … Consequência: é suficiente para armazenar gaps. 33,14,107,5,43 … Esperança: maioria dos gaps é possível codificar/armazenar em pelo menos 20 bits. Introduction to Information Retrieval Three postings entries Sec. 5.3 Introduction to Information Retrieval Sec. 5.3 Tamanho da Variável codificada Objetivo: Para arachnocentric, usaremos uma entrada de ~20 bits/gap Para the, usaremos uma entrada de ~1 bit/gap. Se o gap médio para um termo é G, nós precisamos usar uma entrada de ~log2G bits/gap. Principal Desafio: codificar todo inteiro (gap) com o mínimo de bits necessários. Isto requer um tamanho variável de codificação Códigos de tamanho variável para alcançar isto usando pequenos códigos para números pequenos. Introduction to Information Retrieval Sec. 5.3 Código de Byte Variável - Variable Byte (VB) Para um gap de valor G, nós queremos usar os mínimos bytes necessários para armazenar log2 G bits Começa com um byte para armazenar G e com 1 bit dedicado para ser o bit de continuação. Se o G ≤127, G será codificado em binário e armazenado nos 7 bits disponíveis, e o c=1 Caso contrário codifica os bits menos significativos de G em 7 bits e então usa bytes adicionais para codificar os bits mais significativos utilizando o mesmo algoritmo. No fim coloca 1 no bit de continuação do último e nos outros bytes c = 0. Sec. 5.3 Introduction to Information Retrieval Exemplo docIDs 824 gaps VB code 00000110 10111000 829 215406 5 214577 10000101 00001101 00001100 10110001 Postings armazenados como concatenação de bytes 000001101011100010000101000011010000110010110001 Propriedade Chave: Postings em codificação VB tem decodificação de prefixo únicos. Para um pequeno gap (5), VB usa um byte inteiro. Introduction to Information Retrieval Sec. 5.3 Introduction to Information Retrieval Codificação do gap 214.577 n0 = 214.577 bytestream = <> bytestream1 = <49> n1 = 1.676 bytestream2 = <12, 49> n2 = 13; bytestream3 = <13, 12, 49> bytestream4 = <13, 12, 177> 000011010000110010110001 35 Introduction to Information Retrieval Sec. 5.3 Introduction to Information Retrieval Decodificação 000011010000110010110001 Numbers0 = <> n0 = 0 for i de 1 a 3 1: n1 = 13 2: n2= 128 x 13 + 12 = 1676 3: n3=128 x 1676 + (177 - 128) -> 214.577 numbers1 = <214.577> 37 Introduction to Information Retrieval Sec. 5.3 Outra codificação de unidade variável Ao invés, podemos também usar diferentes comprimentos de unidades: 32 bits (words), 16 bits, 4 bits (nibbles). Comprimentos variáveis de bytes desperdiçam espaço se temos pequenos gaps – nibbles fazem melhor nestes casos. Códigos de byte variável: Usado por muitos sistemas comercial/pesquisa Existe um trabalho recente em codificação de wordaligned que agrupa um número variável de gaps em uma única palavra Introduction to Information Retrieval Código Unário Representa n como n 1s com um final 0. Código Unário para 3 é 1110. Código Unário para 40 é 11111111111111111111111111111111111111110 . Código Unário para 80 é: 11111111111111111111111111111111111111111111 1111111111111111111111111111111111110 Isto não parece promissor, mas… 39 Introduction to Information Retrieval Sec. 5.3 Código Gamma Podemos comprimir melhor com código de bit-level O código Gamma é o mais conhecidos destes. Representamos um gap G como o par length e offset Offset é o G em binário, com o primeiro bit mais significativo excluído Por exemplo 13 → 1101 → 101 length é o tamanho do offset Para 13 (offset 101), este é o 3. Codificamos length com código unário: 1110. Código Gamma de 13 é a concatenação de length e offset: 1110101 Sec. 5.3 Introduction to Information Retrieval Exemplos de Código Gamma número length g-code offset 0 none 1 0 0 2 10 0 10,0 3 10 1 10,1 4 110 00 110,00 9 1110 001 1110,001 13 1110 101 1110,101 24 11110 1000 11110,1000 511 111111110 11111111 111111110,11111111 1025 11111111110 0000000001 11111111110,0000000001 Introduction to Information Retrieval Gamma code properties Todo código gamma tem um número ímpar de números de bits Código Gamma possui unicidade de prefixo decodificado, como o VB Código Gamma pode ser usado por qualquer distribuição Código Gamma é livre de parâmetro Sec. 5.3 Introduction to Information Retrieval Sec. 5.3 Gamma é raramente usado na prática Máquinas possuem limites de palavra – 8, 16, 32, 64 bits Operações que passam dos limites da palavras são mais lentos Compactar e manipular a granularidade de bits pode ser lento Codificação de byte variável é potencialmente mais eficiente Graças a eficiência, byte variável é conceitualmente mais simples com apenas um pouco de custo de espaço adicional. Introduction to Information Retrieval Sec. 5.3 RCV1 compression Estrutura de Dados Tamanho em MB dicionário, largura-fixa 1,2 Dicionário, apontador de termo dentro da string 7,6 com blocking, k = 4 7,1 com blocking & front coding 5,9 Coleção (text, xml markup etc) Coleção (text) Matriz de incidência de Term-doc 3.600,0 960,0 40.000,0 postings, descompactado (palavras de 32 bits) 400,0 postings, descompactado (20 bits) 250,0 postings, codificação de byte variável 116,0 postings, Codificação gamma 101,0 Introduction to Information Retrieval Sec. 5.3 Resumo da compressão de índice Nós podemos agora criar um índice para recuperação booleana de alta eficiência que utiliza eficientemente o espaço Apenas 4% do tamanho total da coleção Apenas 10-15% do tamanho total do texto na coleção Entretanto, nós ignoramos as informações posicionais Ainda assim, espaços poupados são menos para índices usados na prática Mas as técnicas são substancialmente as mesmas Introduction to Information Retrieval Ch. 5 Resources for today’s lecture IIR 5 MG 3.3, 3.4. F. Scholer, H.E. Williams and J. Zobel. 2002. Compression of Inverted Indexes For Fast Query Evaluation. Proc. ACM-SIGIR 2002. Variable byte codes V. N. Anh and A. Moffat. 2005. Inverted Index Compression Using Word-Aligned Binary Codes. Information Retrieval 8: 151–166. Word aligned codes