sumário

Propaganda
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ
CAMPUS DE CURITIBA
CURSO DE ENGENHARIA DE COMPUTAÇÃO
BRUNNO BRAGA
BRUNO WEINGRABER
TELMO FRIESEN
BUSCADOR OPEN SOURCE DE ARTIGOS – TB²uscador
CURITIBA
2007
ii
BRUNNO ALBERTO BRAGA
BRUNO WEINGRABER
TELMO FRIESEN
BUSCADOR OPEN SOURCE DE ARTIGOS: TB²uscador
Trabalho acadêmico apresentado à disciplina
Oficina de Integração, como requisito parcial
para
obtenção
de
nota
no
Curso
de
Engenharia de Computação da Universidade
Tecnológica Federal do Paraná.
Orientadores: Prof. Arandi Ginane Bezerra Jr.
Prof. Gustavo Alberto Gimenez Lugo
Prof. Luiz Ernesto Merkle.
CURITIBA
2007
iii
BUSCADOR OPEN SOURCE DE ARTIGOS: TB²uscador
BRUNNO ALBERTO BRAGA
BRUNO WEINGRABER
TELMO FRIESEN
Aprovada em ____/____/_____.
BANCA EXAMINADORA
_________________________________________________
Nome Completo (orientador)
Titulação
Instituição
_________________________________________________
Nome Completo
Titulação
Instituição
_________________________________________________
Nome Completo
Titulação
Instituição
CONCEITO FINAL: _____________________
iv
SUMÁRIO
INTRODUÇÃO ................................................................................................... 01
CAPÍTULO I – Problema de Pesquisa .............................................................. 02
CAPÍTULO II - Hipótese ..................................................................................... 03
CAPÍTULO III - Justificativa ............................................................................... 04
CAPÍTULO IV - Objetivos ................................................................................... 05
CAPÍTULO V – Fundamentação Teórica .......................................................... 06
5.1 Teoria de Busca. ...................................................................................... 06
5.1.1 O mecanismo de busca (Crawler-Based Search Engines) ........... 06
5.1.2 Diretórios (Human-Powered Directories) . ...................................... 07
5.1.3 Diferenças entre mecanismo de busca e diretórios ..................... 07
5.2 Lucene ............................................................................................. 08
5.3 Nutch ............................................................................................... 12
5.3.1 Funcionamento.......................................................................... 12
5.3.1.1 Crawler..................................................................... ...................13
5.3.1.2 Searcher.....................................................................................14
CAPÍTULO VI – TB²uscador...............................................................................15
6.1 Passos do Projeto....................................................................................20
CONCLUSÃO ..................................................................................................... 22
REFERENCIA BIBLIOGRÁFICA ........................................................................ 23
ANEXOS,,,,,........................................................................................................25
v
RESUMO
Atualmente, com o advento da Web, os trabalhos escolares perderam e
muito na qualidade devido à falta de pesquisa por parte dos alunos e a falta
de fontes confiáveis. Uma forma de despertar o interesse dos alunos é um
projeto que recomende e busque artigos relevantes ao tema discutido,
denominado Nuts. Desta forma, a população teria uma importante ferramenta
open source que varreria a internet em busca de artigos a respeito do
assunto proposto pelo usuário. Para alcançar este objetivo, foi utilizado como
base um programa desenvolvido em java, o Nutch. Ele é ba seado no Lucene,
um Frame Work inteiramente escrito em java para busca e indexação de
textos. O projeto consiste em um programa que recebe o tema do usuário e
utiliza o Nutch para realizar a pesquisa. Ao contrário dos atuais oligopólios de
buscas, que visam seus interesses comerciais, o Nuts oferece uma
alternativa transparente aos sistemas comerciais de localização na web.
Todos os principais sistemas de localização existentes têm fórmulas de
ranking próprias e não vão explicar porque foi dado um ranking a um
determinado
resultado.
Além
disso,
alguns
sistemas
de
localização
determinam em que locais posicionar os resultados baseados mais em
pagamentos do que nos méritos deles mesmos. Ao contrário disso, um
programa open source não tem nada a esconder e nenhu m motivo para
direcionar seus resultados de nenhuma maneira exceto o de tentar dar a
cada usuário os melhores resultados possíveis.
vi
LISTA DE ILUSTRAÇÕES
FIGURA 1 Fluxo do processo de indexação no Lucene............................ .....09
FIGURA 2 Exemplo de código para Indexação usando o Lucene.............................10
FIGURA 3 Arquivo nutch-site.xml configurado ..........................................................14
FIGURA 4 Exemplo de código usando a API do Nutch.............................................15
FIGURA 5 Programa TB²uscador...............................................................................16
FIGURA 6 Pesquisa no TB²uscador...........................................................................17
FIGURA 7 Menu Configuration...................................................................................18
FIGURA 8 Menu Crawl...............................................................................................20
FIGURA 9 Diagrama de classes................................................................................25
1
INTRODUÇÃO
Em toda história humana, para se realizar um trabalho de pesquisa
cientificamente
relevante
são
necessárias
referências
bibliográficas
confiáveis. Com a vinda da internet atualmente, os estudiosos possuem mais
uma importante ferramenta para pesquisa, os famosos sites de busca .
Porém, muitos destes levam em questão os interesses econômicos na
formulação da ordem de sites dispostos no retorno da pesquisa feita pelo
usuário.
Portanto, este projeto consiste na implementação de um programa de
código-aberto (open source) que realize buscas na rede WWW (World Wide
Web) e forneça um retorno justo para a pesquisa, de acordo com a relevância
da fonte de pesquisa. Na construção deste, foi utilizado o Nutch, um
programa open source desenvolvido pela Apache Software Foundation, que
faz a busca em escala mundial e local (intranet).
Pretende-se, com este projeto, fornecer à população uma ferramenta
de fácil uso, que encontre as muitas fontes de qualidade a respeito do tema
apresentado pelo usuário e, desta forma, ajudá-los com suas pesquisas
científicas.
Foi escolhido este tema de estudo, pois esta é uma área de interesse
da equipe, e assim pretende-se aprimorar o conhecimento em programação e
sistemas
de
busca.
2
CAPÍTULO I - PROBLEMA DE PESQUISA
Antigamente, para se realizar uma pesquisa o estudante certamente ia
em busca de livros e revistas, as quais eram as principais referências (foi
desta forma que surgiu o termo “bibliografia”, referências de livros). Com a
popularização mundial da internet atualmente, há mais uma opção para a
busca de fontes de pesquisa, as páginas na internet. Estas são de grande
magnitude, devido à facilidade de busca por referências e a vasta área de
conteúdo disponibilizado na rede.
Para facilitar ainda mais este processo de busca na rede, foram
implementadas diversas ferramentas que realizam este serviço, como é o
caso do Google e do Alta Vista, por exemplo. Estas recebem o tema do
usuário e varrem a rede em busca de artigos relacionados. Porém, estas
ferramentas possuem critérios de ordem que dizem respeito a interesses
econômicos, e não somente ao conteúdo disponibilizado pelo site.
Este é um problema grave, pois muitos sites que possuem um vasto
conteúdo relevante ao tema proposto não são encontrados devido a
interesses econômicos dos oligopólios de busca. Desta forma, estudos e
trabalhos escolares são prejudicados, pois faltam referências confiáveis na
internet para aprimorá-los.
Como se pode modificar esta atual situação? Qual seria uma hipótese
relevante para solucionar este problema que atinge a população mundial?
3
CAPÍTULO II - HIPÓTESE
Como uma tentativa de solucionar este problema, este projeto consiste
em um programa open source que busca referências de pesquisa, e que
estas estejam ordenadas com o critério de relevância ao tema proposto pelo
usuário, sem interesses comerciais em jogo.
Denominado
NUTS,
o
programa
é
baseado
numa
importante
ferramenta de busca, o Nutch. Ele, por sua vez, é baseado no Lucene, um
frame work escrito em java para busca e indexação de artigos. Ambos foram
desenvolvidos pela Apache Software Foundation e seus funcionamentos
serão aprofundados em seguida.
4
CAPÍTULO III - JUSTIFICATIVA
Com este software, os alunos e usuários em geral teriam fontes de
pesquisa confiáveis, ordenadas de acordo com o grau de relevância para com
o tema proposto, e não utilizando como critérios interesses econômicos. Este
projeto visa beneficiar todos os estudantes para a realização de pesquisas
científicas, proporcionando a estes referências consistentes e livres de
interesses para benefício próprio.
Esta preocupação é demonstrada também pela Apache Software
Foundation (2006), a qual afirma:
Apesar do número de sistemas de localização na web estarem diminuíndo,
a localização na web é um requisito básico para a navegação na internet.
Os atuais oligopólios poderão, em breve, vir a tornar monopólios, tendo
uma
única
empresa
controlando
praticamente
todo
o
sistema
de
localiazção na web, visando seus interesses comerciais. Isso não seria
bom para os usuários da internet.¹
Além de ser uma solução para o problema de referências, este projeto
possibilita um avanço teórico-prático com relação à programação em
linguagem java, orientação a objetos e principalmente na área da Teoria de
Busca.
1 APACHE SOFTWARE FOUNDATION. Disponível em:
< http://lucene.apache.org/nutch/docs/> Acesso em: 31 out. 2007.
5
CAPÍTULO IV – OBJETIVOS
O principal objetivo deste projeto é o de fornecer ajuda aos estudantes
para a confecção de pesquisas escolares, teses de mestrado e trabalhos
científicos em geral, apresentando importantes e referências relevantes de
pesquisa na internet. Para que se alcance este objetivo geral, é necessária
uma ferramenta open source, de interface simples, para busca de artigos
científicos.
Ao ler e se aprofundar em determinado assunto, o estudante formará
uma opinião própria a respeito do mesmo, e não desta forma não precisará
mais seguir o raciocínio e a visão de outros, ou seja, o seu senso crítico é
aprofundado.
6
CAPÍTULO V – FUNDAMENTAÇÃO TEÓRICA
5.1 Teoria de Busca
Uma ferramenta de busca é um programa que auxilia a encontrar
informações armazenadas na World Wide Web, numa rede local ou em uma
computador pessoal. O usuário faça a pesquisa (geralmente uma frase ou
palavra) e este retorna uma lista de links relevantes ao tema proposto.
Um sistema de busca é um conjunto organizado constituído de computadores,
índices, bases de dados e algoritmos. Todas estas questões são reunidas com a
missão de analisar e indexar as páginas da Web, armazenar estes resultados numa
base de dados e, quando for feita uma busca, o sistema irá procurar a pesquisa
realizada em sua base de dados e fornecerá os resultados ao usuário do sistema de
busca.
O sistema de busca é o termo genérico que engloba duas categorias:
os mecanismos de busca (Crawler-Based Search Engines) e os diretórios
(Human-Powered Directories). Os mecanismos de busca, como o Google, são
os sistemas de busca baseados no uso exclusivo de programas de
computador para a indexação das páginas da web automaticamente. Se uma
página for modificada, o mecanismo de busca encontra esta mudança . Já os
diretórios são os sistemas de busca nos quais a indexação das páginas da
web é realizada por humanos.
5.1.1 O mecanismo de busca (Crawler-Based Search Engines)
O
mecanismo
de
busca
é
formado
principalmente
por
três
componentes:
- um programa denominado crawler, o qual acessa as páginas web e
faz uma cópia do conteúdo textual desta. Esta cópia será armazenada em
sua base de dados.
- a base de dados que é formada pelas cópias que o crawler realizou.
Esta fica armazenada no computador, o qual também, é chamado de servidor
do mecanismo de busca.
7
- o programa de busca, o qual é acionado quando o usuário realiza uma
pesquisa. Este então percorre a base de dados em busca das URLs que
contém a palavra ou frase pesquisada. Logo após, estes links são retornados
ao usuário.
Para criar a base de dados de um mecanismo de busca, o crawler
acessa os sites da web. Ao passar pelas páginas de cada site, ele anota as
URLs existentes nestas para depois acessá-las. Portanto, visitar as páginas
web, fazer a cópia e o armazenamento na base de dados do que ele
encontrar nesses sites é uma das formas de um mecanismo de busca
encontrar os sites na web. Uma outra maneira é o proprietário do site
informar ao mecanismo de busca sua URL.
5.1.2 Diretórios (Human-Powered Directories)
Os diretórios são formados por dois componentes principais: a base de
dados e o buscador que realiza a pesquisa.
A análise, indexação das páginas e armazenamento destas na base de
dados é realizada por humanos, e não por programas (crawler) como no
mecanismo de busca. Ao contrário dos mecanismos de busca, que copiam
todo o conteúdo das páginas que encontram pela frente e armazenam isto em
suas bases de dados, os diretórios armazenam somente um resumo do
conteúdo do site catalogado em sua base de dados. Muitas vezes esse
resumo que fica na base de dados do diretório contém, apenas, o título do
site mais duas ou três frases sobre o assunto nele contido. Esse resumo
tanto pode ser elaborado pelo autor da página ou por quem a submete como
por um editor, dependendo do diretório.
5.1.3 Diferenças entre Mecanismos de Busca e Diretórios
Ambos têm a mesma finalidade, que é a indexação e a recuperação de
páginas da web. Porém, existem duas diferenças fundamentais entre os
diretórios e os mecanismos de busca.
Uma diferença é a maneira de o diretório encontrar na web os sites a
serem por ele indexados. No mecanismo de busca, o crawler vai acessando
8
os sites na internet mundial. Já o diretório espera que o usuário ou o dono do
site apresente a página a ele.
Porém, a principal diferença entre eles é que nos d iretórios, são
humanos que constroem suas bases de dados e analisam as páginas a
serem indexadas nesta. É você que deve informar ao diretório o título, o URL, a
descrição do conteúdo e a categoria a que o site pertence.
Seja utilizando mecanismos de busca ou diretórios, vale destacar que
ao realizar uma pesquisa, você não está pesquisando diretamente a web,
mas sim uma base de dados localizada num site da web. Nessa base de
dados, encontra-se uma cópia dos sites e páginas existentes na web, como
se fosse uma fotografia do site.
Outro ponto relevante é que nenhum sistema de busca tem em sua
base de dados toda a Wweb catalogada, todas as 1 bilhão de páginas.
5.2 Lucene
Uma ferramenta extremamente útil para indexação de textos com alta
performance é o Lucene, desenvolvido inteiramente em Java pela Apache
Software Foundation. Isso torna possível executar buscas de qualquer dado
que possa ser transformado em texto. O recurso pode ser aplicado para, por
exemplo, localizar palavras inclusive em documentos PDF, que anteriormente
foram transformados em textos e indexados pelo Lucene. O Lucene também
suporta outras linguagens além do Java, como C, C++, Delphi, C#, PHP e
Ruby.
O processo de indexação possui uma fase de análise e transformação
do documento em questão para arquivo de texto puro (txt). Esta passo é
realizado a partir da classe Analyser, que possui as devidas regras para este
processo de retirada do conteúdo. Porém, existem várias implementações
desta
classe
Analyser
que
fazem
este
trabalho.
Uma
delas
é
a
BrazilianAnalyser, que contém as stopwords portuguesas. Stop words são
palavras irrelevantes para o nosso índice. Por isso, nada impede que você
crie o seu Analyser com as suas próprias stop words.
9
O passo seguinte é a organização do índice, que será acessado
futuramente em pesquisa, já que o Lucene possui classes que defi nem a
estrutura interna do sumário a ser gerado.
A seguir outras classes importantes do Lucene:
- Document: A classe Document é responsável pela indexação e
pesquisa, que permite armazenar campos (Fields).
- Fields: um field pode somente ser armazenado em um Document,
pois possui como característica um nome e um valor. Desta forma, é
impossível armazenar dois Fields com o mesmo nome em um documento.
Porém, um documento pode ter mais de um Fields.
- Directory: a classe Directory é responsável por indicar onde está o
índice. O armazenamento dos Documents é feito no Directory.
Na ilustração do fluxo do processo de indexação no Lucene o processo
fica mais claro:
Figura 1 – Fluxo do processo de indexação no Lucene
- IndexWriter: o IndexWriter é o responsável pela criação do índice, ao
qual, através desta classe, pode-se adicionar Documents.
- IndexSearcher: tem o papel de executar a busca no índice.
10
- Query: é através do objeto Query que os critérios de busca são
passados para a função de busca do Searcher.
- TermQuery: o objeto Query é construído através da TermQuery, para
o qual passamos como parâmetro o nome do campo a ser procurado e o valor
que ele contém.
Segue um exemplo simples de Indexação:
1 import java.io.FileInputStream;
2 import java.io.FileReader;
3 import java.io.IOException;
4 import org.apache.lucene.analysis.Analyzer;
5 import org.apache.lucene.analysis.standard.StandardAnalyzer;
6 import org.apache.lucene.document.Document;
7 import org.apache.lucene.document.Field;
8 import org.apache.lucene.index.IndexWriter;
9 import org.apache.lucene.store.Directory;
10 import org.apache.lucene.store.FSDirectory;
11
12 public class Main {
13
public static void main(String[] args) {
14
Document document = new Document();
15
try {
16
FileInputStream arquivo = new
FileInputStream("c:/arquivo.txt");
17
Directory directory =
FSDirectory.getDirectory("c:/indice", true);
18
Analyzer analyzer = new StandardAnalyzer();
19
IndexWriter writer = new IndexWriter(directory,
analyzer, true);
20
document.add(new Field("arquivo",
"c:/arquivo.txt",Field.Store.YES, Field.Index.NO));
21
document.add(new Field("conteudo", new
FileReader(arquivo.getFD())));
22
writer.addDocument(document);
23
writer.close();
24
arquivo.close();
25
26
27
} catch (IOException e) {
28
e.printStackTrace();
29
}
30
}
31 }
Figura 2 – Exemplo de código para Indexação usando o Lucene
Na linha 14 é declarado o Document, o qual será armazenado no índice.
Então se carrega o arquivo.txt através do FileInputStream. Este possui o seguinte
conteúdo:
11
“JDK 6 with Java EE
Java EE provides web services, component-model, management, and
communications APIs that make it the industry standard for implementing
enterprise-class service-oriented architecture (SOA) and Web 2.0 applications.
Build native code with easy Java Native Interface (JNI) connections, or
accelerate your Java development by leveraging DTrace, Containers, and ZFS.
Get Sun's latest development platform with Sun Studio compilers and tools for
C/C++/Fortran, NetBeans IDE, and the next-generation Solaris operating
system all in the Solaris Express, Developer Edition.”
Foi escolhido este texto pois o exemplo utiliza a classe StandardAnalyser, que
utiliza as stop words em inglês.
A classe Directory informa o diretório onde serão armazenados os arquivos do
Lucene. O parâmetro “true” informa que um novo índice será criado, ou apagado
se existir um. A classe Analyser é responsável pela extração do texto. A IndexWriter
recebe como parâmetro o Directory e o Analyser para salvar do índice.
Um das partes do código mais importantes é a criação do objeto Document e
a disposição dos respectivos Fields. No exemplo está sendo criado dois Fields, um
para armazenar o nome do arquivo e o outro para guardar o conteúdo.
Na linha 20, adiciona-se um Field para o Document com o nome arquivo e o
seu
conteúdo
é
o
nome
do
arquivo
do
FileInputStream.
O
parâmetro
“Field.Store.YES” define que o Field deve ser armazenado no índice. Já o
segundo parâmetro define que o Field não deve ser indexado. Em outras palavras, o
campo arquivo é armazenado no índice, mas não é um campo indexado, servindo
somente para informar o nome do arquivo que foi indexado.
Na linha 21, o primeiro parâmetro indica o nome do Field e o segundo um
FileReader que fornece a leitura de uma cadeia de caracteres. Este Field será
armazenado e indexado.
O Lucene é utilizado por várias engines de busca, como por exemplo o site da
Wikipedia, SouceForge, e por outro software de busca desenvolvido pela Apache, o
Nutch.
12
5.3 Nutch
A ferramenta Nutch é um programa open source de busca na Web escrita
inteiramente em Java, que pode ser usada em escala global, local e até pessoal.
Seu objetivo inicial era de proporcionar uma alternativa transparente para busca na
Web atendendo aos interesses do usuário. Uma de suas características é a
habilidade de explicar os seus resultados. Para fazer um crawl na escala global, são
necessárias várias máquinas rodando no mesmo instante e, mesmo assim, pode
demorar semanas para ser finalizada. Portanto, será usado o processo de crawl para
sites específicos.
O Nutch fornece todas as ferramentas necessárias para a construção de seu
próprio sistema de busca. Mas qual o motivo de uma pessoa querer construir sua
própria máquina de busca? O primeiro motivo é a transparência no retorno de
resultados. Estes estão livres de interesses comerciais numa ferramenta própria.
Outro é o entendimento de como um sistema de busca funciona e seus critérios de
retorno da pesquisa, os quais no caso de um sistema próprio é a relevância para
com o assunto abordado pelo usuário.
5.3.1 Funcionamento
A ferramenta Nutch é dividida em praticamente quatro partes, que são:
- Searcher: tendo uma pesquisa, ele rapidamente deve retornar os links para
os artigos mais relevantes.
- Crawler: cria um índice de onde o searcher busca seus resultados. O Nutch
usa o Lucene para armazenar os índices.
- Database: armazena as propriedades dos documentos para indexação e
mais tarde para a sumarização pelo searcher. Também são armazenadas
informações adicionais da página, como a estrutura do link da página e a última vez
que o documento foi modificado.
- Fetcher: pede as páginas da Web, as analisa, e extrai seus links.
13
5.3.1.1 Crawler
Este realiza a ação de varrer as páginas da Web, indexa e segmenta seu
conteúdo para armazenamento. Estes segmentos são armazenados na WebDB
(Web data base), a base de dados do Nutch.
Para iniciar um crawl, basta dar o seguinte comando:
bin/nutch crawl urls.txt -dir diretorio_crawl -depth 3 >& crawl.log
Com este comando, o crawl vai indexar as páginas do domínio descrito no
arquivo urls.txt com profundidade 3 e armazenará este na pasta diretório_crawl,
criando um log deste.
O crawl é um processo cíclico. Este gera um jogo de fetchlists (lista que
contém as URLs para indexação) do WebDB, atualiza a base de dados com novos
links encontrados e então o crawler gera um novo jogo de listas. Este é o cilco
conhecido como generate/fetch/update, o qual é executado até que o índice (index)
esteja atualizado.
A seguir, os passos que a ferramenta crawl percorre durante o processo:
1. Criação da base de dados (WebDB).
2. Armazenamento da URL do domínio do site em questão na WebDB.
3. Geração de uma lista (fetchlist) da WebDB num novo segmento (contém os
dados retirados da WebDB).
4. Atualização da WebDB com os links das páginas encontradas.
5. Atualização dos segmentos com os links da WebDB.
6. Indexação das páginas encontradas.
7. Eliminação das URLs duplicadas do índice.
8. Junção das indexações em um único índice.
Após criar uma base de dados (1), é iniciado o ciclo generate / fetch / update
(3-6). Este ciclo é repetido até a profundidade requisitada pelo comando do crawl for
atingida. Logo após este passo, indexam-se os segmentos separadamente até que
as URLs duplicadas sejam removidas (7-10). Enfim, as indexações são organizadas
num único índice (10).
14
5.3.1.2 Searcher
O sistema de busca do Nutch utiliza o índice e os segmentos gerad os
durante o processo de crawl para responder à pesquisa do usuário.
Os resultados da pesquisa são retornados utilizando o formato aplicado
pela maioria dos sistemas de busca. Porém, cada resultado possui uma
opção a mais que os sistemas de busca comuns, a qual e o link explain.
Ao clicar no link explain, aparecerão alguns dados da página e a
explicação do escore. Este último é uma propriedade do Lucene , a qual
mostra todos os fatores que contribuíram para o cálculo do escore da página
em questão. Esta característica ilustra o conceito de transparência no
programa open source, que mostra ao usuário o motivo pelo qual uma página
da Web ficou mais bem posicionada que outra.
Para utilizar o Nutch para pesquisa, é necessária a ferramenta Apache
Tomcat. Basta instalá-la, acessar o link http://localhost:8080/manager/html e
fazer o deploy do arquivo nutch-0.9.war. Logo após, é necessária a
modificação do arquivo nutch-site.xml, encontrado na pasta do diretório
do tomcat (.../webapps/nutch-0.9/WEB-INF/classes/) para que o Tomcat
encontre a sua pasta do crawl. Este arquivo nutch-site.xml deverá ficar
da seguinte forma:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<!-- Put site-specific property overrides in this file. -->
<nutch-conf>
<property>
<name>searcher.dir</name>
<value>DIRETÓRIO DA PASTA CRAWL</value>
</property>
</nucth-conf>
Figura 3 – Arquivo nutch-site.xml cofigurado
Após isso, basta clicar sobre o link nutch-0.9 no Tomcat e pesquisar.
Porém, o projeto consiste na utilização do Nutch como ferramenta de
programação, e não somente como programa. Portanto no capítulo seguinte
será descrito como usar suas bibliotecas para construir um programa de
busca.
15
CAPÍTULO VI - TB²uscador
Este capítulo irá se aprofundar em como este projeto foi implementado,
os passos dados e de onde partimos para chegar ao programa implementado.
O objetivo deste projeto é o de facilitar a pesquisa na internet por
referências. Uma maneira de chegar a este é fornecer uma ferramenta open
source de fácil manuseio que busque fontes na Web.
Mas como pode-se utilizar as bibliotecas do Nutch para implementação
de um programa de busca? Para poder utilizar com mais facilidade, o é
interessante que o programa seja escrito em Java, pois o Nutch é
inteiramente
escrito
nesta
linguagem.
Para
demonstrar
uma
simples
aplicação da Application Programming Interface (API) do Nutch, segue o
código abaixo com os devidos comentários:
package org.tiling.nutch.intro;
import java.io.IOException;
import org.apache.nutch.searcher.Hit;
import org.apache.nutch.searcher.HitDetails;
import org.apache.nutch.searcher.Hits;
import org.apache.nutch.searcher.NutchBean;
import org.apache.nutch.searcher.Query;
public class SearchApp {
//número de links que irão aparecer como resultado, se encontrados
private static final int NUM_HITS = 10;
public static void main(String[] args)throws IOException {
//classe central do Nutch, que faz a busca
NutchBean bean = new NutchBean();
//a fila de busca
Query query = Query.parse(args[0]);
Hits hits = bean.search(query, NUM_HITS);
//pega os resultados da busca
for (int i = 0; i < hits.getLength(); i++) {
Hit hit = hits.getHit(i);
//pega os detalhes da página em questão
HitDetails details = bean.getDetails(hit);
String title = details.getValue("title");
String url = details.getValue("url");
String summary = bean.getSummary(details, query);
//mostra os resultados
System.out.print(title);
System.out.print(" (");
System.out.print(url);
System.out.println(")");
System.out.println("\t" + summary);
}
}
}
Figura
4 – Exemplo de código usando a API do Nutch
16
Partindo das bibliotecas do Nutch, que por sua vez utiliza o Lucene, foi
implementado uma versão inicial do programa TB²uscador. Ele consiste na
utilização do Nutch para realizar o processo de crawl e de busca.
O TB²uscador foi implementado em Java, para facilitar o uso das
bibliotecas do Nutch. Ele é separado principalmente em duas partes: a
interface gráfica e a lógica do programa. Ao abrir o programa, o usuário irá
ver a seguinte imagem:
Figura 5 – Programa TB²uscador
Ao realizar a pesquisa, o programa irá utilizar o Nutch para fazer tal. A classe
NutchBean
da
API
do
Nutch
irá
chamar
o
seu
método
search(query,NUM_HITS), o qual recebe como parâmetro a busca e o número
máximo de resultados que o programa irá retornar. A busca é feita nos sites
indexados. Então, o programa captura os detalhes de cada página encontrada e as
retorna, respeitando a formatação padrão dos principais buscadores atuais. Cada
resultado é armazenado num array da classe Resultado. Esta classe possui como
atributos o title (título da página), contexto (resumo do conteúdo) e a própria URL da
17
página. Podem ser realizadas diversas pesquisas, com cada uma delas encontradas
em uma nova aba no programa.
Figura 6 – Pesquisa no TB²uscador
O número de resultados retornados pode ser configurado no menu
Configuration do programa.
Para fazer com que os links aparecessem no EditorArea do programa, foi
necessário um tratamento especial com html. A classe HTMLCreator cria apartir
dos resultados da classe Resultados o html que é carregado pelo Editorarea.
Os evento gerados pelo clique nos links são capturados e enviados a classe
Console.
A classe Console é responsável pelo acesso aos links. Ao clicar num dos
links
retornados,
será
executado
o
comando
do
shell
pelo
Java
(Runtime.getRuntime().exec("firefox "+url)) para abrir o documento
em questão pelo Mozilla Firefox sendo ele qualquer tipo. Se o Firefox já estiver
18
aberto,
então
o
documento
será
acessado
em
uma
(Runtime.getRuntime().exec("firefox -new-tab "+url)).
nova
aba
Portanto, o
usuário faz a pesquisa, o TB²ucador usa a API do Nutch para realizar a busca nos
sites indexados, mostra os resultados para o usuário em formato de hyperlink e, ao
clicar sobre estes, o conteúdo da página é aberto utilizando o Firefox.
Figura 7 – Menu Configuration
Para a próxima versão do programa, está sendo implementada a opção busca
avançada, a qual faz uma busca aprofundada sobre o assunto. Ela utilizará a
seguinte estratégia: fará uma busca simples, acessará o conteúdo de quantos site o
usuário configurar, armazenará as principais palavras destes documentos e fará a
busca novamente, só que agora serão estas palavras principais que serão a
pesquisa em si. Para realizar este processo, está sendo usada como base para
implementação uma importante ferramenta: o WVTool, que retira as principais
palavras do documento. Porém, está sendo necessária a implementação de um
novo WVTool, pois este apresenta o problema de freqüência das palavras, ou seja,
ele retira as palavras importantes do texto, mas com a freqüência errada com que
19
aparecem. O problema parece estar relacionado à escala de busca; por meio de
testes realizados pôde-se ver que quanto maior o número de fontes, maior era a
precisão das freqüências. Assim, a nova versão do WVTool esta sendo adaptada
para varreduras em menor escala, como é o caso do projeto. Este usa como critério
de seleção as Stop Words. Estas são palavras irrelevantes para aplicar numa nova
busca. São palavras como: a, aos, apenas, bem.
Devido a esse problema do WVTool foi implementada uma versão inicial de
uma pequena framework com as funcionalidades necessárias para a partir de um
documento no formato texto retirar as palavras mais freqüentes excluindo as Stop
Words.
Outra ferramenta necessária para o programa é a opção de o usuário realizar
as suas próprias crawls de maneira fácil, em ambiente gráfico. Para isso, são
necessárias algumas modificações. Estas consistem na configuração do arquivo
nutch-default.xml e nutch-site.xml, em que ambos é necessária a
modificação para indicar o diretório da pasta do novo crawl realizado. Para isso, será
desenvolvida uma classe Java, a qual executará comandos no Shell para extrair os
devidos arquivos da biblioteca nutch-0.7.2.jar, modificá-los, compactá-los
novamente e adiciona-los no projeto outra vez. Algo parecido com o que já foi
implementado para indicar o diretório plugins no arquivo nutch-default.xml, o
que é necessário para o funcionamento correto da busca do nutch.
Com esta opção, o usuário facilmente poderá indexar suas próprias páginas
com facilidade, é só digitar a URL e adicionar. Pode-se observar também a opção
profundidade neste menu, a qual controla com que profundidade a o domínio em
questão será indexado.
20
Figura 8 – Menu Crawl
6.1 Passos do Projeto
O primeiro passo para chegar a este ponto foi o de analisar o problema de
pesquisa. Qual seria o tema abordado pelo projeto? Ao refletir a respeito do assunto,
chegou-se a uma conclusão de que o projeto abordaria a área de buscas na Web.
Primeiramente, foi proposto o tema de busca de plágios por parte dos
estudantes. Este seria uma nova extensão de documentação (.bbt por exemplo) que
faria a contagem de caracteres realmente digitados, ou seja, iria detectar o famoso
“CTRL+C CTRL+V”. Porém, este seria inviável devido ao tempo máximo para
concluir o projeto e por falta de conhecimento por parte dos projetistas, pois este
exige um nível de conhecimento não adquirido ainda. Com a mesma idéia de
detecção de plágio, surgiu um outro método para este fim: implementar um buscador
que retirasse trechos do trabalho em questão e buscasse pela Web artigos
parecidos. Porém, este projeto não teria a devida relevância acadêmica, pois os
estudantes em vez de realizar a pesquisa, tentariam burlar o programa.
21
Descartada esta primeira hipótese, surgiu a idéia de implementar um
programa que realizasse a busca por artigos científicos, o TB²uscador. Após um
aprofundamento teórico em sistemas de busca, foi iniciada a procura por uma
ferramenta open source que realizasse a busca. Com a ajuda dos orientadores, foi
enfim encontrada a ferramenta Nutch. Então, inicio-se a fase de configuração do
Nutch. A versão do programa sendo configurada era a mais atual, a Nutch-0.9.
Seguindo o tutorial do deste, foram realizadas as devidas configurações e, com um
site indexado, o Nutch fazia a pesquisa neste. Para rodá-lo, foi necessária a
ferramenta Apache Tomcat. Porém, para utilizar a API do Nutch, era necessária a
versão Nutch-0.7, para o código exemplo encontrado. Portanto, houve a migração
de versão. A 0.7 possui diferentes configurações. Desta forma, levou-se um bom
tempo para a adaptação com este. Com as devidas mudanças feitas, iniciou-se a
fase de implementação.
Partindo de um código exemplo, foi implementado um buscador (que
pesquisa no site indexado) que retornava seus resultados num array na forma de
Strings. Esta versão se chamava Nuts. Então, foi utilizado um tratamento com html
para a que estes aparecessem em forma de link. Com isso, começou-se a
implementar a parte gráfica do programa e houve a mudança no nome: TB²uscador.
Para acessar os links, primeiro foi construída uma maneira que abriam estes
no próprio programa. Mas surgiram dificuldades, como abrir um documento PDF e
doc. Então, surgiu a idéia de executar o Mozilla Firefox para o acesso a estes
resultados, o qual abre vários tipos de documento. As novas pesquisas são abertas
em novas abas no TB²uscador, tornando mais prático o manuseio do programa.
A fase atual é a de implementação da busca avançada, a qual utiliza uma
ferramenta implementada que retira as palavras relevantes do documento da busca
simples para utilizar numa nova busca. Porém, esta ferramenta está funcionando
somente com documentos txt no momento. Está sendo desenvolvido um script para
retirada destas em documentos no formato PDF.
22
CONCLUSÃO
O desenvolvimento deste projeto é extremamente importante para a formação
teórico-prática dos desenvolvedores em programação Java, manuseio com html,
teoria e sistemas de busca e construção de scripts. Não somente por este motivo,
mas também por beneficiar a população com uma ferramenta open source de fácil
manuseio, que retorna resultados de acordo com a relevância da página para com o
tema pesquisado. Sem contar com a ferramenta de crawl facilitada, que indexa a
página que o usuário propor.
23
REFERÊNCIAS BIBLIOGRÁFICAS
SULLIVAN, D. Major Search Engines and Directories. Disponível em:
<http://searchenginewatch.com/showPage.html?page=2156221>. Acesso em:
29 out. 2007.
SULLIVAN,
D.
How
Search
Engines
Work.
Disponível
em:
<http://searchenginewatch.com/showPage.html?page=2168031>. Acesso em:
30 out. 2007.
MOURA, Gevilacio Aguiar Coêlho de. Sistemas de busca da web: diretórios e
mecanismos de busca. Disponível em: <http://www.quatrocantos.com/
tec_web/sist_busca/index.htm>. Acesso em: 31 out. 2007.
APACHE
LUCENE.
Getting
Started
Guide.
Disponível
em:
<http://lucene.apache.org/java/2_2_0/gettingstarted.html>. Acesso em: 30
out. 2007.
GOETZ, Brian. The Lucene search engine: Powerful, flexible, and free .
Disponível em: < http://www.javaworld.com/javaworld/jw-09-2000/jw-0915lucene.html >. Acesso em: 30 out. 2007.
MANNING, Christopher D.; RAGHAVAN, Prabhakar.; SCHUTZE, Hinrich.
Introduction to Information Retrieval. Cambridge University Press, 2008.
Disponível em:<http://www-csli.stanford.edu/~hinrich/information-retrieval-book.html>
Acesso em: 30 out. 2007. Slides.
APACHE SOFTWARE FOUNDATION. About Nutch. Disponível em:
< http://lucene.apache.org/nutch/docs/> Acesso em: 31 out. 2007.
APACHE SOFTWARE FOUNDATION. Nutch version 0.7 tutorial. Disponível
em: < http://lucene.apache.org/nutch/tutorial.html>. Acesso em: 28 out. 2007.
KHARE, Rohit.; CUTTING, Doug.; SITAKER, Kragen. Nutch: A Flexible and
Scalable
Open-Source
Web
Search
Engine.
Disponível
em:
<http://wiki.commerce.net/images/0/06/CN-TR-04-04.pdf>. Acesso em: 31
out. 2007.
24
WHITE,
Tom.
Introduction
to
Nutch.
Disponível
em:
<http://today.java.net/pub/a/today/2006/01/10/introduction-to-nutch-1.html>.
Acesso em: 31 out. 2007.
GUERRA, Gláucio. Possibilitando alta performance na indexação com o
Apache Lucene. Disponível em: <http://del.icio.us/lucasgameiro>. Acesso
em: 01 nov. 2007.
PAUL,
Thomas.
The
Lucene
Search
Engine.
Disponível
em:
<http://www.javaranch.com/newsletter/200404/Lucene.html>. Acesso em: 02
nov. 2007.
CAFARELLA, Mike.; CUTTING, Doug. Building Nutch: Open Source
Search.
Disponível
em:
<http://www.acmqueue.com/modules.php?name=Content&pa=showpage&pid=
144&page=1>. Acesso em 02 nov. 2007.
CASA BRASIL. Oficina do Astrolábio Digital: navegação e pesquisa na
internet.
Disponível
em:
<http://www.casabrasil.gov.br/oficinas/files/OficinaAstrolabioDigital ManualParticipante.pdf>. Acesso em: 02 nov. 2007.
BLUM, Thom ,; KEISLAR, Doug .; WHEATON, Jim .; WOLD, Erling. Writing a Web
Crawler in the Java Programming Language. Disponível em:
<http://java.sun.com/developer/technicalArticles/ThirdParty/WebCrawler>.
Acesso em: 04 nov. 2007
25
ANEXOS
Figura 9 – Diagrama de Classes
26
Download