Representação e Compressão de Texto

Slides:



Advertisements
Apresentações semelhantes
Contadores e Registradores
Advertisements

Aula 3 – Transmissão Digital
Tecnologias da Informação e Comunicação
Software Básico Silvio Fernandes
Indexação Automática de Documentos
ESTIMAÇÃO.
Ciclos, Vectores e Gráficos Simulação da Queda de Corpos II
Software Básico Silvio Fernandes Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação Aula.
Software Básico Silvio Fernandes Universidade Federal Rural do Semi-Árido Departamento de Ciências Exatas e Naturais Ciência da Computação Aula.
Software Básico Silvio Fernandes
Compressão de Dados ORI Ednaldo Pizzolato.
Indice estruturado por Hash
Hashing Extensível o espaço de endereços disponíveis não é fixo
1 Complexidade de Algoritmos Complexidade de pior caso Complexidade de melhor caso de uso bem menos freqüente em algumas situações específicas Complexidade.
Árvores.
Compressão de Dados.
Arquivos Extensíveis.
Pesquisa em Memória Primária
Linguagens Livres de Contexto
Medida do Tempo de Execução de um Programa
Pesquisa em Memória Primária
Busca Cega (Exaustiva)
A FAST APRIORI implementation
Indexação e Hashing Muitas consultas referenciam apenas uma pequena porção dos registros em uma tabela. Portanto necessitamos ser capaz de localizar estes.
Capítulo 7 Multimídia 7.1 Introdução à multimídia
Polinômios Prof. Marlon.
Construção de Compiladores
Organização da Memória Principal
I – Informação Digital Escola Politécnica da USP MBA EPUSP em Gestão e Engenharia do Produto EP018 O Produto Internet e suas Aplicações Tecnologias de.
MODULAÇÃO Conceito de Modulação
Árvore Binária & AVL Equipe: Felipe Pontes Gustavo Márcio
Estrutura de decisão e repetição em JAVA
Buscas em Grafos Prof. André Renato 1º Semestre/2012
Unidade I Noções básicas de Tecnologias da Informação e Comunicação.
Sistemas Numéricos Sistemas Numéricos de Interesse
Meta - heurísticas Prof. Aurora
Microsoft Access Carlos Sebastião.
Inteligência Artificial
Criptografia Simétrica
Informática Teórica Engenharia da Computação
Processamento Digital de Imagens
Compressão de Textos Juliano Palmieri Lage.
Pesquisa em Memória Primária
Sistemas Operacionais
Conceitos de Lógica Digital
Fundamentos de Telecomunicações
CADEIA DE CARACTERES (Strings)
Teoria da Informação Profa. Lillian Alvares
Algorítmos e estrutura de dados III
Aula 03 – BCC202 Análise de Algoritmos (Parte 1) Túlio Toffolo www
Gerenciamento de Dados
Revisão Prova 2 Métodos de Acesso – Parte 2 AULA 21 Profa. Sandra de Amo GBC053 – BCC.
Fábio de Oliveira Borges
Introdução e Busca Cega
Introdução aos Agentes Inteligentes Busca Cega (Exaustiva)
INTRODUÇÃO À ANÁLISE COMBINATÓRIA
Campus de Caraguatatuba Aula 8: Noções Básicas sobre Erros (2)
TÉCNICAS DE COMPRESSÃO DE DADOS DISCIPLINA:R.COM..
Códigos de Detecção e Correcção de erros
Tecnologias da Informação e Comunicação
Campus de Caraguatatuba Aula 9: Noções Básicas sobre Erros (3)
1 Efficient Phrase Querying with an Auxiliary Index (SIGIR) 2002 Trabalho realizado por: Trabalho realizado por: João Casteleiro Alves João Casteleiro.
PROCESSAMENTO DIGITAL DE IMAGENS
Estrutura de Dados III Revisão
Algoritmo de Huffman.
Análise e Síntese de Algoritmos Algoritmos GreedyCLRS, Cap. 16.
Técnicas de Compressão de Dados
Tipos de Dados Todo o trabalho realizado por um computador é baseado na manipulação das informações contidas em sua memória. Estas informações podem.
Arrays Outline 7.1 Introdução 7.2 Arrays 7.3 Declarando e Criando Arrays 7.4 Exemplos usando arrays 7.5 Ordenando arrays 7.6 Procurando em.
Capítulo 14 Camada 6 A Camada de Apresentação. Sumário A Camada de Apresentação.
Transcrição da apresentação:

