Algoritmos e Estruturas de Dados II. Trabalho Prático 4

Documentos relacionados
Meu Google é melhor que o seu

Tabela Hash: Índice remissivo

Trabalho de LP 15/07/2013. Prof. Flávio Miguel Varejão

Trabalho Prático 2 Mundo dos Blocos Alocação Dinâmica / Listas Encadeadas

Indexação e Busca. O objetivo deste trabalho é projetar e implementar um sistema de programas para indexação e busca em arquivos de texto.

Lista de exercícios 2 Recuperação de Informação Textual

Algoritmos e Estruturas de Dados II. Trabalho Prático 3

Quinto Trabalho Prático. Este trabalho tem como objetivo indexar arquivos de dados usando um índice árvore-b.

WikED! Na última década, um grande número de sistemas colaborativos apareceram

CI218 - Trabalho - 2 o sem/2016

Máquinas de Busca. Estruturas de Dados II Prof. a Mariella Berger. 1. Objetivo

Segundo trabalho de Organização e Recuperação da Informação FACOM- UFU Professor: Wendel Melo

1 Introdução. 2 Especificação

Victor Hugo Andrade Soares monitor João Vitor dos Santos Tristão Primeiro Trabalho Prático

Abaixo seguem os comandos e suas particularidades, bem como exemplos para o indicador de linha

1 OBJETIVOS 2 HORÁRIO DE AULAS 3 PROGRAMA

Sistema Rodoviário Tabajara

Edital de Seleção 055/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

1. Faça um programa que leia uma string digitada pelo usuário e salve em um arquivo em branco.

Linguagem C vetores. IF61A/IF71A - Computação 1 Prof. Leonelo Almeida. Universidade Tecnológica Federal do Paraná

MC3305 Algoritmos e Estruturas de Dados II. Aula 02 Hashing. Prof. Jesús P. Mena-Chalco.

Problema do Caminho Hamiltoniano

Primeiro trabalho de Organização e Recuperação da Informação

Quarto Trabalho Prático. Este trabalho tem como objetivo indexar arquivos de dados usando um índice simples ou linear. Descrição de páginas de disco

Pré-Processamento de Documentos

Working 05 : Modularização

Descrição do Algoritmo LZ77

Edital de Seleção 032/2016 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Árvores. Fabio Gagliardi Cozman. PMR2300 Escola Politécnica da Universidade de São Paulo

Busca em Memória Primária Estrutura de Dados II

Busca em Memória Primária Estrutura de Dados II

Gerando um programa executável a partir de um módulo Python

Variáveis Compostas Homogêneas Vetores

Algoritmos e Estruturas de Dados II. Trabalho Prático 2

Programação: Vetores

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

O que é um jogo digital?

Algoritmos e Programação

Segundo trabalho de Organização e Recuperação da Informação

Departamento de Informática PUC-Rio INF Estruturas de Dados Lista 2 Completa (Gerada em 8 de maio de 2006)

Técnicas de análise de algoritmos

Algoritmos e Estruturas de Dados II. Trabalho Prático 1

Lista de Exercícios 04

Introdução à Computação II (Noturno) BCC Unesp Rio Claro/SP 2015 em PDF via Moodle: Escolha apenas 5 exercícios para entrega Exercício 01 (Pilhas)

Trabalho Prático. Descrição do arquivo de dados

Lista de Exercícios sobre Listas Implementadas por Encadeamento

Web site. Profa. Patrícia Dockhorn Costa.

Este trabalho tem como objetivo praticar o uso de tipos abstratos de dados e estruturas do tipo Lista.

Não utilize caracteres acentuados ou especiais para nomes de pastas e arquivos.

Trabalho Prático 2015 Simulador de Circuitos Opção 1 Versão /11/2013

Segundo trabalho prático de implementação Sistema de reserva de assentos

Arquivos invertidos 39

MAC0328 Algoritmos em Grafos. Make

Edital de Seleção 024/2017 PROPESP/UFAM. Prova de Conhecimento. Caderno de Questões

Aula 1 Conceitos Básicos

Compiladores. Conceitos Básicos

Banco de Dados Profa. Dra. Cristina Dutra de Aguiar Ciferri. Banco de Dados Processamento e Otimização de Consultas

CMP Técnicas de Programação 2 a Lista de Exercícios - Passagem de parâmetros por referência e ponteiros Max Gontijo de Oliveira

Programação Aplicada de Computadores. Trabalho 1 Freecell

Terceiro Trabalho Prático. Este trabalho tem como objetivo ordenar um arquivo de dados e implementar as operações cosequenciais de merging e matching.

SIMULAÇÃO DE MÁQUINA DE REGISTRADORES COM MÁQUINA DE TURING MULTIFITA

