\documentclass[titlepage]{article}

\usepackage[brazil]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[pdftex]{graphicx}
\usepackage{cite}

\title{Monografia - Geração Automática de Metadados para Publicações Eletrônicas}
\author{José David Fernández Curado \\ Orientadora: Renata Wassermann}

\newcommand{\euclid}{Projeto Euclid}

%% To display code
\usepackage{color}
\usepackage{listings}
\lstset{
	language=xml,                 % -> choose the language of the code
	basicstyle=\footnotesize,     % -> the size of the fonts that are used for the code
	numbers=left,                 % -> where to put the line-numbers
	numberstyle=\footnotesize,    % -> the size of the fonts that are used for the line-numbers
	stepnumber=1,                 % -> the step between two line-numbers. If it is 1 each line will be numbered
	numbersep=5pt,                % -> how far the line-numbers are from the code
	backgroundcolor=\color{white},% -> choose the background color. You must add \usepackage{color}
	showspaces=false,             % -> show spaces adding particular underscores
	showstringspaces=false,       % -> underline spaces within strings
	showtabs=false,               % -> show tabs within strings adding particular underscores
	frame=shadowframe,            % -> adds a frame around the code
	tabsize=2,                    % -> sets default tabsize to 2 spaces
	captionpos=b,                 % -> sets the caption-position to bottom
	breaklines=true,              % -> sets automatic line breaking
	breakatwhitespace=false,      % -> sets if automatic breaks should only happen at whitespace
	escapeinside={\%}{)}          % -> if you want to add a comment within your code
}


\begin{document}
\maketitle
\tableofcontents

\newpage

\part{Parte Objetiva}

\section{Introdução}

