Armazenamento, Indexação e Recuperação de Informação
-
Upload
mario-monteiro -
Category
Data & Analytics
-
view
85 -
download
0
Transcript of Armazenamento, Indexação e Recuperação de Informação
Departamento de Eletrónica,
Telecomunicações e Informática
Armazenamento, Indexação e Recuperação de Informação
Trabalho Prático 3
Mestrado em Sistemas de Informação
Docente: Prof. José Luís Oliveira Discentes: Emanuel Pires – 77994
Prof. Sérgio Matos Mário Monteiro – 77910
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
2
Índice
INTRODUÇÃO......................................................................................................................... 3
DESENVOLVIMENTO .............................................................................................................. 4
ARQUITETURA E MODELAÇÃO .............................................................................................. 5
CORPUS READ ....................................................................................................................... 8
MEAN AVERAGE PRECISION.................................................................................................. 9
CONFIGURAÇÃO DO SOLR ................................................................................................... 10
APRESENTAÇÃO DO SISTEMA (FRONT-END) ........................................................................ 12
CONSIDERAÇÕES FINAIS...................................................................................................... 17
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
3
INTRODUÇÃO
Este relatório realiza-se no âmbito da unidade curricular da disciplina Armazenamento
Indexação e Recuperação de Informação do Mestrado em Sistemas de Informação da
Universidade de Aveiro, com o objetivo de fazer indexação de alguns documentos, recorrendo
há algumas tenologias como: Java, Apache Solr e o SolrJ, através de uma API que são
fornecidos pelo servidor do Solr.
Foi previamente definido algumas metas como sendo requisitos fundamentais para o
desenvolvimento deste trabalho, como por exemplo:
Índice do corpus utilizado a API SolrJ e o Corpus Read do trabalho 2. O índice deve conter
os seguintes campos:
o Nome do ficheiro original
o Identificador de documentos (composto pelo nome do ficheiro, Chapter ID, Speaker
ID)
o Conteúdo (o conteúdo do documento principal)
o Nome do Speaker
o Língua
o Data
o Ano
Definir campo de pesquisa padrão que inclui os campos de conteúdo e do Speaker. Definir
igualmente o esquema de indexação, a seleção, por exemplo, que analisador a utilizar para
cada campo, os campos que vão ser indexados. Por exemplo, armazenar a data como um
campo de data, para permitir buscas em intervalos.
A partir de uma lista de querys fornecido pelo professor, deve-se criar uma classe em java
que seja capaz de executa-los através de uma chamada ao servidor Solr. O resultado
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
4
devolvido pelo Solr, deve ser analisado com os resultados prévios devolvido pelo professor,
a fim de calcular o Mean Everage Precision.
Criar um sistema IR simples baseado na web com os seguintes requisitos:
o Pesquisa em campo, ou seja, permitir a pesquisa diferentes campos;
o Pesquisas por intervalo de data e ano;
o Criar Facete (nos campos de Speakear, Ano e de Idioma);
o Response Snippets;
o More like thi’s feature;
o Spelling suggestion ('Did you mean...?').
DESENVOLVIMENTO
O desenvolvimento deste trabalho prático levou-nos a utilizar algumas tenologias de base, assim
como foi sugerido pelo professor.
Java - Uma linguagem de programação e plataforma computacional lançada pela Sun
Microsystems em 1995. Esta linguagem está presente desde, laptops a datacenters, consolas de
jogos a supercomputadores científicos, telemóveis e muito mais. Ela encontra-se disponível de
forma gratuita na Internet no site java.com.
Como IDE de desenvolvimento foi escolhido o Netbeans 8.0.2. Este oferece-nos assistentes e
modelos que permitem a criação de aplicações Java EE, Java SE e Java ME.
Foi utilizado o Solr 4.10.2, para fazer indexação dos documentos, a parte do front-end, foi
desenvolvido através do framework SolrAjax (desenvolvido em javascrip).
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
5
ARQUITETURA E MODELAÇÃO
Foi dotado o modelo de classes Orientado a Objetos, para o desenvolvimento deste algoritmo .
Para uma melhor compreensão da estrutura de classes, é apresentado uma breve discrição dos
mesmos:
Library – Classe que incorpora um conjunto de métodos auxiliares que ajudam no
desenvolvimento do algoritmo;
CorpusRead – Classe responsável por fazer a leitura dos corpus, separar os CHAPTER
e SPEAKER, com finalidade de obter um corpus, de forma como foi especificado nos
requisitos do trabalho. Cada corpus pode conter um ou mais CHAPTER e cada
CHAPTER pode conter um ou mais SPEAKER. Quando processado um SPEAKER, a
classe tem a responsabilidade de fazer limpeza dos dados.
AveragePrecision – classe que é responsável por fazer tratamento dos resultados das
querys fornecida pelo professor, executar as querys através de uma chamada ao servidor
Solr e calcular o Mean Average Precision.
Executar – Classe responsável pela indexação, ou seja executar a classe CorpusRead e
inserir o corpus processado no Solr e fazer o Commit. Bem como calcular o Average
Precision.
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
6
A estrutura das classes é apresentada na figura 1 que se segue.
Assim como foi descrito acima, acerca das classes podemos ver na figura 2 o modelo que
descreve como é que essas classes trabalham para organizar os Corpus e inserir no Solr.
Figura 1 - Diagrama de Classes
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
7
Para realizar a operação de indexação foi fornecido um conjunto de documentos (corpus). O
algoritmo desenvolvido aplica sobre o corpus o princípio de divisão do corpus em segmentos,
ou seja cada novo corpus é extraído do excerto do que cada Speaker fala nas sessões no
parlamento.
Depois de realizar toda a operação de divisão dos ficheiros em Speaker e extrair as informações
importantes para realizar a indexação, é criada um documento de SolrInputDocument e
adicionado num ArrayList da mesma estrutura de dados e ao chegar a um determinado número
de documento processado é Inserido os dados no servidor Solr (HttpSolrServer) e realizado o
commit do mesmo e o processo se repete até ao último documento de corpus.
Para melhor compreender todo o processo foi criada o seguinte diagrama de fluxo de dados que
representa todo o algoritmo.
Figura 2 – Modo de leitura dos Corpus
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
8
Figura 3 – Diagrama de fluxo de dados da indexação invertida
CORPUS READ
Um dos requisitos do trabalho é criar uma classe capaz de fazer leitura de corpus e devolver o
conteúdo dos mesmos, analisando a estrutura do mesmo e removendo os caracteres especiais
existentes como tags HTML.
A leitura dos ficheiros é feita através da divisão de corpus em segmentos, cada corpus físico é
dividido em vários corpus, conforme o número de speakers de cada corpus, proporcionando
como resultado um corpus com menor quantidade de informação, mais em maior número.
A leitura de corpus é armazenada em estruturas de memória (ArrayList de SolrInputDocument),
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
9
MEAN AVERAGE PRECISION
De acordo com o que foi explicado mais acima na especificação das classes, para executar esta
tarefa, teve-se a necessidade de desenvolver uma classe que contém 3 métodos destintos,
com finalidade de calcular o Average Precision, classes essas que são:
solrResultQuery - método responsável por fazer execução de quera no Solr, recebe
como parâmetro (query – String fornecido pelo professor e conf – instanciação da classe
Conf que contém dados de configuração), este método retorna uma lista com dados
retornado através da execução da query Solr.
rearyQuery - Responsável por fazer leitura e parser dos dados fornecido, que se
encontram no ficheiro “query.txt”, o método recebe como parâmetro (fileName –
nome do ficheiro e charSet – codificação do ficheiro ex. utf-8 etc…), o método retorna
um HashMap, cuja chave é a query e o valor, uma lista com resultados referente a
mesma query.
calculateAveragePrecision - Faz cálculo de Average Precision recebe como parâmetro
(conf – instanciação da classe Conf que contém dados de configuração) e retorna os
resultados numa hashmap nome de cada query e o resultado calculado.
Depois de já ter descrito um pouco sobre a classe Average Precision, é apresentado na
tabela que se segui os resultados obtidos.
Query Resultado Everage Precision
Q1= {text: imigrantes} 0.33
Q2 = {text: presidente Barroso} 0.68
Q3 = {text: estratégia de lisboa ambiente e energias renováveis}
0.93
Q4 = {text: quota de pesca} 0.70
Q5 = {text: áreas estratégicas investigação e
desenvolvimento}
0.85
Mean Everage Precision 0.70
Tabela I – Resultados de Average Precision
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
10
CONFIGURAÇÃO DO SOLR
Um dos principais objetivos deste trabalho é a configuração do servidor Solr, o primeiro
requisito deste trabalho previa a configuração do Schema, de modo que se possa definir alguns
campos e tipo de dados, para isso foi possível definir os campos no schema do Solr da seguinte
forma:
name_of_file - type="text_pt" indexed="true" stored="true" termVectors="true";
document_identifier - type="string" indexed="true" stored="true" required="true";
content_corpus - type="string_corpus" indexed="true" stored="false";
speaker_name - type="string" indexed="true" stored="true";
language type="string" indexed="true" stored="true" termVectors="true";
date type="pdate" indexed="true" stored="true" termVectors="true";
Year - type="int" indexed="true" stored="true" termVectors="true" multiValued="true"
omitNorms="true";
Termos - type="text_pt" indexed="true" stored="true" multiValued="true";
Text - type="text_pt" indexed="true" stored="false" multiValued="true".
Pode ser analisado a configuração feita no Solr, através da imagem que se segue.
Figura 4 – Configuração do fields em schema Solr
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
11
Teve-se a necessidade de criar alguns outros campos a fim de ajudar no processamento de indexação e
pesquisa de informação, podemos ver estes campos na figura que se segue abaixo.
Figura 5 – Configuração do copyFields em schema Solr
Após ter definidos os campos é preciso definir os tipos em que foi definido para cada campo e a forma
como vai ser feita a indexação e pesquisa de dados no Solr. Para o processo de indexação como para
pesquisa de dados, é aplicado o processo de limpeza de StopWords e aplicado o Steamer, a fim de tratar
e normalizar os dados, podemos confirmar na figura que se segue.
Figura 6 – Configuração do fieldType em schema Solr
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
12
É importante realçar de que a configuração do Solconfig.xml foi feito no rute.js do framework
SolrAjax, deste modo não foi necessário ser feito no Solr, uma vez que tenhamos a configuração
no rute.js do SolrAjax, todas configurações passam a ser válidas visto que SolrAjax posiciona
numa camada intermediário com o Solr.
APRESENTAÇÃO DO SISTEMA (FRONT-END)
O desenvolvimento da front-end foi feito tendo em conta a utilização do framework SolrAjax,
este que é desenvolvido em javascript há alguns tempos, encontra-se disponível no seguinte
endereço: https://github.com/evolvingweb/ajax-solr. É uma livraria interessante pela sua forma de
interagir com o Solr, entretanto é uma pena que hoje não está sendo desenvolvido, pelo que a sua
documentação também é muito escasso.
O SolrAjax encontra-se estruturado da seguinte forma:
Core – É uma pasta onde se encontra os principais ficheiros de configuração;
Managers – faz toda gestão de chamada ao Solr através de configuração de url;
Webapp – onde encontra-se localizado propriamente dito a aplicação do front-end;
o Ruters – pode ser considerado como núcleo da aplicação front-end, é ali que se
faz todas configurações que supostamente iriam ser feitas no ficheiro
solrconfig.xml, caso optasse-mos por não usar uma livraria independe, é
configurado as facets, more like this, did you mean e entre outras;
o Widgets – pasta responsável por conter os widgets, que posteriormente irá ser
apresentado na página, ex. lista de facets, auto complete, apresentação de
resultado etc.
Depois de já conhecer um pouco sobre o SolrAjax, neste momento é preciso meter a mão na
massa e começar a desenvolver o módulo para front-end, assim sendo, tivemos que criar muitas
funcionalidades de raiz, pelo fato de que a livraria SolrAjax não estar completo.
Nesta etapa utilizamos como é óbvio as tecnologias como:
1. HTML 5;
2. Jquery (javascript);
3. CSS3;
4. Bootstrap.
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
13
Com o intuído de desenvolver uma página front-end, limpo, dinâmico e de fácil compreensão
para os utilizadores final.
Passa-se a apresentação da aplicação, mas concretamente a página inicial, na figura que se
segue.
Figura 7 – Página principal (front-end)
É apresentado os facets por língua, por termos e ainda por datas e ano, assim como foi
especificado nos requisitos mais acima, para uma melhor perceção é apresentado na figura que
se segue.
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
14
Figura 8 – Apresentação de facet por termos (front-end)
Figura 9 – Apresentação de facet por lingua (front-end)
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
15
Foi desenvolvido um método para fazer preenchimento automático de campo de pesquisa, com
o Auto complete, com aplicação de highlight de termos no momento em que a pesquisa é feita,
a demostração é apresentado na figura que se segue.
Figura 10 – Pesquisa com auto-complete e highlight (front-end)
Um outro requisito deste trabalho, é apresentação de sugestões caso o utilizador escrever uma
palavra estranha, assim sendo a aplicação irá se posicionar e apresenta uma palavra como
sugestão de uma pesquisa correta que supostamente o utilizador queria fazer, ver a figura que
se segue.
Figura 11 – Feedback did you mean (front-end)
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
16
Finalmente, falta realçar que a aplicação possibilita aos utilizadores fazer pesquisa em testo
livre, por intervalo de datas ou ainda por ano em que um documento foi publicado, apresenta-
se na figura que se segue.
Figura 12 – Pesquisa (front-end)
Armazenamento, Indexação e Recuperação de Informação – MSI – 2015/2016
Mário Monteiro - 77910 || Emanuel Pires - 77994
17
CONSIDERAÇÕES FINAIS
Este trabalho propôs-se como objetivo geral criar uma estrutura de indexação.
Este tempo pode ser melhorado muito ainda mais com um uma unidade de processamento e
memória maior, aumentando o número de corpos a processar a cada bloco de corpos.
Poderia se utilizar o multiprocessamento no processamento dos corpus e na inserção dos dados
de indexação no Solr, visto que com o multiprocessamento, enquanto e realizado a tarefa de
processamento dos corpus no Corpus Read os dados já tratados são inseridos no Solr.
Pensamos que os objetivos deste trabalho foram alcançados sem grandes sobressaltos,
entretanto como melhoria ficou por acrescentar uma pesquisa por intervalo de ano e
apresentação de highlight nos resultados obtidos, pois não foi possível ser apresentado a tempo,
devido ao fato de estarmos a trabalhar sob uma biblioteca que disponibiliza pouca
documentação.