Universidade Federal de Goiás Bacharelado em Ciências da Computacão Compiladores

Primeira Parte do Trabalho Prático (Parte I) Valor: 30% Descrição do arquivo de dados

Estruturas de Dados Aula 1: Introdução e conceitos básicos 28/02/2011

Árvores. Thiago Martins, Fabio Gagliardi Cozman. PMR2300 / PMR3201 Escola Politécnica da Universidade de São Paulo

Compiladores. Motivação. Tradutores. Motivação. Tipos de Tradutores. Tipos de Tradutores

Segunda Parte do Trabalho Prático (Parte II) Valor: 70%

Ambiente de desenvolvimento

Compiladores. Análise Léxica

2 Versão 1: Funcionalidade Básica e Interface Web

1 TECNOLOGIA ELEMENTAR CAPÍTULO 4 E-books PCNA. Vol. 1 TECNOLOGIA ELEMENTAR CAPÍTULO 4 ROTINAS DE REPETIÇÃO. Página 1

Universidade Federal de Mato Grosso do Sul. Implementação de um Sistema Simplificado de Memória Cache

MAC-115 Introdução à Computação para Ciências Exatas e Tecnologia IO Terceiro Exercício-Programa Entregar até 09/11/2007

Listas Estáticas. SCC Algoritmos e Estruturas de Dados I. Prof. Fernando V. Paulovich. *Baseado no material do Prof.

Estruturas de Dados II. Caixeiro Viajante

Exercícios: Vetores e Matrizes

Métodos de Ordenação Parte I

DGPAPP Tutorial. Introdução. Daniel Centeno Einloft Vinicius Meirelles Pereira. 20 May 2014

INF 1620 P4-09/07/03 Questão 1 Nome:

Slide 01 16/03/2017. Estruturas de Dados. Prof. Cleziel Franzoni da /Cleziel.

Linguagem C Princípios Básicos (parte 1)

Resolução de Problemas com Computador. Resolução de Problemas com Computador. Resolução de Problemas com Computador

Compiladores Prof. a Mariella Berger. Trabalho 3 Analisador Semântico

Algoritmos e Introdução à Programação. Lógica e Linguagem de Programação

BCC202 - Estrutura de Dados I

Aula T19 BCC202 Pesquisa (Parte 1) Pesquisa Binária. Túlio Toffolo

SSC Linguagem de Programação e Aplicações

Aula 15: Pesquisa em Memória Primária. Bruno Hott Algoritmos e Estruturas de Dados I DECSI UFOP

INF P4-12/12/09 Questão 1 Nome:

Trabalho de LP - C++ 19/05/2014. Prof. Flávio Miguel Varejão. I. Descrição do Problema

Aula 4 Introdução ao C

Algoritmos e Estruturas de Dados I (DCC/003) Introdução à Programação de Computadores. Aula - Tópico 1

29/04/2015. Trabalho de Programação 3. Prof. Flávio Miguel Varejão. I. Descrição

Requisitos para entrega. Projeto Programa 1 Cálculo de Médias Descrição do Projeto

Etapa III - Implementação de Operadores da Álgebra Relacional; Etapa IV - Comparação experimental de varredura sequencial x acesso aleatório

Algoritmos e Programação

Linguagem Técnica I. Prof. Jonatas Bastos

Segunda Parte do Trabalho Prático (Parte II) Valor: 60% Descrição do índice

Transcrição:

Algoritmos e Estruturas de Dados II Trabalho Prático 4 Entrega: 23/11/09 Devolução: 10/12/09 (sem possibilidade de entrega com atraso) Trabalho em dupla Prof. Jussara Marques de Almeida Problema 1: Construção de Índice Invertido para Máquinas de Busca A base para o funcionamento de uma máquina de busca, tais como Google e Yahoo!, é a construção de um índice invertido para uma coleção de documentos. Dada a coleção de documentos, um índice invertido é uma estrutura contendo uma entrada para cada palavra (termo) que aparece em pelo menos um documento. Esta entrada associa à palavra pares do tipo <count, doc_id>, onde doc_id identifica um documento e count é o número de vezes em que a palavra em questão apareceu no documento doc_id. Documentos que não contém a palavra não precisam ser indicados. Como exemplo, suponha uma coleção com apenas os dois documentos seguintes: Quem casa quer casa. Porem ninguem casa. Ninguem quer casa tambem. Quer apartamento. Ninguem em casa. Todos sairam. Todos. Quer entrar? Quem? Quem? Supondo os identificadores 1 e 2 para e, respectivamente, o índice invertido seria: apartamento 1 1 casa 4 1 1 2 em 1 2 entrar 1 2 ninguem 2 1 1 2 porem 1 1 quem 1 1 2 2 quer 3 1 1 2 sairam 1 2 tambem 1 1 todos 2 2

