Técnicas de Compressão Aplicadas à Recuperação de Informação

Eduardo Freire Nakamura, Fabíola Guerra Nakamura, José Pinheiro de Queiroz Neto
{nakamura,fgnaka,jpq}@dcc.ufmg.br

Universidade Federal de Minas Gerais - UFMG
Departamento de Ciência da Computação - DCC

26 de Setembro de 2002

Resumo:

A utilização de técnicas de compressão de dados em sistemas de recuperação de informação (RI) permite que a busca exata e aproximada seja feita diretamente sobre o texto comprimido. Algoritmos para este tipo de busca podem chegar a ser até 8 vezes mais rápidos que o melhor algoritmo de busca encontrado na literatura para busca em textos não comprimidos [1]. Neste trabalho são apresentadas e discutidas as técnicas mais recentes de compressão e algoritmos para busca em textos comprimidos. Em particular, são apresentados alguns resultados obtidos com um método de compressão chamado BH (Byte-Huffman) desenvolvido para sistemas de RI [1,2].

Introdução

A principal motivação para a aplicação de técnicas de compressão em sistemas de RI consiste em prover acesso rápido através de buscas por palavras-chaves em bases de dados textuais grandes [1,2,3,4]. A busca em textos comprimidos é um dos raros casos em que não existe uma relação de perda entre espaço e tempo, ou seja, tanto o espaço quanto tempo são reduzidos. Ao comprimir o índice e o texto inteiro, o espaço total de armazenamento tende a ser reduzido pela metade. O tempo gasto para a construção do índice comprimido e pela busca é inferior ao gasto para arquivos não comprimidos [2].

Em [3] são propostos métodos que mostram que a busca feita diretamente em arquivos comprimidos é mais veloz do que a busca feita nos arquivos originais. Além disso, os sistemas de RI podem acessar uma determinada palavra em um arquivo comprimido sem que o texto seja totalmente descomprimido.

Em relação à compressão, algumas métricas são especialmente interessantes. A primeira é a taxa de compressão que representa o tamanho do arquivo comprimido como uma porcentagem do tamanho do arquivo não comprimido. Outras duas métricas são definidas como a velocidade de compressão e de descompressão. Em bases textuais grandes a velocidade de descompressão torna-se mais importante do que a velocidade de compressão. Isto se deve ao fato de que normalmente o texto é comprimido uma única vez e lido várias vezes.

Para o casamento de padrão, uma técnica relevante é fazer a busca diretamente sobre o arquivo comprimido sem que este seja descomprimido. Neste caso, ao invés de descomprimir o texto, o padrão é comprimido para então ser realizada a busca no texto comprimido. Conseqüentemente, como tanto o padrão quanto o texto estão comprimidos, uma quantidade menor de bytes são comparados durante a busca.

Técnicas de Compressão para Sistemas de RI

É importante observar que nem todos os métodos de compressão são aplicáveis aos sistemas de RI. Em particular, a família de métodos de compressão Ziv-Lempel[*] não são vantajosas para o cenário de RI por dois motivos. Primeiro, o acesso aleatório é caro pois a descompressão precisa ser iniciada no começo dos arquivos. Segundo, a busca em arquivos comprimidos com estes métodos necessitam a sua descompressão.

A codificação aritmética apresentada em [6] que codifica os símbolos em frações de bits é outro exemplo que apresenta restrições semelhantes às dos métodos da família Ziv-Lampel.

O método de codificação de Huffman utiliza códigos menores aos símbolos (tipicamente caracteres) de maior freqüência de um texto [7]. Em sistemas de RI esta codificação é melhor aproveitada quando as palavras são tratados como símbolos ao invés de caracteres, conforme proposto por Bentley et al. [8]. A esta abordagem dá-se o nome de Compressão de Huffman Baseada em Palavras.

Compressão de Huffman Baseada em Palavras