Representação e Compressão de Texto Joaquim Macedo Departamento de Informática da Universidade do Minho & Faculdade de Engenharia da Universidade Católica de Angola

Sumário Introdução Representação do Texto Princípios de compressão de texto Redundância Estatística Função densidade de probablidade e entropia Teorema de Shannon para codificação de fonte sem ruído Codificação de Huffman Codificação Aritmética Compressão baseada em dicionário Técnica LZ77 Técnica LZ782

Introdução O texto é o media mais importante para representar informação Media mais antigo para armazenar e transmitir informação Maior parte da informação actual é mantida em texto Objecto desta aula Representação digital de texto e técnicas de compressão

Representação de Texto ASCII (American National Standards Institute ANSI) American Standard Code for Information Interchange O código ASCII é um código de 8 bits para representação de caracteres. Por exemplo o código para H é 01001000, para e é 01100101. A mensagem Hello pode ser representada como 01001000 01100101 01101100 01101100 01101111 00101110 Ao contrário do áudio e dos dados visuais (imagens, vídeo) o texto é informação digital. Não há amostragem no tempo nem quantificação. O texto pode ser considerado como criado como uma fonte de informação discreta que emite símbolos que representam letras dum alfabeto. O código de representação mais popular para o alfabeto inglês é o ASCII e foi publicado em 1968. O conjunto de caracteres ASCCI normalizado usa 7 bits para cada caracter, incluindo letras, símbolos de pontuação e um pequeno conjunto adicional de símbolos associados com os teclados de computador. Embora o código ASCII se tenha tornado bastante popular, tornou-se claro que um código de 7 bits com um máximo de 128 caracteres não é suficiente. Por esse facto foram desenvolvidos códigos de caracteres maiores que usam os 8 bits. Esses códigos têm um conjunto de 128 caracteres. O código usado é o ASCCI estendido do 256 caracteres.