Note que, adacente a cada palavra do índice está uma lista de pares de números representando ocorrências da palavra nos documentos. O primeiro número de cada par representa o número de vezes que a palavra ocorre em um documento e o segundo representa o identificador do documento em questão. Note que a lista está ordenada por identificadores de documentos. Proete um sistema para produzir um índice invertido. Para facilitar, este sistema deve receber como entrada o nome de um arquivo entrada.txt com formato: N arquivo3.txt... arquivon.txt A primeira linha deste arquivo contém um número N que representa o número de documentos da coleção. Cada linha a seguir contém o nome do arquivo que contém um dos documentos da coleção. No exemplo acima, há N documentos que estão armazenados nos arquivos,,..., arquivon.txt. Você pode assumir que estes arquivos, caso existam (você precisa testar), estarão no diretório corrente de execução. O sistema deverá processar cada um dos arquivos, lendo palavra após palavra e construindo o índice invertido. Ele deverá também associar a cada documento um doc_id único e associar, em memória, este identificador com o nome do documento. Para extrair as palavras de um texto, você pode utilizar o procedimento ExtraiPalavras mostrado na página 205 do livro ``Proeto de Algoritmos, Nívio Ziviani. Cabe ressaltar que: a) Uma palavra é considerada como uma sequência de letras e dígitos, começando com uma letra. Portanto, ignore sinais de pontuação. Você pode assumir que os textos não terão acentuação. b) Palavras com letras em maiúsculas devem ser primeiramente transformadas para minúsculas antes da inserção no índice. Desta forma, a mesma palavra apresentada com letras minúsculas ou maiúsculas não serão diferenciadas. c) Apenas os primeiros C caracteres devem ser retidos nas chaves. Assim, duas palavras que não diferem nos primeiros C caracteres são consideradas idênticas. Assuma que C é um parâmetro de entrada do seu programa, e que ele pode assumir valores iguais ou superiores a 20. d) Palavras constituídas por menos do que C caracteres devem ser preenchidas por um número apropriado de brancos.

e) Uma palavra pode ocorrer múltiplas vezes na mesma linha de um documento, ou mesmo em múltiplas linhas de um mesmo documento. Organize o seu código da seguinte maneira. O sistema para construção de índice invertido deverá ser chamado como um procedimento (p.ex: CriaIndiceInvertido) pelo programa principal. Ou sea, além de operações de inicialização, o seu programa principal (versão 1) deve chamar a operação CriaIndiceInvertido, a partir da qual a construção é realizada. Você fica responsável por criar coleções de documentos para testes. Submeta unto com o seu trabalho (no pacote zip) de coleção usada. Soluções a Serem Apresentadas: Para implementar a operação CriaIndiceInvertido, o seu programa deve utilizar as operações do Tipo Abstrato de Dados Dicionário. Você deve implementar QUATRO (4) versões do TAD Dicionário: 1. hash aberto (como dado em sala de aula) 2. hash aberto utilizando duas funções hash para resolução de conflito 3. hash com resolução de conflito via árvore binária sem balanceamento 4. árvore Patrícia Para o TAD 2, você deverá utilizar duas funções hash, h1 e h2: h2 deverá ser utilizada para resolução dos conflitos de h1, enquanto que os conflitos gerados por h2 deverão ser resolvidos como no hash aberto tradicional. Note que h1 deve ser a mesma função utilizada no TAD 1 (hash aberto simples), para fins de comparação. Sugestão: passe como parâmetro da operação CriaIndiceInvertido um indicador de qual TAD ela deve utilizar. Por exemplo, utilize os códigos 1 (HASHABERTOSIMPLES), 2 (HASHABERTOCOMPOSTO), 3 (HASHARVORE), 4 (PATRICIA), conforme a descrição acima. O seu programa deve ser instrumentado para medir o desempenho, em termos do tempo de execução e do consumo de memória, de cada um dos TADs para diferentes cenários. Utilize contadores bem como chamadas do sistema para medições das estatísticas solicitadas. Execute diversos experimentos, variando a entrada e o tamanho M da tabela hash. Problema 2 : Consultas sobre o Índice Invertido. Nesta parte do proeto, você utilizará o índice invertido construído utilizando o TAD 2 (HASHABERTOCOMPOSTO) para realizar consultas de um ou mais termos. O obetivo é, dado uma consulta, retornar uma lista de documentos, ordenados (em ordem decrescente) pela relevância para a consulta. Existem vários métodos de estimar a relevância de documentos de uma coleção para uma consulta. Vocês utilizarão um simples, baseado na frequência dos termos da consulta em cada documento (TF term frequency) da coleção bem como na frequência inversa dos documentos (IDF inverse document frequency). O componente IDF estima o quão bem um termo auda a