No cenário de RI são utilizados textos em linguagem natural, conseqüentemente, as palavras são os elementos atômicos sobre os quais são construídos os sistemas de RI. Portanto, é natural imaginar que uma compressão baseada em palavras seja mais apropriada do que uma baseada em caracteres. De fato, para textos em Inglês os métodos de Huffman baseados em caracteres apresentam uma taxa de compressão de 40 por cento enquanto métodos baseados em palavras superam 75 por cento [2].

A compressão é feita em duas fases distintas. Primeiro, é obtida a freqüência de cada palavra do texto. A seguir, é feita a compressão propriamente dita.

Melhorias podem ainda ser alcançadas utilizando um modelo que considera o fato de que os textos possuem, além das palavras, separadores. Uma forma eficiente de tratar palavras e separadores é a utilização do modelo sem espaços proposto por Moura et al. [3].

Modelo sem Espaços

Um fato importante utilizado por este modelo é que, na maioria dos casos, uma palavra é seguida de um único espaço em branco como separador. Segundo Moffat [9], pelo menos 70 por cento dos separadores encontrados em textos em Inglês são constituídos de um único espaço. No modelo sem espaços, quando um único espaço segue uma palavra, o algoritmo de compressão codifica apenas a palavra, caso contrário, é codificada a palavra e depois o separador.
 
 

Figura: Codificação de Huffman baseada em palavras utilizando o método sem espaços. Aqui o caractere ``~" representa um espaço branco.
\begin{figure} \centering \includegraphics [scale=.9]{images/huffman-word-space-less}\end{figure}

A Figura 1 mostra a codificação de texto utilizando o método sem espaços da codificação de Huffman baseada em palavras. Nesta figura, o texto ``para cada rosa, uma rosa é uma rosa" foi codificado em ``0110 0100 1 0101 00 1 0111 00 1". Note que toda ocorrência de separadores compostos de um único espaço são ignoradas.

Durante a decodificação, um espaço em branco é acrescentado entre todas as ocorrências de duas palavras que não possuírem um separador entre elas.

Codificação em Bytes

Como os bytes são unidades básicas de armazenamento, as operações de leitura/escrita, aritméticas e lógicas são mais eficientes quando executadas sobre bytes do que quando executadas sobre bits. Por este motivo, a codificação em bytes torna-se interessante para sistemas de RI.

A codificação de Huffman em bytes proposta por Moura et al. [3] é uma variação chamada Byte-Huffman (BH) que associa uma seqüência de bytes ao invés de bits para cada palavra do texto.

Em [1] Moura propõe outra variação chamada de Byte-Huffman Sincronizado (BHS). O método BHS utiliza códigos de Huffman com dígitos de 7 bits e adiciona um bit extra de sincronização para cada dígito do código comprimido. Este bit sinaliza qual é o primeiro byte de cada código. Assim, utilizando o BH, suponha que a codificação para a palavra ``olá'' seja ``3 29 15'', utilizando o BHS a codificação seria ``131 29 15'' pois 3 + 128 = 131.

Segundo Ziviani et al. [2], a utilização de bytes ao invés de bits na codificação de Huffman apresenta uma degradação pequena na taxa de compressão. Seus experimentos mostram que o BHS possui uma taxa de compressão três pontos percentuais maior do que o BH. Uma grande vantagem dos métodos BH e BHS é o tempo de descompressão que é mais do que 20 por cento mais rápido do que o utilitários como o Gzip e o Unix Compress.

Outra vantagem do BH e BHS é a possibilidade de executar uma busca rápida diretamente no texto comprimido utilizando qualquer algoritmo de busca seqüencial baseada em casamento de padrão.

Busca Seqüencial em Textos Comprimidos