Representação de Texto ASCII table (starting from #32)

Tabela ASCII

Tabela ASCII extendida

Representação de Texto Código bits Caracteres ASCII 8 256 Unicode 16 65536 ISO= International Organization for Standardization

Representação de texto Requisitos de espaço de armazenamento Como o texto é usado extensivamente em muitos tipos de documentos como livros, jornais e outros periódicos É necessário representá-lo eficientemente para reduzir os requisitos do espaço de armazenamento

Representação de texto Requisitos de espaço de armazenamento Exemplo 6.1 Considere um livro com 800 páginas. Cada página contém em média 40 linha e cada linha 80 caracteres (incluindo espaços). Se o livro for armazenado em formato digital que espaço de armazenamento é necessário? Resposta: 2.44 Mbytes 80*40*80 = 2.56 caracteres o equivalente a 2.44 MBytes

Representação de texto Requisitos de espaço de armazenamento Um documento típico requer alguns Mbytes de espaço de armazenamento É possível representar o mesmo documento usando menos espaço? Isso é verdade É possível compactar texto sem perder informação! Muitos de nós já usaram o winzip (Windows) ou o gzip (Linux)

Princípios para Compressão de Texto Os textos típicos têm informação redundante As técnicas de compressão reduzem ou eliminam essa redundância Tipos de redundância Estatística Probabilidade não uniforme de ocorrência de caracteres ou símbolos (menos bits ao símbolos de maior ocorrência) Conhecimento Quando o texto a codificar é limitado em termos de âmbito, pode ser associado conhecimento comum ao codificador e descodificador; nesse caso é enviada a informação indispensável para reconstruir o texto original. Nas secções seguintes vão ser ilustrados os dois tipos de redundância e apresentar técnicas para conseguir compressão explorando essas redundâncias.

Redundância Estatística Métodos de redução de redundância estatística Baseados na teoria de codificação das fontes Cada amostra de dados (caracter) tratado com símbolo gerado por uma fonte de informação Conjunto de todos símbolos é o alfabeto Lida com a compressão de dados gerados por uma fonte que emite uma sequência de símbolos escolhidos dum alfabeto finto.

Teoria de Codificação de Fontes 2 conceitos fundamentais Entropia Medida da informação contida na fonte Define a quantidade mínima do débito médio de bits para reconstrução perfeita dos símbolos da fonte Taxa de distorção Define um limite inferir no débito médio de bits para uma dada distorção nos símbolos reconstruídos.

Função densidade de probabilidade Considere que S é uma fonte de informação discreta sem memória produzindo caracteres que são estatisticamente independentes. Assuma também que a fonte tem um alfabeto S com k símbolos Um caracter pode ser representado por um ou mais símbolos do alfabeto. Vamos considerar uma sequência de caracteres consistindo de N amostras representadas por O histograma da variável aleatória x é uma função discreta h[k]=nk, onde nk é o número de caracteres representados pelo simbolo sk. A função Dá uma estimativa da probabilidade de ocorrência do símbolo sk. Portanto p é a função densidade de probabilidade de x. Observe que soma da probabilidade de ocorrência de todos símbolos é 1

Exemplo 6.2 Considere a string X=¨aaabbbbbbccaaabbcbbbb¨ Determine o alfabeto Determine o histograma e a função densidade de probabilidade dos caracteres. Mostre que a soma das probabilidades dos símbolos do alfabeto é 1.

Entropia Embora uma fonte de informação possa ter k símbolos a informação disponibilizada por cada símbolo não é igualmente importante. A quantidade de informação média transportada por cada símbolo está relacionada com a sua probabilidade de ocorrência. A equação estabelece que a informação transportada por um símbolo é inversamente proporcional ao logaritmo da sua probabilidade de ocorrência. Se a probabilidade de ocorrência for muito pequena a informação transportada é muito grande e vice versa. Considere a observação típica: o jornal noticia eventos com baixa probabilidade com maior ênfase e considera eventos considerados normais. A entropia duma fonte é definida como a soma da quantidade de informação por símbolo da fonte como especificado no slide. A base do logaritmo na base 2 para expressar a informação em bits por símbolo.

Entropia Blocos de símbolos Embora cada símbolo possa ser analizado individualmente é comum lidar com um grande número de símbolos em vez de símbolos individuais. A saida da fonte S pode ser agrupada em blocos de N símbolos. Pode assumir-se que os símbolos foram gerados por uma fonte Sn com um alfabeto K^n. A fonte Sn é chamada a extensão de ordem N da fonte S. Podem ser gerados um total de K^n padrões audíveis por Sn. Vamos considerar que a probabilidade duma sequência s de caracteres seja dada por p(s). A entropia da fonte, isto é a informação média da fonte é dada pela equação no slide. A entropia verdadeira duma fonte de informação pode ser estimada usando a equação do slide. Contudo, para fazer o cálculo a função de probabilidade p(s) tem que ser calculada o que é bastante complicado. Para além disso, é necessário gerar um grande número de padrões áudio que não são fazíveis ou não têm sentido. Por esse facto a entropia de primeira ordem que é defenida com base em cada amostra é usada. Essa entropia é definida com base em cada símbolo. A entropia de primeira ordem é muitas vezes chamada entropia sem memória e fornece o débito de bít minimo necessario para a reprodução sem memória duma sequência de dados discreta.

Exemplo 6.3 Considere a fonte do exemplo anterior. Calcule a entropia de 1ª e 2ª ordem.

Teorema de Shannon Codificação de Fontes sem Ruído Considere uma fonte de texto com um alfabeto de tamanho K e entropia H(S) e a codificação de blocos de N símbolos da fonte Para qualquer é possível, escolhendo N suficientemente grande, construir um código em que número médio de bits por símbolo cumpra a seguinte relação

Teorema de Shannon Codificação de Fontes sem Ruído Pode ser mostrado que a entropia é limitada por

Exemplo 6.4 Considere uma fonte de informação com alfabeto {a,b,c,d}. Os símbolos têm igual probabilidade de ocorrência. Calcule a entropia e a redundância da fonte Qual o débito de bits médio necessário para transmitir os símbolos gerados pela fonte? Conceba um código adequado para os símbolos da fonte.

Exemplo 6.5 Qual a o débito de bits médio para uma fonte de três símbolos? Qual o débito necessário para a fonte do exemplo 6.2. Calcule a redundância da fonte. Quando é que redundância é zero?

Interpretação do Teorema de Shannon O Teorema estabelece que o limite mínimo para o débito de bits Mas não nos indica como fazê-lo. É muito difícil conseguir um débito igual à entropia. Normalmente é superior de um valor inferior a delta

Métodos estatísticos de compressão Duas estratégias de codificação Huffman Atribui um código de bits de comprimento variável a cada símbolo Relativamente rápido e acesso aleatório Semi-estático versus adaptativo Aritmética Texto de entrada representado por número reais entre 0 e 1 Símbolos de entrada com maiores probabilidades reduzem menos o intervalo que símbolos com menor probabilidade e portanto adicionam menos bits ao código de saída Mais lento que o de Huffman e a decompressão não pode começar a meio do ficheiro

Código de Huffman Inventado por Huffman a fazer um trabalho de casa em 1950.. Usados em muitos algoritmos de compressão gzip, bzip, jpeg (como opção), fax,… Propriedades: Gera códigos de prefixo óptimos Fácilidade na Geração de códigos Codificação e descodificação Comprimento médio=H se as propabilidades forem potências de 2

Codificação de Huffman Uma frase é codificada substituindo cada um dos seus símbolos com o respectivo código dado por uma tabela A codificação de Huffman gera códigos para um conjunto de símbolos, dada uma distribuição de probabilidade dos símbolos O tipo de código é chamada código de prefixo Nenhuma palavra de código é prefixo de outra palavra de código

Códigos de Prefixo Um código de prefixo é um código de comprimento variável onde nenhuma palavra de código é prefixo de outra palavra de código Exemplo a = 0, b = 110, c = 111, d = 10 Pode ser visto como uma árvore binária com valores de mensagens nos nós terminais e 0 e 1 nos seus ramos 1 1 a 1 d b c

Códigos de descodificação única Um código de comprimento variável atribui uma sequência de bits (palavra de código) de comprimento variável a todos valores de mensagem i.e. a = 1, b = 01, c = 101, d = 011 A sequência de bits 10110 que significa ? É aba, ca, ou, ad? Um código de descodificação única é um código de comprimento variável em que as sequências de bits podem sempre ser decomposta de forma únoca nas suas palavras de código.

Codificação de Huffman As palavras de código podem ser armazenadas numa árvore Árvore de descodificação O algoritmo de Huffman funciona construindo a árvore de descodificação de baixo para cima

Codificação de Huffman Algoritmo cria para cada símbolo um nó terminal contendo o símbolo e a sua propabibilidade. Os dois nós com as probabilidades mais pequenas tornam-se irmãos sob um novo nó pai, cuja probabilidade é a soma da dos filhos A operação de combinação é repetidad até haver um único nó raiz. Todos os ramos de todos nós não terminais são então etiquetados com 0 1.

Codificação de Huffman A codificação de Huffman é geralmente rápida quer na codificação como na descodificação desde que a probabilidade seja estática. Codificação de Huffman adaptativa é possível mas ou precisa de muito memória ou é lenta Acoplada com um modelo baseado em palavras (em vez dum baseado em caracter), fornece uma boa compressão.

Codificação de Huffman Frequências de caracter A: 20% (.20) B: 9% (.09) C: 15% D: 11% E: 40% F: 5% Não há mais caracteres no documento

Codificação de Huffman .4 BF .14 D .15 A .20 C .15 1 B .09 F .05

Codificação de Huffman Códigos A: 010 B: 0000 C: 011 D: 001 E: 1 F: 0001 ABCDEF 1.0 E .4 C .15 A .20 D F .05 BF .14 AC .35 BFD .25 ABCDF .6 B .09 1

Exemplo 6.4 Determine o código de Huffman para os símbolos da tabela Codifique a tring “baecedeac!” Descodifique 00011000100110000010111 Símbolo Probabilidade a 0.2 b 0.1 c d e 0.3 !

p(a) = .1, p(b) = .2, p(c ) = .2, p(d) = .5 Exemplo p(a) = .1, p(b) = .2, p(c ) = .2, p(d) = .5 a(.1) b(.2) c(.2) d(.5) (.3) (.5) (1.0) 1 (.5) d(.5) a(.1) b(.2) (.3) c(.2) 1 Passo 1 (.3) c(.2) a(.1) b(.2) 1 Passo 2 a(.1) b(.2) Passo 3 a=000, b=001, c=01, d=1

Codificação e Descodificação Codificação: Começar no nó terminal da árvore de huffman e seguir o percurso para a raiz. Inverter a ordem dos bits e enviar. Descodificação: Começar na raiz da árvore e seguir o ramo de acordo com o bit recebido. Quando chegar à um no terminal enviar o símbolo e regressar à raiz. (1.0) 1 (.5) d(.5) Há metodos mais rápidos que podem processar 8 ou 32 bits de cada vez 1 (.3) c(.2) 1 a(.1) b(.2)

Limitações dos Códigos de Huffman Precisa de pelo menos 1 bit para representar a ocorrência de cada símbolo Não podemos arranjar um código de Huffman que gaste 0.5 bits/símbolo Se a entropia da fonte for menor que 1 bit/simbolo o código de Huffman não é eficiente! Não se adapta eficientemente a um fonte com estatísticas variáveis. Embora haja códigos de Huffman dinâmicos, são difíceis de concretizar

Codificação aritmética Outra técnica baseada na entropia Maior relação de compressão que a codificação de Huffman Pode disponibilizar débito de bits infeiores a 1 O débito aproxima-se do limite teórico da entropia da fonte Técnica de codificação diferente da de Huffman Huffman: codificação independente por símbolo Resultado: concatenação do código de cada símbolo Aritmética: uma palavra de código para toda a mensagem

Exemplo Considere o alfabeto inglês com 26 letras. Calcule o número máximo de strings diferentes com comprimento 1 2 100 O exemplo acima demonstra que se uma fonte tem alfabeto de tamanho K há K^m mensagens possíveis de tamanho K. Se a a função densidade de probabilidade dos símbolos individuais for conhecida, a probabilidade duma dada mensagem Sm, de comprimento m, pode ser calculada. Como há K^m mensagens distintas possiveis podemos teoricamente calcular a probabilidade de cada um das mensagens. Se se pretender codificar cada mensagem de uma vez , pode ser construída uma tabela de códigos como a de Huffman. O comprimento da palavra de código será aproximadamente igual a –log p(Sm). Como há um grande número de palavras de código, a probabilidade individual p(Sm) será bastante pequena. Por esse facto o comprimento da palavra de código sera bastante grande. Codificar uma mensagem inteira duma vez aumenta a eficiência do codificador. Mesmo o código de Huffman fornece um débito de bits médio próximo da entropia menos se for menos que 1 bit por símbolo...Contudo gerar um tabela de Huffman de K^m símbolos é muito difícil mesmo impossível.A codificação aritmética fornece uma forma conveniente de conseguir esse objectivo. O método de codificação é explicado a seguir

Codificação Aritmética O código é para todo o texto como um sub-intervalo da unidade. Cada símbolo é representado por um sub-intervalo do intervalo que tem um comprimento proporcional à probabilidade do símbolo. O comprimento do intervalo final é o produto das probabilidades de todos símbolos no texto. Assuma que a probabilidade das diferentes mensagens possíveis p(sm) é conhecida. Sabe-se que a probabilidade de soma de todas as mensagens é igual a 1.Divida o intervalo [0,1) em K^m intervalos de tal forma que a largura de cada sub-intervalo corresponde exactamente à probabilidade de ocorrência da mensagem. Assuma então que os sub-intervalos são Uma vez determinados os sub-intervalos, qualquer número real num sub-intervalo corresponde a uma única mensagem e portanto a mensagem de entrada completa pode ser descodificada. Comos sintervalos não são sobrepostos, uma palavra de código para sm pode ser construída expandindo qualquer ponto no intervalo de forma binária e retendo apenas os bits depois do ponto decimal. Consequentemente o número de bits necessários para representar a mensagem pode diferir apenas de um máximo de 1 bit da entropia da fonte. O procedimento parece difícil de concretizar. Contudo, uma técnica recursiva simples pode ser usada para concretizar esse esquema. Vamos explicar com um exemplo

Codificação Aritmética Símbolo Probabilidade Gama (para o codificador aritmético) a 0.2 [0,0.2) b 0.1 [0.2,0.3) c [0.3,0.5) d [0.5,0.6) e 0.3 [0.6,0.9) ! [0.9,1.0) Passo 1: liste os símbolos e suas probabilidades como mostrado na tabela. Não há nenhuma ordem particular. Passo 2: Divide o intervalo [0,1) em 6 sub-intervalos uma vez que há seis simbolos. A largura de cada sub-intervalo é igual à probabilidade de ocorrência dos símbolos individuais. Passo 3: Agora suponha que queremos transmitir o símbolo baad! Uma vez que o primeiro símbolo é b, escolhemos o intervalo [0.2,0.3). Isso é mostrado na tabela 6.5 e na figura 6.3. Uma vez escolhido o intervalo é dividido em seis sub-intervalos de sugndo nível. Observe que as larguras desses sub-intervalos são mais pequenas que as dos intervalos de primeiro nível. Passo 4: O segundo símbolo é a. Portanto escolhemos o sub-intervalo correspondente ao a em [0.2,0.3) que é [0,2,0.22). O sub-intervalo [0.2,0.22) é novamente dividido em seis sub-intervalos de terceiro nível. Passo 5: O terceiro símbolo é novamente a. Portanto o sub-intervalo escolhido é o [0.2,0.204). Este sub-intervalo é novamente dividido em seis sub-intervalos de quarto nível. Passo 6: O quarto símbolo é d. Assim é escolhido o sub-intervalo [0.2020,0.2024). O sub-intervalo é novamente dividido em 6 sub-intervalos de sexto nível. Passo 7: O quinto símbolo é !. Assim o sub-intervalo escolhido é [0.20236,0.2024). Como não há mais símbolos a codificação está completa. O transmissor manda mandar um número arbitrário entre [0.20236,0.2024). O descodificador é capaz de reconstruir a sequência de entrada porque tam´bém está na posse da tabela do slide.

Codificação Aritmética Sub-intervalo Intervalo binário String de bits gerada Começar [0,1.0) b [0.2,0.3) [0.0,0.5) Depois a [0.2,0.22) [0.0,0.25) de [0.2,0.204) [0.125,0.25) 1 ver d [0.2020,0.2024) [0.1875,0.25) ! [0.20236.0.2024) [0.1875,0.21875) Contudo para terminar o processo de descodificação o descodificador tem o problema de detectar o fim da mensagem. Por exemplo o número 0.20230 pode representar baad!, baad!a ou baad!aa. Para resolver esta ambiguidade, normalmente é usado um símbolo EOF. A marca EOF é conhecida pelo codificador e pelo descodificador e assim esta ambiguidade pode ser resolvida. Neste caso ! é a marca EOF. O procedimento acima produz um número real que pode ser enviado para o descodificador. O número real é normalmente representado por uma sequência de bits que pode ser gerado uma vez conhecido o número real. Contudo não é necessário esperar que o número real seja gerado A sequência de bits pode ser gerada conforme os simbolos de entrada vão aparecendo os símbolos de entrada e os sub-intervalos segmentados.Depois de ver o primeiro símbolo b, o cofificar encurta a gama para [0.2,0.3). Assim que verifica que o primeiro intervalo é [0.0,0.5) o codificador sabe que o primeiro bit é 0. Portanto, pode começar a enviar os bits de saída. Depois do segundo símbolo, o codificador encurta a gama para [0.2,0.22). Neste instante o descodificador sabe que o segundo bit é 0 porque o intervalo é [0,0.25). Similarmente o terceiro bit é 1 porque o intervalo é [0.125,0.25). Da mesma maneira o quarto bit é 1 porque o intervalo é [0.1875,0.25. O esquema de descodificação é muito simples. Suponha que é neviado o número 0.20238. O descodificador sabe que o primeiro símbolo é b porque o número cai no intrevalo [0.2,0.3). O segundo símbolo é a porque o número cai no primeiro quinto da gama isto é [0.2,0.22). E assim o processo continua. No exemplo anterior usou-se um modelo fixo que não é adequado para codificar fontes não estacionárias onde a estatística da fonte varia com o tempo. Nesses casos devem-se usar modelos adaptativos para conseguir um melhor desempenho.

Codificação Aritmética Outro exemplo _ _ _ .6667 1 .6667 .6667 c c 1/3 1/4 _ c _ .5834 c 3/6 2/3 2/5 _ b 1/3 .6334 _ b _ 2/4 b .6501 1/3 2/5 b 2/6 _ _ a .4167 .6001 _ 1/3 a a .6390 _ _ 1/4 a 1/6 _ 1/5 .3333 .5834 .6334 Qualquer valor no intervalo [.6334,.6390) codifica ‘bcca’

Codificação Aritmética Adaptativa Podemos assumir Probabilidades iguais para todos símbolos no início Fazer a contagem dos símbolos para nos aproximarmos das suas probabilidades reais no texto Durante a descodificação Usar as mesmas contagens e seguir precisamente os mesmos sub-intervalos.

Modelos baseado em dicionário Métodos de compressão baseados em dicionário usam o princípio de substituir substrings num texto com uma palavra de código que iedntifica essa substring no dicionário O dicionário contém uma lista de substrings e uma palavra de código para cada substring Normalmente usam-se palavras de código fixas Obtem-se mesmo assim uma compressão razoável

Modelos baseado em dicionário Os métodos mais simples de compressão usam pequenos dicionários Por exemplo, codificação de digramas pares de letras seleccionadas são substituídas por palavras de código Um dicionário para o código de caracteres ASCII pode conter os 128 caracteres bem como 128 pares de letras mais comuns.

Modelos baseado em dicionário Codificação com digramas… As palavras de código de saída têm 8 bits cada A presença do conjunto completo de caracteres ASCII assegura que qualquer entrada (ASCII) pode ser representada. No melhor dos casos, cada par de caracteres é substituído por uma palavra de código, reduzindo de 7 bits/caracter para 4 bits/caracter No pior dos casos, cada caracter de 7 bits é expandido para 8 bits

Modelos baseado em dicionário Expansão natural: Colocar no dicionário sequências com mais caracteres nomeadamente palavras comuns ou componentes comuns das palavras. Um conjunto pré-definido de frases do dicionário tornam a compressão dependente do domínio ou se usam fazes muito curtas ou não se consegue uma boa compressão

Modelos baseado em dicionário Uma maneira de evitar o problema do dicionário ser desadequado para o texto a manipular é usar um dicionário semi-estático construir um novo dicionário para todo texto a compactar A sobrecarga de transmitir e armazenar o dicionário é significativo A decisão de que frases incluir no dicionário é um problema difícil de resolver

Modelos baseado em dicionário Solução: usar um esquema de dicionário adaptativo Codificadores Ziv-Lempel (LZ77 e LZ78) Uma substring de texto é substituída por um apontador para uma ocorrência prévia no texto. Dicionário: todo o texto anterior à posição corrente. Palavras de código: apontadores.

Modelos baseado em dicionário Ziv-Lempel… O texto anterior torna-se normalmente um dicionário muito bom, pois normalmente está no mesmo estilo e linguagem do texto seguinte. O dicionário é transmitido implicitamente sem custo extra, porque o descodificador tem acesso a todo texto previamente descodificado.

LZ77 Vantagens chave: Relativamente fácil de concretizar A descodificação pode ser feita facilmente usando apenas uma pequena porção de memória. apropriada quando os recursos necessários para descodificar devem ser minimizados

LZ77 A saída do codificador consiste duma sequência de triplas , i.e <3,2,b> O primeiro componente da tripla indica quão longe se deve olhar para o texto previamente descodificado para encontrar a próxima frase O segundo componente indica o comprimento da frase O terceiro componente dá o próximo caracter da entrada

LZ77 O componente 1 e 2 constituem um apontador para o texto prévio O componente 3 só é necessário se o caracter a ser codificado não ocorreu previamente.

LZ77 Codificação Para o texto presentemente na entrada: busca da maior unificação no texto anterior devolver a tripla que regista a posição e o comprimento da unificação A busca pode devolver um comprimento zero, situação em que a posição da unificação não é relevante. A busca pode ser acelarada indexando o texto prévio com estruturas de dados adequadas

LZ77 Há limitações de quanto para trás o apontador pode referir e o máximo tamanho da string referenciada: para texto em inglês, uma janela de poucos milhares de caracteres o comprimento da frase tem um máximo de 16 caracteres Senão gasta-se muito espaço sem benefício

LZ77 O programa de descodificação é muito simples, de forma que pode ser incluído com os dados com muito pequeno custo De facto os dados compactados são colocados como parte do programa de descodificação, que torna os dados com capacidade de auto-extracção. Forma comum de distribuição de ficheiros

Exemplo 6.8 Considere um dicionário de vinte caracteres (ou janela deslizante) e uma janela de antevisão de 8 caracteres. A string de entrada é RYYXXZERTYGJJJASDERRXXREFEERZXYURPP Calcule a saída do compressor de texto Janela deslizante (20 car.) Janela de antevisão (8 car.) Passo 1: A janela deslizante é carregada com os 20 primeiros caracteres da fonte de entrada com o caracter R na posição 0 e o segundo R na posição 19. Os 8 caracteres seguintes ficam na janela de antevisão. Passo 2: Procure uma sequência na janela deslizante que comece com o caracter na posição de antevisão, isto é X. A sequência de 5 caracteres como na posição de índice 5 da janela deslizante (“XXZER”) e unifica o padrão na janela deslizante. Esses 5 caracteres podem ser substituídos por um registo (deslocamento, comprimento) como se segue: Passo 3:A janela deslizante é movida 5 caracteres. Os 5 caracteres RYYXX são movidos para fora e os caracteres RXXYU entram para a janela de antevisão ZERTYGJJJASDERR XXZER|FEERXXYU Passo 4: Não há unificação nos primeiros 3 caracteres da janela de antevisão com a janela deslizante. Assim esta move-se 3 caracteres e aparecem 3 novos caracteres na janela de antevisão. TYGJJJASDERR XXZERFEE|RXXYURPP Há agora uma sequência de 3 caracteres RXX que unifica o padrão na janela de antevisão. Assim os três caracteres são substituídos por (12,3).... A saida, ignorando Os primeiros 20 caracteres é [(4,5),FEE,(12,3),....]. Durante a descompressão mantém-se o tamanho da janela deslizante mas a janela de antevisão é desnecessária. RYYXXZERTYGJJJASDERR XXZERFEE RYYXXZERTYGJJJASDERR|(4,5)

LZ78 Outra técnica base Usada por vários compressores de texto muito eficientes Em vez de uma janela deslizante de tamanho fixo como o LZ77 Constrói um dicionário com as strings que unificaram previamente. Não há restrições de distância no texto para unificação Aumenta a probabilidade de unificação

Exemplo 6.9 O texto a codificar é “PUB PUB PUPPY...” Mostre como se constrói o dicionário e os primeiros símbolos de saída do compressor. Passo 1: No princípio, o codificador arranca com o dicionário apenas com a tring nula. O primeiro caracter P é lido da entrada, não há unificação com o dicionário´e é considerado como a unificar com a string nula. Assim o codificador coloca na saída o índice correspondente 0 que corresponde à string nula e o caracter de sáida o P e adiciona a seguir a string à entrada com o índice 1. O segundo caracter ,U, é lido da entrada e novamente não há match no dicionário . O codificador dá novamente como índice 0, dá como saída U e adiciona ao dicionário com o índice 2. Passo 2: É lido o caracter seguinte P. Ele unifica com um frase existente no dicionário e a seguir é lido o próximo caracter ‘ ‘ no qual se cria uma nova frase sem unificação no dicionário. O codificador dá como saída o índice 1 e o caracter ‘ ‘. A string é então adicionada ao dicionários como entrada 3. Passo 3: É lido o próximo caracter. Ele unifica com uma frase existente no dicionário de forma que é lido o caracter seguinte U que cria uma nova frase não existente no dicionário. O codificador dá como sáida o índice 1 e o como caracter de sáida U. A string é adicionada ao dicionário como entrada 4.

Exemplo 6.9 Dicionário Saída Codificada Entrada do Dicionário String adicionada ao Dicionário Índice de saída Caracter Sáida “” 1 P 2 U 3 “P_” “_” 4 PU 5 B 6 “ “ “ “ 7 PUP 8 PY Y ... .... Passo 4: É lido o caracter seguinte B e não há unificação no dicionário. O codificador dá como saída o correspondente índice do dicionário 0 para a string nula e como caracter de sáida o B e a seguir adiciona a string ao dicionário como a entrada 5. O próximo caracter é ´_´ que não tem entrada no dicionário. Novamente o codificador dá como índice de saída o 0 e o caracter de saída como ´_´. Passo 5: Quando é lido o caracter P, ele unifica com frase do dicionário. Assim é lido o caracter seguinte; novamente ele unifica com frase do dicionário; é lido o caracter seguinte. Quando é lido o P não há unificação no dicionário o codificador dá como sáida o índice 4 que unifica com PU e dá como caracter de saída o P. A codificação continua com este procedimento. A string codificada para este exemplo é “0P0U1´ ´1U0B0´ ´P1Y......” O processo de descodificação é o inverso do processo de codificação e é bastante simples. Inclui apenas o processo de interpretação dos índices de saida e a daição de novas entradas de dicionário que é uma tarefa muito simples. Dicionário Saída Codificada

LZW Algorithm Este algoritmo evita a necessidade de transmitir o próximo caracter como no algoritmo LZ78. O dicionário é incializado como todos caracteres do alfabeto As novas frases são adicionadas ao dicionário acrescentadando o primeiro caracter das próximas frases O algoritmo é melhor descrito usando uma tie a b c Alphabet = (a,b,c) 1 2 3 b a c Text = abcabbcabba 4 5 6 b a 7 8 a 9 Trie Transmitted message = 1234571

Final Trie and its Height Balanced Binary Tree Text=abcabbcabba Text =a b.. ..b c.. a c b 1 2 3 4 a c b 1 2 3 4 5 a b c 1 2 3 ..c a.. ..ab . b.. ..bc a.. a c b 1 2 3 4 5 6 a c b 1 2 3 4 5 6 7 a c b 1 2 3 4 5 6 7 8 ..abb a 1 a c b 1 2 3 4 5 6 7 8 1 1 1 1 1 1 2 6 4 3 1 1 a Final Trie and its Height Balanced Binary Tree Transmitted Code= 1234571=‘001001100101010011000’ 9 7 5 8 9

Resumo Foram apresentadas várias técnicas de compressão sem perdas Baseadas na entropia Também usadas para áudio e imagem Baseadas em dicionário Usadas por muitos esquemas de compressão de texto para conseguir altas taxas de compressão