discriminar os documentos entre relevantes e não relevantes: um termo que aparece em muitos documentos (valor de IDF baixo) não é um bom discriminador, enquanto que um termo que aparece em poucos documentos (IDF alto) é um bom discriminador dos mesmos. Em outras palavras, dada uma consulta com q termos, t 1, t 2,..., t q, a relevância de um documento i, r(i), é computada como: 1 r( i) = n i q = 1 i w onde n i é o número de termos distintos do documento i e w i é o peso do termo t no documento i, que é calculado como: w i = f i log( N) d onde f i é o número de ocorrências do termo t no documento i, d é o número de documentos na coleção que contém o termo t e N é o número de documentos na coleção. Se o termo t não aparece no documento i, f i = 0. No exemplo dado acima, uma consulta quer todos : dois termos (q = 2): quer e todos há dois documentos: N = 2 o o documento 1 tem 7 termos : n 1 = 7 o o documento 2 tem 8 termos : n 2 = 8 o número de ocorrências do primeiro termo - quer - no documento 1 é 3 e no documento 2 é 1, logo f 1 1 = 3 e f 2 1 = 1. Além disto d = 2. o w 1 1 = 3*log(2)/2 = 1.5 o w 2 1 = 1*log(2)/2 = 0.5 o número de ocorrências do segundo termo todos - no documento 1 é 0 e no documento 2 é 2, logo f 1 2 = 0, f 2 2 = 2 e d = 1 o w 1 2 = 0*log(2)/2 = 0 o w 2 2 = 2*log(2)/2 = 1 Logo, as relevâncias dos documentos pra esta consulta são: o r(1) = 1/7 *( 1.5 + 0) = o r(2) = 1/8 *( 0.5 + 1) = o você deve retornar a lista de documentos Crie um novo programa que estenda o sistema criado para, além de realizar a operação CriaIndiceInvertido, inclua também as seguintes operações, a serem executadas sobre o índice invertido construído:

a) Realizar consultas com um ou mais termos: deve retornar uma lista com os nomes dos documentos, ordenada pela relevância dos mesmos para a consulta dada. Esta lista não deve conter documentos cua relevância (como calculado acima) estea abaixo de um limiar L (parâmetro do seu sistema). b) Imprimir o índice invertido: imprime as palavras em ordem alfabética, uma por linha. À frente de cada palavra, você deve imprimir a lista das ocorrências, ordenada pelo índice do documento. Para cada elemento da lista, você deve imprimir o nome do documento (e não o identificador) e o número de ocorrências da palavra no documento. Construa um novo programa principal. Diferentemente do programa anterior, este deve ser interativo, isto é, deve permitir ao usuário, primeiramente, solicitar a construção do índice remissivo, fornecendo conunto de palavras e texto, para em seguida permitir a execução de uma ou mais das operações acima. Organize o seu código de forma que: as implementações relativas a cada TAD esteam em arquivos diferentes, um para cada TAD. as operações sobre os índices remissivos inclusive a operação de criação esteam em um arquivo separado. o programa principal (main em C) relativo ao Problema 1 estea em um arquivo separado. Chame-o, por exemplo, de maincriacao. o programa principal (main em C) relativo ao Problema 2 estea em um outro arquivo. Chame-o, por exemplo, de mainsistema Crie um arquivo Makefile e utilize o utilitário make para compilação e geração de código executável automaticamente. Crie uma opção runall no seu Makefile que dispara todas as compilações necessárias, gerando ao final os dois executáveis, maincriacao e mainsistema, para um dado TAD. As regras para realização e entrega do trabalho estão disponíveis no site da disciplina. Além das informações listadas nessa página, a documentação deste trabalho deverá conter também: uma descrição das estruturas de dados uma descrição da instrumentação realizada um estudo comparativo do desempenho relativo dos vários TADs nos diferentes cenários avaliados, considerando as duas estatísticas: tempo de execução e consumo de memória. Para tanto, apresente gráficos e tabelas com as estatísticas coletadas para os diferentes valores de M avaliados. Discuta os resultados na luz da teoria apresentada em sala de aula. Em particular: quais são os compromissos de desempenho observados?ou, em outras palavras, quais algoritmos apresentaram melhores resultados para cada cenário? uma descrição da sintaxe e semântica das operações implementadas estudo da complexidade das operações de cada TAD. estudo da complexidade das operações sobre o índice invertido, considerando, separadamente, cada TAD. Submeta o seu Makefile untamente com os demais arquivos, no pacote zip.