A busca em textos comprimidos pode ser realizada sem a necessidade de se descomprimir o texto, através da compressão do padrão e de sua busca direta no texto comprimido. Esta técnica acelera o processo de busca, pois o tempo de compressão do padrão é menor do que o tempo de descompressão do texto. Além disso, o texto comprimido possui um número menor de bytes à serem verificados do que o texto original. A aplicação desta técnica é possível devido à utilização dos métodos de codificação BH e BHS que quando utilizados na compressão do texto e do padrão permitem que a busca no texto comprimido seja realizada por qualquer algoritmo clássico de casamento de padrão.

Para a procura de palavras simples em um texto comprimido, o algoritmo inicialmente realiza a operação de busca binária do padrão no vocabulário, obtendo em seguida o código comprimido da palavra. Se esta palavra for encontrada a folha correspondente a ela na Árvore de Huffman é marcada. O segundo passo é utilizar um algoritmo de busca seqüencial sobre o texto comprimido utilizando o código encontrado.

É importante salientar que para a codificação BH, como não há marcação de inicio de palavras, o código pode ser encontrado no texto comprimido, mas pode não representar a palavra e sim uma concatenação dos códigos de outras palavras. Este problema é contornado utilizando-se na compressão a codificação BHS.

Considerando as exigências dos sistemas de informação atuais, os algoritmos de busca devem ser flexíveis, o que significa realizar busca para padrões complexos, que incluem buscas ignorando letras maiúsculas e minúsculas, buscas que permitam erros (buscas aproximadas) e buscas de frases compostas por padrões complexos.

Casamento Flexível de Padrão

A abordagem para o casamento de padrão complexo utiliza também o método de codificação de Huffman simples para compressão do texto original. Utilizando a metodologia para busca de palavras simples de maneira seqüencial pode-se implementar a busca por padrões complexos, como frases e expressões regulares complexas permitindo erros.

Considere um padrão que possui L palavras. Para cada uma destas palavras é criada uma máscara de L bits. A frase passa por um pré-processamento, onde o i-ésimo bit da palavra x recebe valor 1 se ela aparecer como o i-ésimo elemento do padrão. O algoritmo então busca seqüencialmente cada elemento i da frase no vocabulário e coloca em 1 o valor do i-ésimo bit das palavras que casam como o elemento i da frase. A Figura 2 ilustra esta situação.
 
 

Figura: Esquema de busca para a frase de três palavras ``ro* rosa em," permitindo um erro por palavra. A expressão ``ro*'' significa qualquer palavra que inicie com ``ro''.
\begin{figure} \centering \includegraphics [scale=.8]{images/search-scheme}\end{figure}

Após esta fase, o texto comprimido é verificado como descrito para palavras simples. Um autômato não-determinístico é responsável pelo controle dos estados do padrão, onde o estado 0 está sempre ativo e toda vez que o estado i é ativado o algoritmo informa que houve uma ocorrência.

A transição do estado i para o estado i+1 ocorre quando o elemento i do padrão foi encontrado no texto. O autômato é não determinístico por que permite a ativação de dois estados no mesmo intervalo de tempo.

O algoritmo lê os bytes do texto comprimido e percorre a árvore de Huffman, até chegar em uma folha, quando irá enviar para o autômato a mascara de bits da folha. A ativação do estado i está condicionada ao estado i-1 estar ativo e ao bit i da máscara de i estar em 1.

Este procedimento é implementado pelos algoritmos Shift-OR [10] e Shift-AND [11], que permitem a simulação de um autômato com até w+1 estados, onde w é tamanho em bits da palavra do computador.

Estes algoritmos executam uma transição no autômato para cada palavra do texto utilizando apenas duas operações por transição. Somente para os estados que casam com a palavra do texto ocorrem transições, neste caso é realizada uma operação AND (Shift-AND) ou OR (Shift-OR) bit a bit com a mascará encontrada na folha da árvore de Huffman. Uma operação shift e uma operação AND a cada palavra do texto atualizam o estado da busca (Shif-AND).

Nesta operação podem ser ignorados separadores de texto e palavras como artigos e preposições tornando a busca mais flexível.