\subsection{Motivação e Objetivos} %% OK
A maior motivação deste trabalho está na produção de uma ferramenta útil para o CLE \footnote{Centro de Lógica e Epistemologia da Unicamp} de modo que este possa integrar sua revista, a CLE  ``e-Prints''\footnote{http://www.cle.unicamp.br/e-prints/articles.html}, ao {\euclid} \footnote{http://projecteuclid.org/}. O CLE pretende deixá-la disponível através do site do projeto e, para tanto, precisa se responsabilizar por gerar alguns arquivos que ajudam o site a funcionar.

Um desafio técnico para fazer essa integração é que o {\euclid} exige que as revistas enviem, junto de cada edição, um arquivo contendo algumas informações sobre a mesma, em um formato específico, para que seu site possa disponibilizá-las na página da publicação e para acelerar seus mecanismos de busca. 

O objetivo deste trabalho é fornecer uma ferramenta que possa fazer a extração automática das informações que são necessárias para construir o arquivo exigido pelo {\euclid}, seguindo o padrão definido por ele.

As restrições desse arquivo são, simplesmente, restrições de um DTD\footnote{Document Type Definition} para um arquivo XML\footnote{eXtensible Markup Language}, mas esse arquivo deve refletir os dados referentes à edição enviada, como, por exemplo, o nome dos editores e, para cada artigo da edição, abstract e autores.

\subsection{{\euclid}} %%ok

O {\euclid} considera como sua missão melhorar a comunicação entre estudiosos das áreas de matemática e estatística. Seu objetivo mais básico era suprir as necessidades de revistas pequenas e de baixo custo. O que o projeto acaba oferecendo é uma plataforma avançada de publicação online com funcionalidades de busca textual, geração de links para referência, que segue os padrões da ``Open Archives Initiative'' e fornece serviço de armazenamento de informação a longo prazo.

Para poder fornecer um serviço consistente e confiável, o {\euclid} exige que, junto com cada edição da revista, seja submetido um arquivo contendo informações da edição. Como vários grupos se utilizam da plataforma oferecida pelo projeto, é necessário que informações como autores, editores e responsáveis sejam enviadas de forma estruturada seguindo um padrão acordado entre a revista e o projeto.

O padrão de metadados do {\euclid} é simplesmente um arquivo XML seguindo o DTD ``euclid\_issue.dtd''. Esse padrão contém, entre outras coisas, rótulos representando dados de contato, data de publicação, autores, editores e abstract.

\subsection{Problemas} %%ok

Os principais problemas para este projeto foram:

\begin{itemize}
    \item{\textbf{Levantar especificações completas da ferramenta a ser criada: } O primeiro problema, e de mais difícil resolução, foi levantar especificações suficientes para a ferramenta. Esta podia ser feitas de várias formas e com diferentes possibilidades de restrições ou features. Definir um escopo factível para a ferramenta demorou mais tempo do que o esperado.}
    \item{\textbf{Levantar uma estrutura recorrente nos artigos: } Um dos grandes problemas para encontrar as informações nos artigos é que estes estão escritos de forma natural, sem obrigatoriedade do uso da estrutura do {\LaTeX}. Apesar de serem artigos científicos, não existe uma grande preocupação com o código escrito em {\LaTeX}, apenas com a linguagem formal e algumas regras gerais, portanto é necessário um trabalho para entender como os dados aparecem no texto.}
    \item{\textbf{Entender a estrutura do DTD do {\euclid}: } O XML precisa seguir a estrutura do projeto, mas também precisa implementar a semântica desejada, utilizando as tags corretas para os dados levantados.}
    \item{\textbf{Gerar código XML válido: } O documento XML gerado pela ferramenta deve ser válido de acordo com as normas descritas no arquivo ``euclid\_issue.dtd''. Isso exige algum estudo de validação de XML com relação a um DTD.}
\end{itemize}

\subsection{Estrutura deste Trabalho} %%ok

O trabalho foi dividido em duas partes: 

\begin{enumerate}
	\item Técnicas e conceitos de extração de Metadados
	\item Proposição de um algoritmo real de extração
\end{enumerate}

Os capítulos, divididos segundo o objetivo, são:

\begin{enumerate}
	\item Objetivo e os problemas a serem resolvidos no resto do texto
	\item Conceitos básicos envolvidos no problema e técnicas utilizadas para resolução deste
	\item Estrutura e as tecnologias usadas na ferramenta
	\item O Gerador de metadados
	\item Conclusões
	\item Referencias bibliográficas
\end{enumerate}

\newpage
\section{Conceitos e técnicas estudadas}

Explicaremos agora os conceitos envolvidos neste trabalho (Metadados) e técnicas comuns para extração.

\subsection{Metadados} %%ok

Metadados são informalmente definidos como dados sobre dados e são, também, chamados de dicionário de dados ou metainformção. Na prática, um item de metadado especifica alguma coisa sobre um dado. Podemos também defini-los como uma abstração de dados ou como dados de mais alto nível sobre dados de mais baixo nível. Podem fornecer informação como:

\begin{itemize}
    \item data de criação
    \item autor
    \item editor
    \item padrões
    \item identificadores
\end{itemize}

Por exemplo: arquivos de imagem, em um computador, fornecem informações sobre a dimensão da imagem, resolução e padrão de cores. Outros tipos de documentos podem conter outros tipos de informações.

Metadados facilitam o entendimento e a estruturação de representações dos dados em si. Podemos, então, criar ferramentas para trabalhar com essa representação mais formal do dado, tendo, inclusive, uma semântica para os dados. Como a estrutura é normalmente definida a priori, temos uma semântica associada à estrutura dos dados e isso permite criar sistemas que usem essa semântica para fazer buscas. 

Esse não é um conceito novo e já tem sido amplamente usado por bibliotecas há muito tempo na forma de catálogos de livros.

São geralmente representados através de arquivos XML, pois sua estrutura bem definida é perfeita para estruturar os metadados de forma simples e sucinta.


\subsection{Geração Automática de Metadados}

Muito já se estudou sobre geração automática de metadados e técnicas de extração de metadados de textos. Essa área é importante para a web, pois o uso de metadados facilita a criação de algoritmos de buscas eficientes.

Dado que se dispõe de metadados com um significado bem definido, é possível a criação de algoritmos de buscas semânticas, em oposição a algoritmos de busca textual.

Descreveremos agora algumas das técnicas mais utilizadas para a tarefa.

\subsubsection{Raciocínio baseado em casos}

Raciocínio baseado em casos\cite{casereas} é uma técnica de Inteligência Artificial para resolução de problemas. É uma técnica de raciocínio e aprendizado que se baseia em soluções conhecidas para problemas semelhantes para construir a solução de um problema proposto.

É diferente de outras técnicas de Inteligência Artificial, pois não depende de conhecimentos a priori sobre o domínio e nem de regras que os problemas sigam, e, sim, de soluções reais conhecidas. Também é diferente por ser uma técnica de aprendizado continuo, já que, cada vez que um novo problema é resolvido, sua solução é guardada para uso futuro.

Formalmente, esse tipo de sistema tenta imitar o método de resolução de muitos especialistas humanos que utilizam conhecimentos sobre problemas resolvidos para resolver problemas atuais em sua área.

Um exemplo de uso de sistemas baseados em casos é o sistema de perguntas e respostas proposto em \cite{qeasis}.

Esses sistemas são divididos em quatro passos:

\begin{enumerate}
\item Retrieve: busca casos similares, onde um caso é o problema, sua solução e como a solução foi obtida.
\item Reuse: reusa as informações sobre a solução dos casos recuperados.
\item Revise: revisa a solução proposta.
\item Retain: guarda as partes da experiência que poderão ser úteis no futuro.
\end{enumerate}

\begin{figure}[!hc]
     \center
     \includegraphics[scale=0.5]{Imagem2.jpg}
     \caption{Passos do Raciocinio baseado em casos}
     \label{Passos do Raciocinio baseado em casos}
\end{figure}

As áreas de problemas em Raciocínio baseado em casos, de acordo com \cite{casereas}, são:

\begin{enumerate}
	\item Representação de Conhecimento: Especificamente a representação do conhecimento sobre os casos e suas resoluções.
	\item Métodos de ``Retrieve'': Em particular métodos de buscas de casos semelhantes.
	\item Métodos de ``Reuse'': Como reusar as soluções conhecidas?
	\item Métodos de ``Revise'': Normalmente é um passo fora do sistema e envolve determinação de erros.
	\item Métodos de ``Retain'': Como extrair novos casos e como indexar essa informação para uso futuro.
\end{enumerate}

No contexto de extração de Metadados, o raciocínio baseado em casos foi utilizado em \cite{hybrid}. O sistema proposto no artigo utiliza regras para agrupar documentos semelhantes e então utiliza ``Raciocínio baseado em casos'' diretamente para extrair os metadados.

No algoritmo proposto a própria representação da solução do problema define marcadores delimitando os metadados, transformando o problema de extração num problema simples de busca de marcas distintas na solução gerada.

Os passos do algoritmo são:

\begin{enumerate}
	\item Agrupamento de documentos semelhantes (baseado em regras)
	\item Análise e marcação do documento (baseado em casos)
	\item Extração dos metadados
	\item Verificação e correção dos metadados extraídos
\end{enumerate}

Algoritmos baseados em casos têm a grande vantagem de se aperfeiçoar com o tempo, já que aprende com cada novo caso apresentado, mas têm uma grande limitação quanto à diversidade permitida para a estrutura dos casos. Esses algoritmos perdem muita precisão quando são fornecidos casos razoavelmente diferentes entre si.

\subsubsection{Raciocínio baseado em regras}

Raciocínio baseado em regras é outra técnica de Inteligência Artificial que se utiliza de um conjunto de regras e um mecanismo de inferência para chegar a conclusões sobre um conjunto de premissas.

Normalmente são sistemas que permitem definição de uma base de conhecimento do tipo ``If $A$ then $B$ else $C$'', onde $A$ é uma condição e $B$ e $C$ são ações que o sistema pode executar. É uma técnica muito utilizada no desenvolvimento de sistemas especialistas.

No contexto de metadados, o sistema proposto em \cite{Giles03automaticdocument} utiliza regras extraídas de bancos de dados, e de propriedades ortográficas, para definir características de uma palavra. Essa classificação é, então, usada no algoritmo para classificar linhas em separado e em contexto para, por fim, conseguir extrair os metadados que estejam na linha.

\begin{enumerate}
	\item Extração de características das palavras (baseado em regras)
	\item Classificação Independente das linhas
	\item Classificação Contextual das linhas
	\item Quebra das linhas e extração dos metadados
\end{enumerate}

Os algoritmos são normalmente simples de implementar, pois não é necessário nenhum tipo de treinamento para o algoritmo, mas são naturalmente restritos aos problemas definidos pelas regras.

Como o sistema é definido pelas regras, é necessário de um conjunto completo de regras para cada domínio de problemas. Regras que precisam ser bem especificadas, gerando outro problema que é a especificação das regras.

\subsubsection{Processamento de Linguagem Natural}

Processamento de Linguagem Natural é uma área de Inteligência Artificial que estuda técnicas de geração e compreensão automática de línguas humanas. Métodos de $PLN$ permitem que humanos interajam mais naturalmente com máquinas, eliminando a necessidade de formas artificiais de interação homem-máquina.

Esse estudo tem um grande caráter interdisciplinar envolvendo as áreas de ``Inteligência Artificial'', ``Teoria da Computação'', ``Compiladores'', ``Lingüística Computacional'' e outras \cite{parser}.

Nosso interesse em $PLN$, para extração automática de metadados, é a criação de um sistema capaz de processar documentos e extrair informações relevantes.

O processamento automático de linguagens, normalmente, segue as seguintes etapas\cite{parser}:

\begin{enumerate}
	\item{
		\textbf{Análise Morfológica: } Identificação e classificação de palavras ou expressões em uma sentença. 
	
		No contexto, o analisador deve inferir o tipo da palavra (substantivo, adjetivo, ...) e considerar regras de flexão, como plural e flexão de verbos.
		
		Esse passo é fundamental para a compreensão da frase, pois, para extrair o significado da frase, é necessário entender todos os vocábulos componentes.
		
		Um reconhecedor possível para essa fase é o Autômato Finito.
	}
	\item {
		\textbf{Análise Sintática: } Aplicação de conhecimentos de gramática da lingua.
		
		O objetivo do analisador sintático é definir as relações entre as palavras. Para tanto ele se utiliza do processamento feito na análise morfológica e procura construir uma árvore de derivação para a sentença seguindo regras de construções definidas pela gramática da língua. Dentre essas regras: concordância e regência nominal e verbal.
		
		Neste ponto, o maior problema é a desambiguação de frases.
		
		Para esta fase, técnicas muito utilizadas são:
		\begin{itemize}
		\item Gramáticas Regulares
		\item Gramáticas Livres de Contexto
		\item Gramáticas Sensíveis ao Contexto
		\end{itemize}
	}
	\item{
		\textbf{Análise Semântica: } Definição do significado.
		
		O problema evidente desta fase é definir o significado das palavras na frase, considerando os possíveis usos de uma mesma palavra. Esta fase define significado considerando componentes das palavras (mercado, hipermercado), ambiguidades de palavras (``tomar um suco'', ``tomar um banho'') e diferenças de sentido (``cachorro'', ``meu cachorro'').
		
		A semântica também busca uma representação do sentido, que pode ser feito através de decomposição de unidades léxicas, ou através do uso de redes semânticas.
		
		O resultado é a associação de significado à árvore de derivação da análise sintática.
	}
	\item{
		\textbf{Pragmática: } Processamento do todo
		
		Obviamente, o significado completo normalmente está no texto, e não apenas nas partes, portanto a análise final é a análise contextual das frases.
		
		Nesta etapa, o processo contextualiza as frases para conseguir extrair figuras de linguagem. Ao fim desta etapa espera-se poder perceber situações como sarcasmo e hipérboles.
	}
\end{enumerate}

No contexto de Geração Automática de Metadados, o sistema proposto em \cite{user} utiliza $PLN$ para extrair preferências de usuários através de emails trocados com seus analistas financeiros.

O algoritmo segue os seguintes passos:

\begin{enumerate}
	\item Identificação de orações
	\item Análise sintática
	\item Análise morfológica
	\item Identificação de conceitos de várias palavras
	\item Categorização de conceitos
	\item Metadados implícitos
	\item Extração de metadados
\end{enumerate}

Notamos que os passos $1-4$ são simplesmente passos do processamento de linguagem natural, já os passos $5-7$ são os passos reais de extração de metadados.

O sistema é bem completo, mas esbarramos em limitações de computação para $PLN$, por exemplo, os problemas associados à Análise sintática, como a falta de um método eficiente e forte o suficiente para compreender a gramática de linguagens naturais.

A ausência de um meio de implementar as gramáticas humanas, com todos os seus detalhes, de forma computacionalmente viável, acaba forçando algoritmos incompletos.

Temos, também, a especificidade do sistema, já que um sistema de $PLN$ é específico para uma única língua.

\subsubsection{Expressões Regulares e Linguagens formais}

A Área de Computação que se refere a Expressões Regulares, Autômatos, e Linguagens formais, de forma mais genérica, é amplamente utilizada no processamento de textos e parsing dentro dos algoritmos de Extração de metadados.

Observamos forte uso de gramáticas de vários tipos da hierarquia de Chomsky em $PLN$, mas também no parsing de textos em outros sistemas.

Muitos dos algoritmos estudados utilizam parsers e analisadores para linguagens para extrair informações necessárias para executar seus passos.

Duas áreas bem distintas de aplicação desses conhecimentos no projeto foram:

\begin{enumerate}
\item{
	parser: criação de uma ferramenta para processar o texto, em seu formato mais desestruturado, gerando uma estrutura lógica que possa ser usada em um processo.
	
	Utilizamos JavaCC para criar uma gramática para arquivos {\TeX}.
}
\item extração: extração de trechos de textos, dadas expressões regulares com objetivos mais simples, em seções especificas do texto processado.
\end{enumerate}

\newpage
\section{Tecnologias Estudadas}

\subsection{XML}

XML (eXtensible Markup Language) é um conjunto de regras, derivado do SGML (Standard Generalized Markup Language), para criar formas de representar dados estruturados. Foi definido e é mantido pelo W3C (World Wide Web Consortium). Algumas linguagens definidas com base em XML incluem XHTML e RDF.

Entre as construções permitidas para o XML, como especificado pela W3C,  encontram-se, pelo menos:

\begin{enumerate}
	\item{
		\textbf{Tags: } O XML é basicamente definido por suas tags. É onde as informações estão, normalmente, armazenadas.
		
		Existem três tipos de tags:
		\begin{enumerate}
			\item{
				\textbf{start-tag}
				
				São da forma ``\textless title\textgreater ''.
			} 
			\item{
				\textbf{end-tag}
				
				São da forma ``\textless /title\textgreater ''.
			} 
			\item{
				\textbf{empty-tag}
				
				São da forma ``\textless title /\textgreater ''.
			} 
		\end{enumerate}
	}
	\item{
		\textbf{Elemento: } É um componente lógico do documento que consiste, ou de uma empty-tag, ou de uma seqüência start-tag, conteúdo, end-tag, onde conteúdo pode ser uma sequêcia de caracteres ou outros elementos.
		
		Exemplos:
		\begin{itemize}
		\item \textless Greeting\textgreater Hello, World!\textless /Greeting\textgreater 
		\item \textless line-break /\textgreater 
		\end{itemize}
	}
	\item{
		\textbf{Attribute: } É um par de valores que podem existir numa start-tag ou empty-tag.
		
		Exemplos:
		\begin{itemize}
		\item \textless Greeting lang="en\_us"\textgreater Hello, World!\textless /Greeting\textgreater 
		\item \textless img src="foo.jpg" /\textgreater 
		\end{itemize}
	}
\end{enumerate}

Um exemplo de um arquivo XML é:

\begin{center}
\lstinputlisting{t.xml}
\end{center}

É a linguagem mais utilizada para representar metadados.

\subsection{JavaCC}

Java Compiler Compiler é uma ferramenta para gerar parsers em Java, a partir de uma gramática. Foi usado neste projeto para definir o parser incompleto de {\TeX}.

É semelhante em funcionalidade ao ``yacc'', pois gera um parser a partir de uma gramática formal. Em particular, o javacc gera parser top-down, limitado a parsers para a classe de  gramáticas $LL(k)$ e sem recursão à esquerda.

Um exemplo de código usado para definir a gramática é:

\lstset{language=java}
\begin{center}
\lstinputlisting{t.jj}
\end{center}

No código acima, definimos um não-terminal ``Document'' que poderá ser usado para definir novas regras, no estilo ``EBNF''.

Mais profundamente, o código acima também especifica que, para que um Document seja derivável, precisamos que o input comece com ``{\textbackslash}begin\{document\}'', termine com ``{\textbackslash}end\{document\}'' e contenha zero ou mais elementos deriváveis pelo não-terminal Element. Ainda mais, cada Element encontrado é adicionado ao corpo do Document.

Ao final da execução da regra, um Document é devolvido para a regra que o derivou.

\newpage
\section{O gerador automático}

Propomos um algoritmo que recebe os arquivos {\TeX} referentes aos artigos, e gera o arquivo de metadados correspondente. O algoritmo segue três passos bem definidos:

\begin{enumerate}
	\item Parsing dos arquivos {\TeX}
	\item Análise da Estrutura Abstrata do {\TeX}
	\item Geração do arquivo de metadados
\end{enumerate}

\subsection{Parsing}

O primeiro passo do algoritmo é realizar um parsing do arquivo {\TeX} e gerar uma estrutura abstrata em memória que pode ser processada diretamente.

A estrutura foi desenvolvida para conter informações suficientes para que os dados extraídos sejam de boa qualidade e possam refletir, de forma eficaz, o conteúdo de interesse do arquivo {\TeX} .
		
Para executar essa etapa, desenvolvemos um parser incompleto de {\TeX}, que é capaz de extrair, corretamente, pelo menos a estrutura básica do arquivo. Consideramos que o preâmbulo e o começo do documento contêm a maior parte dos metadados desejados.

O modelo que utilizamos para {\TeX} , implementado no pacote ``tex.base'' é:
\begin{enumerate}
	\item{
		\textbf{Tex: } É a classe base que representa o documento {\TeX}.
		
		membros: Um ``Preamble'' e um ``Document''.
	}
	\item{
		\textbf{Preamble: } É o preâmbulo do documento {\TeX}. Genericamente: tudo que está entre ``{\textbackslash}documentclass... '' (incluso) e ``{\textbackslash}begin\{document\}''.
		
		Espero que, nesta parte do documento, estejam especificadas definições a serem usadas no documento em si. Entre as definições esperadas, esperamos que esteja definido:
		
		\begin{itemize}
		\item title: para a extração do titulo
		\item author: para a extração de autores
		\item institute (possivelmente): para extrair metadados referentes aos institutos que o autor é afiliado.
		\end{itemize}
		
		membros: Lista de Definition
	}
	\item{
		\textbf{Definition: } São comandos {\TeX} da forma ``{\textbackslash}name\{env1\}[options]\{env2\}''.
		
		membros: Lista de Strings (opções) e Lista de Enviroment
	}
	\item{
		\textbf{Enviroment: } Conceito genérico para um bloco onde podem aparecer os ``Element'' do {\TeX}
		
		São da forma $\{ Element* \}$.
		
		membros: lista de ``Element''
	}
	\item{
		\textbf{Element: } Enviroment ou Definition ou Text.
		
		É uma interface para generalizar chamadas a elementos básicos de um {\TeX}, ou seja, coisas que podem aparecer várias vezes.
	}
	\item{
		\textbf{Document: } é o documento em si.
		
		Definimos como documento tudo aquilo que está entre ``{\textbackslash}begin\{document\}'' e ``{\textbackslash}end\{document\}''.
		
		membros: Lista de ``Element'' e opções.
	}
	\item{
		\textbf{Text: } texto puro, diretamente processável.
		
		membros: Lista de Strings
	}	
\end{enumerate}

\subsection{Análise e Busca}

A extração de metadados é feita com base na estrutura do arquivo {\TeX} e com expressões regulares.
		
Consideramos que o autor irá usar os comandos {\TeX} para especificar título, autor e outras informações.

Alguns metadados não estão presentes nos arquivos em si.  Estes serão fornecidos de outra forma, provavelmente como uma configuração do programa.

\subsection{Geração do Arquivo}

Várias ferramentas foram estudadas para a geração do XML.
		
A escolha inicial era gerar o XML de uma forma ``hard coded'', baseado na versão atual do DTD ``euclid\_issue.dtd'' e estender, em uma versão futura da ferramenta, para geração de XML dado um DTD qualquer.

Acreditamos que esta seja a melhor opção, mas já foram estudadas algumas alternativas de gerar o arquivo de forma mais independente.

\subsection{Continuação do Desenvolvimento}

Seria interessante implementar outros algoritmos de extração de metadados, para complementar os dados extraídos.

\begin{itemize}
	\item Existem ótimos algoritmos de extração de palavras-chave que podem beneficiar os metadados referentes aos artigos
	\item Os metadados extraídos podem estar incompletos, existem possibilidades de estender o programa para utilizar mais estratégias ou estratégias melhores
\end{itemize}

\newpage
\section{Conclusões}

\subsection{Resultados}

Apesar da aparente simplicidade da definição da ferramenta, e da estrutura definida para a linguagem {\TeX} , não foi possível completar o seu desenvolvimento. Problemas com o escopo da ferramenta fizeram com que a fase de programação demorasse muito para começar.

Ao final do desenvolvimento, temos apenas uma ferramenta incompleta. O software ainda não gera os arquivos desejados, apesar de já conter a estrutura básica para tanto. Falta desenvolver:

\begin{enumerate}
	\item Módulo de geração do arquivo XML
	\item Código de busca de informações
	\item Melhorar o parser, que ainda tem muitas limitações
\end{enumerate}

\subsection{Próximos passos do desenvolvimento}

Após o desenvolvimento das características finais da ferramenta, indicadas na seção anterior, ainda há o que melhorar no projeto:

\begin{enumerate}
	\item{
		\textbf{Busca de metadados que não estão presentes nos documentos processados}, mas que existem no arquivo compilado.
		
		Apesar de podermos encontrar muitos metadados interessantes, de forma fácil, usando a estrutura do {\TeX}, temos o problema de não termos acesso fácil a estrutura do arquivo pdf final.
		
		Ao compilar o {\TeX}, em um pdf, temos outras características que não aparecem no texto puro, como número de páginas.
	}
	\item{
		\textbf{Determinação de língua utilizada nos abstract}
		
		A ferramenta deveria ser capaz de determinar a língua na qual o abstract foi escrito, visto que isso faz parte da especificação do ``euclid\_issue.dtd''. Se não temos informações de idioma, supõe-se o inglês, que pode não ser verdade.
	}
	\item{
		\textbf{Determinação correta de nomes, separando nome e sobrenome}
		
		Apesar de podermos simplificar a extração de nomes, temos o problema de extrair a estrutura do nome, isto é, dado que podemos ler ``José David Fernández Curado'', gostaríamos de determinar que ``José David'' é o nome e ``Fernández Curado'' é o sobrenome.
	}
\end{enumerate}

\newpage
\section{Bibliografia}

\bibliography{monografia}{}
\bibliographystyle{plain}

\newpage
\part{Parte Subjetiva}

\section{Desafios e Frustrações}

Ao longo deste projeto, me deparei com várias situações de desenvolvimento real de software, que já havia ouvido falar em outras disciplinas, como:

\begin{enumerate}
	\item{
		Dificuldade de fechar uma especificação para as funcionalidades necessárias para o sistema
		
		Demorei muito para fechar detalhes suficientes da especificação a fim de me sentir confortável desenvolvendo algumas partes do trabalho.
		
		Apesar de ser um projeto aparentemente simples, foi necessário definir algumas restrições como:
		\begin{itemize}
			\item detecção de linguagem do abstract (definimos que será sempre a mesma linguagem)
			\item geração do XML flexível ou ``hard-coded'' (definimos que será hard-coded com a possibilidade de mudar esse aspecto no futuro)
			\item questões relacionadas à definição de metadados necessários, mas que, obviamente, não poderiam ser extraídos do textos, como integrantes fixos da revista, por exemplo editores.
		\end{itemize}
	}
	\item{
		Dificuldade de aprender as ferramentas disponíveis.
		
		Apesar de já ter utilizado muitas das ferramentas, problemas com relação a escolha de ferramenta para geração de XML foram frequentes, e problemas com relação a métodos disponíveis de parsing de DTD.
	}
	\item{
		Dificuldade de encontrar padrões bem-estabelecidos para determinadas partes do software.
		
		Apesar de estarmos utilizando elementos bem comuns na computação como {\TeX} e XML, não encontramos ferramentas conhecidas e testadas de parsing de {\TeX} (apenas parsing, sem geração de pdf) e de parsing de DTD, para gerar XML a partir deste DTD.
		
		Para gerar o XML, escolhemos, mas ainda não implementamos, um método hard-coded que não leva em consideração o DTD.
	}
\end{enumerate}

\newpage
\section{Disciplinas relevantes}

Entre os conhecimentos mais usados podemos citar:

\begin{enumerate}
	\item{
		\textbf{Laboratório de Programação: } JavaCC e {\TeX}.
		
		Da disciplina aprendi a utilizar o JavaCC ao fazer um compilador para uma linguagem definida durante a matéria, e aprendi sobre a ferramenta {\LaTeX}.
		
		Foi a disciplina que me deu base para fazer todo o código do parser, tanto do lado do JavaCC quanto o conhecimento necessário de {\TeX}
	}
	\item{
		\textbf{Linguagens Formais e Autômatos: } Idéia do algoritmo.
		
		Todo o algoritmo foi pensado em termos de Gramáticas para {\TeX} e as regras de extração, baseadas em Gramáticas Regulares.
		
		Inicialmente, e antes mesmo, de estudar outras técnicas de extração de metadados, o algoritmo mais obvio nasceu de conhecimentos de Linguagens Formais e Autômatos.
		
		Visto que eu sabia que ia processar arquivos {\TeX}  e que esses deviam corresponder a alguma gramática, a idéia mais obvia para a resolução deste problema é através de Gramáticas.
		
		Apesar de ter encontrado pessoas que afirmam que {\TeX} não define realmente uma Gramática simples, pois a linguagem permite extensões e criação de novos comandos e estruturas, o desenvolvimento de um parser simples para um subconjunto muito usado dos comandos de {\TeX} é relativamente fácil, apesar de um pouco trabalhoso.
	}
	\item{
		\textbf{Inteligência Artificial, Sistemas Baseados em Conhecimentos e Redes Neurais (IPN0007): } Bases para o entendimento de muitos dos Algoritmos conhecidos de extração de Metadados.
		
		Durante o levantamento de informações sobre outras técnicas de extração de Metadados foram muito úteis os conhecimentos da área de I.A. aprendidos nestas 3 disciplinas, pois ajudaram a compreender mais tranquilamente os algoritmos e as classificações dadas a eles.
		
		Em particular, é um uso direto deste conhecimento aprender sobre os diversos algoritmos fortemente baseados em I.A. e Sistemas Baseados em Conhecimentos.
	}
	\item{
		\textbf{Conceitos Fundamentais de Linguagem de Programação: } Parsers e JavaCC
		
		Apesar de aprender a utilizar a ferramenta JavaCC em Laboratório de Programação II, só foi em Conceitos Fundamentais que muitas das questões envolvendo o Parser gerado pelo JavaCC foram resolvidas.
		
		Questões como limitações do parser e características da linguagem gerada só foram respondidas com conhecimentos de Conceitos e Autômatos.
	}
\end{enumerate}

Vale lembrar, também, que boa parte do entendimento das gramáticas geradas com o JavaCC, e o entendimento das limitações de Processamento de Linguagem Natural, vem das disciplinas de Conceitos e Autômatos.

Questões de eficiência, relacionadas a gramáticas mais poderosas da hierarquia de Chomsky, só são mencionadas nestas matérias, mas pouco estudadas, mas são bem importantes para aprender bem o conceito necessário para estudar essa área.

\newpage
\section{Observações}

A aplicação de conceitos estudados foi bem direta, já que eu trabalhei bastante na construção de um parser, o que é uma aplicação direta dos conhecimentos de Linguagens Formais e Autômatos.

Outras aplicações, no entanto foram ainda mais diretas, como conhecimentos de JavaCC adquiridos em Laboratório de Programação e a experiência prática em desenvolver um parser.

Conhecimento prático de desenvolvimento de parsers ajudou muito na execução do trabalho e na idealização do algoritmo. Certamente o projeto poderia ter sido muito mais complicado se eu não tivesse esses conhecimentos a priori.

Notei também a interação forte entre Linguagens Formais e Inteligência Artificial, que nunca tinha sido tão evidente para mim. Muitos algoritmos estudados são de I.A. e usam, de forma completamente transparente, gramáticas e parsers como ferramentas, mas esse fato nunca apareceu de forma tão obvia em aula.

Essa parte de I.A. é uma parte que eu, infelizmente, não estudei em aula, mas acabei estudando durante este projeto.

\newpage
\section{Continuação}

Conhecimentos relevantes para continuar a desenvolver-se nessa área são:

\begin{enumerate}
	\item{
		\textbf{Inteligência Artificial: } especificamente a área de processamento de linguagem natural e raciocinadores
		
		Obviamente I.A. está presente em muitos algoritmos desta área, então são fundamentais sólidos conhecimentos de I.A. nas áreas de extração de informação e raciocinadores.
		
		$PLN$ é uma área que tem grande potencial para produzir grandes idéias para a área de extração de Metadados, e técnicas baseadas em programação lógica são muito utilizadas nos algoritmos conhecidos.
	}
	\item{
		\textbf{Sistemas baseados em Conhecimento: } representação de conhecimento
		
		Alguns algoritmos desta área levam em conta a capacidade de um programa guardar conhecimento e indexar esse conhecimento. Uma das grandes dificuldades de ``Raciocínio baseado em casos'' é exatamente essa.
		
		Ser capaz de armazenar conhecimento e acessá-lo torna-se crucial na execução desses algoritmos, e precisa ser muito bem estudado.
	}
	\item{
		\textbf{Redes Neurais: } Representação de conhecimento e Algoritmos de Aprendizado
		
		A área de Redes Neurais pode ser muito útil ao entendimento de muitos dos algoritmos propostos, pois fornece uma boa base de conhecimento sobre algoritmos de aprendizado de máquina.
		
		Muitos dos modelos de R.N.A.s fornecem muitas experiências úteis para este domínio de conhecimento. Em particular conhecimento sobre memória e modelos para a memória.
		
		R.N.A.s colocam o estudante em contato com outros exemplos de memória como ``memória reflexiva'' e enriquecem o conhecimento do aluno sobre essa área.
	}
	\item{
		\textbf{Linguagens Formais e Autômatos e Conceitos Fundamentais de Linguagem de Programação: } Gramáticas
		
		É absolutamente necessário que alguém que pretenda estudar esses algoritmos tenha um sólido conhecimento nessas áreas.
		
		Mais especificamente em Linguagens Formais, que formam a base dos algoritmos de Análises Sintáticas e Léxicas e dos parsers necessários em qualquer processamento de texto.
	}	
\end{enumerate}

\end{document}