Aprimorando a busca

Em um cenário como textos comprimidos orientados a palavra o algoritmo Shift-AND apresenta opções para busca de expressões regulares, permitindo erros e outros padrões flexíveis, como ignorar a ordem que as palavras aparecem na frase.

O autômato da Figura 3 representa uma busca por frase, com quatro palavras e permitindo 2 erros, entre eles inserções, remoções e/ou substituições de palavras.
 
 

Figura: Autômato não determinístico para busca aproximada por frase no texto comprimido. Este autômato reconhece 4 palavras com até 2 erros. As transições pontilhadas não consomem nenhuma palavra. As demais transições sem rótulos ocorrem quando é consumida uma palavra qualquer.
\begin{figure} \centering \includegraphics [scale=.7]{images/quatro-palavras-dois-erros}\end{figure}

Utilizando-se extensões do algoritmo Shift-AND este autômato pode ser implementado para a busca aproximada de frases e definitivamente tornar a busca em textos comprimidos cada vez mais atrativa.

Compressão Aplicada a Índices Invertidos

O uso de índices invertidos é uma forma eficiente para a busca de palavras em um texto. Assim como nos textos, o índice também pode ser comprimido para permitir uma busca mais eficiente.

Em [2] são apresentados três tipos distintos de índices. O primeiro é o índice invertido completo, que guarda a posição exata de cada palavra no texto, e pode ser utilizado com qualquer método de compressão, pois a busca é feita utilizando a lista, e a descompressão é utilizada somente na apresentação do resultado. O segundo é o índice de arquivo invertido, que guarda o documento onde há a ocorrência de cada palavra, e apresenta dificuldades quando a busca desejada envolve uma frase, pois duas palavras podem estar em um documento sem que façam parte da mesma frase. O último é o índice de endereçamento de bloco, que divide o texto em blocos de tamanho fixo, o qual pode conter parte de ou vários documentos, ou ainda a sobreposição de limites de documentos, guardando apenas os blocos onde cada palavra possui ocorrência, servindo como um filtro que elimina os blocos que não contém a ocorrência.

Nestes últimos dois casos, é necessário que a técnica de busca com compressão seja eficiente quando o texto tiver que ser comprimido, permitindo uma busca rápida em tempo real.

É possível combinar qualquer um dos três tipos de índices invertidos com índice comprimido, o que reduz bastante o tamanho deste último devido às características de seqüencia das listas de ocorrências. As listas podem, entretanto, ser construídas já no formato comprimido, reduzindo o uso de memória principal do sistema. A construção do índice de um texto comprimido é mais rápida que a construção do índice de um texto não comprimido [2]. Uma das características da codificação de Huffman baseada em palavras é a sua fácil integração com índice invertido, pois a tabela de símbolos de Huffman é exatamente o vocabulário do texto, permitindo integrar as estruturas de dados do compressor e do índice.

Em [4] Scholer et al. também utilizam uma codificação em bytes ao invés de bits aplicada a índices invertidos. Como resultado, Scholer et al. também concluíram que a codificação em bytes dos índices comprimidos produz pesquisas mais rápidas quando comparadas com índices não comprimidos e com índices comprimidos utilizando a codificação em bits (mesmo quando estes cabem inteiramente na memória).

Atualização de Índices Comprimidos

Um ponto importante a ser observado em bases de textos, é como atualizar o índice quando ocorrem alterações. Índices invertidos normalmente permitem essa modificação construindo o índice invertido da diferença em relação ao novo texto, e periodicamente unindo este ao índice principal. O uso da compressão não funciona bem para este caso, devido à mudança das freqüências da palavra.

Pode-se, entretanto, aplicar uma heurística que consiste em adicionar uma palavra vazia com freqüência zero ao vocabulário, e esta irá sinalizar as novas palavras adicionadas ao texto, ou seja, toda vez que uma nova palavra for adicionada, esta irá ser codificada com o código da palavra vazia. Quando o texto comprimido é grande, o uso do código corrente pode tornar-se ótimo, e as novas palavras podem ter uma perda, que entretanto será desprezível. Faz-se necessário adaptar o algoritmo de busca quando se pretende obter essas novas palavras.
 
 

Figura: Taxas de compressão do BH, Gzip, Compress, Pack.
\begin{figure} \centering \includegraphics [scale=.55]{images/taxa}\end{figure}

Resultados Práticos

Para os experimentos a base de texto escolhida é constituída de arquivos da coleção WSJ (The Wall Street Journal) com as edições de 1988 com tamanhos entre 2MB e 100MB. Os testes foram realizados em uma máquina UltraSparc 4 executando o sistema operacional SunOS 5.5.1. O compilador utilizado foi o gcc 2.8.1.

Os testes oferecem um estudo comparativo entre as técnicas de compressão utilizadas pelos aplicativos Gzip, Compress, Pack do Unix e o BH mostrado na seção 2.1.2. As métricas utilizadas são: taxa de compressão, tempo de compressão e tempo de descompressão.
 
 

Figura: Tempos de compressão do BH, Gzip, Compress, Pack.
\begin{figure} \centering \includegraphics [scale=.55]{images/compressao}\end{figure}

 

Figura: Tempos de descompressão do BH, Gzip, Compress, Pack.
\begin{figure} \centering \includegraphics [scale=.55]{images/descompressao}\end{figure}

Os experimentos (Figura 4) mostram que os aplicativos Gzip, Compress e Pack do Unix apresentam uma taxa de compressão constante independente do tamanho do arquivo texto. Para o BH, a taxa de compressão diminui de acordo com o crescimento do texto original. A Figura 4 nos permite observar também que, para arquivos grandes (mais de 20MB), o BH é capaz de comprimir mais do que os demais aplicativos de compactação. Isto ocorre porque para arquivos grandes as palavras mais comuns apresentam uma grande repetição de maneira que o BH utiliza códigos menores para palavras de grande ocorrência. Além disso, espaços em branco não são codificados pelo BH.

Na Figura 5 podemos analisar o tempo de compressão gasto pelos BH e os outros aplicativos de compactação. Obviamente, o tempo de compactação cresce de acordo com o tamanho do texto. É importante observar que o BH é mais eficiente do que o Gzip perdendo para o Compress e para Pack cujas taxas de compressão são, respectivamente, aproximadamente 30 e 10 pontos percentuais pior do que a taxa do BH (Figura 4).

Conforme observado anteriormente mais importante do que o tempo de compressão é o tempo de descompressão. Na Figura 6 podemos verificar que os melhores tempos de descompressão são alcançados pelo BH e pelo Gzip. Contudo, o BH supera o Gzip, principalmente quando o tamanho do arquivo a ser descompactado cresce.
 
 

Figura: Tempo médio de busca em arquivos comprimidos e descomprimidos (agrep, grep, bmh).
\begin{figure} \centering \includegraphics [scale=.55]{images/tempo-medio}\end{figure}

Para a busca exata, foi utilizado o Shift-OR em textos comprimidos com o método BH. Esta busca é comparada com os aplicativos Grep, Agrep e uma implementação do BMH (Boyer-Moore-Hospool). As buscas foram executadas com padrões de tamanhos entre 2 e 18 em um texto de 100MB. A Figura 7 e a Tabela 1 mostram os valores médios dessas buscas. Note que o Shift-OR sobre o arquivo comprimido foi, na média, 6 segundos mais rápido do que o Agrep.
 
 


Tabela: Tempo médio de busca exata
Algoritmo Tempo médio (s)
busca comprimida  
com Shift-OR 3.94
Agrep 10.28
Grep 10.86
bmh 16.69

Para a busca permitindo erros, é utilizado o Shift-AND sobre o arquivo comprimido com o BH. Em [2] é mostrado que a busca permitindo erros em arquivos comprimidos é bem mais eficiente do que o Agrep quando o número de erros cresce (Tabela 2) chegando a ser até 7 vezes mais rápido. Outros resultados apresentados em [1] mostram que este ganho de velocidade pode ser de até 8 vezes.
 
 


Tabela: Tempo médio em segundos da busca permitindo erros. O número de erros é indicado por k.
Algoritmo k=1  k=2  k=3 
busca comprimida      
com Shift-AND 23.10 24.70 25.00
Agrep 117.90 146.10 174.60

Conclusões

A utilização de técnicas de compressão aplicadas aos sistemas de RI, reduzem os custos de armazenamento e tornam estes sistemas mais rápidos, como pudemos verificar nos resultados obtidos.

As técnicas de compressão como o BH e BHS são capazes de obter melhores taxas de compressão, velocidade de compressão e de descompressão quando comparado aos aplicativos Gzip, Compress e Pack.

Os algoritmos para busca em texto comprimido podem ser tão flexíveis quanto qualquer sistema de busca em textos não comprimidos permitindo diferentes maneiras de realizar busca exata e aproximada. Isto se deve ao fato de que o BH e o BHS permitem o acesso aleatório aos arquivos comprimidos. Além disso, para a pesquisa não é necessário que o texto seja descomprimido como é o caso dos algoritmos da família Ziv-Lempel.

Outras aplicações para técnicas de compressão incluem a melhoria do desempenho de algoritmos distribuídos utilizados na construção de arquivos invertidos e a compressão de arquivos de histórico utilizados em máquinas de busca modernas.

Bibliografia

1
de Moura, E. S., Compressão de Dados Aplicada a Sistemas de Recuperação de Informação . Tese de Doutoramento, Universidade Federal de Minas Gerais, Belo Horizonte, October 1999.
2
Ziviani, N., de Moura, E. S., Navarro, G., Baeza-Yates, R. Compression: A key for next generation text retrieval systems. IEEE Computer , v. 33, n. 11, p. 37-44, 2000.
3
de Moura, E. S., Navarro, G., Ziviani, N., Baeza-Yates, R. Fast and flexible word searching on compressed text. ACM Transactions on Information Systems , v. 18, n. 2, p. 113-139, April 2000.
4
Scholer, F., Williams, H. E., Yiannis, J., Zobel, J., Compression of inverted indexes for fast query evaluation. In: Proceeding of the Twenty-Fifth Annual International Conference on Research and Development in Information Retrieval , p. 222-229, ACM Press, 2002.
5
Ziv, J., Lempel, A. Compression of individual sequences via variable-rate coding. ACM Transactions on Information Theory , v. 24, n. 5, p. 530-536, 1978.
6
Witten, I. H., Moffat, A., Bell, T. C., Managing Gigabytes: Compressing and Indexing Documents and Images . 2a ed., San Francisco: Morgan Kaufmann Publishing, May 1999.
7
Huffman, D. A method for the construction of minimum-redundancy codes. Proc. of Inst. of Electrical and Radio Engineers , v. 40, n. 9, p. 1090-1101, 1952.
8
Bentley, J., Sleator, D., Tarjan, R., Wei, V. A locally adaptative data compression scheme. Communications of the ACM , v. 29, p. 320-330, 1986.
9
Moffat, A. Word-based text compression. Software Practice and Experience , v. 19, n. 2, p. 185-198, 1989.
10
Baeza-Yates, R., Gonnet, G. H. A new approach to text searching. Communications of the ACM , v. 35, n. 10, p. 74-82, October 1992.
11
Wu, S., Manber, U. Fast text searching allowing errors. Communications of the ACM , v. 35, n. 10, p. 83-91, October 1992.

Rodapé

...Ziv-Lempel
Estes métodos de compressão tiveram origem no fim da década de 70 e foram propostos por Ziv e Lempel [5].