1
UNIVERSIDADE SÃO FRANCISCO
Engenharia de Computação
VAGNER PINTO DUTRA
REDES NEURAIS E O RECONHECIMENTO DE
PADRÕES DE TEXTO
Itatiba 2011
2
VAGNER PINTO DUTRA – RA 002200700552
REDES NEURAIS E O RECONHECIMENTO DE PADRÕES DE TEXTO
Monografia apresentada ao Curso de Engenharia de Computação da Universidade São Francisco, como requisito parcial para obtenção do título de Bacharel em Engenharia de Computação. Orientador: Prof. Silvio Petroli Neto
Itatiba 2011
3
AGRADECIMENTOS
Agradeço primeiramente a Deus que me proporcionou esclarecimento
sobre o assunto e vontade para querer obter cada vez mais conhecimento.
É necessário também agradecer a todos os autores citados nesta obra e
aqueles que estão nas referências, pois sem eles nada disto seria possível.
Agradeço a meus familiares e amigos, que tiveram paciência e
sabedoria para aceitar meus momentos de ausência. Em especial para Denisi,
Francisca, Vitor, Ronaldo, Dorival e Regiane.
Ao meu orientador Profº Silvio Petroli Neto pela cobranças e ao Profº
Márcio Zuchini pelos conselhos e dicas no desenvolvimento deste trabalho e
seus resultados.
Bem como a todos os meus colegas de sala que estão nesta mesma luta
desde 2007 e aqueles que encontramos pelo caminho, porém com a mesma
vontade de fazer a diferença.
4
“VENI, VIDI, VICI” (em português “Vim, vi, venci”)
Julio César 47 a.C.
5
RESUMO
Este trabalho visa o desenvolvimento de uma rotina de reconhecimento de padrões de texto utilizando Redes Neurais Artificiais com um Algoritmo de Aprendizagem Competitivo, a fim de classificar os textos das entradas conforme seu contexto. Através da implementação de mapas auto-organizáveis, ou Mapas de Kohonen, foram aplicados métodos de recuperação de informação e cálculos de freqüência em documentos distintos, os quais tinham como tema “esporte” e “culinária”, respectivamente, separando-os em agrupamentos (clusters). Ao utilizar conceitos semânticos para definir atributos para os termos encontrados nos textos foram apresentados padrões de entrada a rede que culminaram em um mapa topológico, e a partir de então, o mesmo pode ilustrar o clustering dos termos de acordo com seu contexto (assunto).
6
ABSTRACT
This work aims to develop a procedure of text pattern recognition using Artificial Neural Networks with a Algorithm of Competitive Learning in order to classify the input texts as its context. Through the implementation of self-organizing maps, or Kohonen Maps, were applied methods of information retrieval and frequency calculations in different documents about "sport" and "cooking", respectively, separating them into clusters. By using semantic concepts to define attributes for the terms found in the texts were presented to the network the input patterns resulting in a topological map, and from then on, that can illustrate a clustering of terms in a according to their context (subject).
7
LISTA DE EQUAÇÕES Equação 1 ........................................................................................................ 14
Equação 2 ........................................................................................................ 28
Equação 3 ........................................................................................................ 34
Equação 4 ........................................................................................................ 39
Equação 5 ........................................................................................................ 41
Equação 6 ........................................................................................................ 41
Equação 7 ........................................................................................................ 42
Equação 8 ........................................................................................................ 42
Equação 9 ........................................................................................................ 42
Equação 10 ...................................................................................................... 43
Equação 11 ...................................................................................................... 44
Equação 12 ...................................................................................................... 49
Equação 13 ...................................................................................................... 50
Equação 14 ...................................................................................................... 51
Equação 15 ...................................................................................................... 51
Equação 16 ...................................................................................................... 53
8
LISTA DE FIGURAS
Figura 1: Neurônio Biológico ............................................................................ 13
Figura 2: Neurônio de McCulloch e Pitts com limiar explícito .......................... 15
Figura 3: RNA com o JavaNNS. ....................................................................... 20
Figura 4: RNAs Completamente e Fracamente ligadas ................................... 22
Figura 5: Aprendizado Supervisionado ............................................................ 24
Figura 6: Aprendizado por Reforço .................................................................. 27
Figura 7: Arquitetura FeedForward .................................................................. 31
Figura 8: Fluxo do Algoritmo BackPropagation ................................................ 33
Figura 9: Processo de Normalização. .............................................................. 37
Figura 10: Grade Bidimensional ....................................................................... 38
Figura 11: Algoritmo de Poter ........................................................................... 47
Figura 12: Matriz-U em cores ........................................................................... 58
Figura 13: Matriz-U em escala de cinza ........................................................... 58
9
Sumário 1 INTRODUÇÃO ....................................................................................................11 2 OBJETIVO ..........................................................................................................12 3 FUNDAMENTOS BIOLÓGICOS .........................................................................13 4 REDES NEURAIS ARTIFICIAIS .........................................................................14 4.1 APLICAÇÕES ...................................................................................................15 4.2 MÉTODOS DE APRENDIZADO ......................................................................16 4.3 RECONHECIMENTO DE PADRÃO..................................................................17 4.4 PADRÕES DE TEXTO COM JAVA ..................................................................18 4.5 ARQUITETURA DAS RNAS ............................................................................21 5 APRENDIZADO NAS REDES NEURAIS ARTIFICIAIS .....................................23 5.1 APRENDIZADO SUPERVISIONADO ..............................................................23 5.2 APRENDIZADO NÃO SUPERVISIONADO .....................................................24 5.3 APRENDIZADO HEBBIANO ............................................................................25 5.4 APRENDIZADO POR REFORÇO ....................................................................26 5.5 APRENDIZADO COMPETITIVO ......................................................................27 6 REDES NEURAIS COM FEEDFORWARD ........................................................30 6.1 MÉTODO BACKPROPAGATION......................................................................32 7 MAPAS AUTO-ORGANIZÁVEIS (SOM) ............................................................35 7.1 ESTRUTURA DOS MAPAS AUTO-ORGANIZÁVEIS ......................................36 7.1.1 COMPETIÇÃO...............................................................................................39 7.1.2 COOPERAÇÃO..............................................................................................40 7.1.3 ADAPTAÇÃO SINÁPTICA.............................................................................42 7.2 ESPAÇO DE ENTRADA...................................................................................43 7.2.1 NORMALIZAÇÃO...........................................................................................44 8 RECUPERAÇÃO DE INFORMAÇÃO........................ ..........................................46
10
8.1 REDUÇÃO DE CONTEXTO..............................................................................46 8.2 MÉTODOS DE RECUPERAÇÃO DE INFORMAÇÃO......................................48 8.2.1 MÉTODO BOOLEANO...................................................................................48 8.2.2 MÉTODO DE ESPAÇO VETORIAL...............................................................50 8.2.3 SOM SEMÂNTICO.........................................................................................51 9 IMPLEMENTAÇÃO.................................... ..........................................................54 9.1 RADICALIZAÇÃO..............................................................................................55 9.2 ATRIBUTOS......................................................................................................56 9.3 RESULTADOS..................................................................................................57 10 CONCLUSÃO....................................... .............................................................60 REFERÊNCIA BIBLIOGRÁFICAS ..................................................................61 APÊNDICE A......................................... ............................................................63 APÊNDICE B......................................... ............................................................65 APÊNDICE C.....................................................................................................77 APÊNDICE D.....................................................................................................78
11
1 INTRODUÇÃO
Atualmente, as Redes Neurais vem sendo umas das melhores opções
dentre as possíveis ferramentas de reconhecimento de padrões. Podemos
citar, dentre os estudos existentes, o reconhecimento de padrões de fala,
escrita, caracteres e símbolos, sendo estes padrões gerados pela integração
de n processamentos realizados pelos neurônios artificiais, a fim de simular ou
se inspirar na capacidade cerebral humana.
Ao reconhecimento e a segmentação de padrões, podemos unir a
capacidade de tomada de decisões autônomas das Redes Neurais Artificiais,
tendo como base algoritmos de aprendizagem que ajustam os valores das
saídas da rede até alcançar os resultados desejados.
As redes neurais, fundamentalmente, são conjuntos de células de
processamento (neurônios ou nós) interconectados, nos quais cada célula
pode se conectar à outras, formando assim uma complexa rede de
processamento, distribuição e armazenamento de informações. Essas redes
são geralmente empregadas para aplicações de controle de processos na
indústria química, reconhecimento de fala e programas adaptativos tais como
agentes inteligentes e robótica autônoma.
Na WEB temos uma fonte praticamente inesgotável de dados, mas essa
exige que conhecimento humano separe quais são informações válidas
daquelas que são apenas especulações sem sentido. Grandes sites de notícias
possuem fundamento e integridade para serem considerados fontes confiáveis
de informação. Resta aos profissionais da área da informação saber como
utilizar este recurso para treinar rotinas de inteligência artificial, como as Redes
Neurais. É nesta prática que se estrutura este trabalho.
12
2 OBJETIVO
Este trabalho tem por objetivo utilizar a tecnologia empregada nas Redes
Neurais Artificiais para reconhecimento de padrões das fontes de
conhecimento público na WEB, mais especificamente, os grandes sites de
notíci, como por exemplo, UOL, Terra, G1, IG, Yahoo e MSN.
A partir do acúmulo de conhecimento adquirido por “leitura” dessas notícias
da WEB, seja via FTP ou via arquivos de texto, a RNA aplicada irá identificar e
segmentar os assuntos “lidos” em tópicos. Através de métodos de recuperação
de informação destes textos buscou-se desenvolver padrões de entrada
baseados em conceitos semânticos, aumentando a efetividade da aplicação
das Redes Neurais Artificiais (RNA).
O intuito maior do trabalho é desenvolver uma ferramenta que possa
realizar reconhecimento de palavras a partir de um meio de alimentação,
utilizando método de mapas auto-organizáveis. Através das entradas
fornecidas pelos textos, seja por WEB ou por documentos de texto comum,
montar padrões de texto que possam ser subdivididos em categorias como
política, culinária, esportes ou cinema. Este conceito poderia ser utilizado por
sites de busca para aperfeiçoar o filtro de informações.
13
3 FUNDAMENTOS BIOLÓGICOS
O cérebro humano é constituído por aproximadamente 10 bilhões de
neurônios interconectados. Esta rede formada pelos neurônios é capaz de
processar milhões de informações e realizar em torno de 60 trilhões de
ligações sinápticas (VALENÇA, 2007).
Apesar de estes neurônios realizarem processamentos individualmente
lentos, em grande escala são capazes de realizar processamentos muito mais
rápidos do que a maior velocidade de processamento que os computadores
existentes alcançam, pois conforme citado acima, os neurônios podem
processar trilhões de operações paralelamente .
O neurônio biológico, Figura 1, é constituído por um corpo celular ligado por
ramificações, chamadas de dendritos. Deste corpo sai uma extensão chamada
axônio, que possui um terminal denominado de telodentro.
Sinapse é a seção onde dois neurônios estão ligados e através de pulsos
nervosos se comunicam. Os impulsos recebidos por um neurônio são
processados até atingir um limiar de ação, que produz uma substância
neutransmissora que flui do corpo celular para o axônio que esta conectado a
um dendrito de outro neurônio.
Figura 1: Neurônio Biológico
Segundo Valença (2007), com esta formação constitui-se a Lei do Tudo ou
Nada. Esta lei está relacionada com a intensidade do estímulo, chamado de
limiar excitatório, relativo ao impulso nervoso citado anteriormente. Ou seja, se
o estímulo for muito pequeno, menor que o limiar, sua intensidade será igual a
zero e caso a excitação for maior ou igual a este limiar, o potencial de ação
será sempre o mesmo. Ou Tudo ou Nada.
14
4 REDES NEURAIS ARTIFICIAIS
Através dos estudos das Redes Neurais biológicas caracterizaram-se as
Redes Neurais Artificiais (RNA). Perceberam que com esta metodologia
poderiam resolver problemas de finalidades não algorítmicas ao simular
reconhecimento de resolução de problemas que apenas o cérebro humano
seria capaz de realizar.
A primeira proposta matemática de uma RNA foi feita em 1943 pela dupla
McCulloch e Pitts que buscaram, de maneira muito simples, representar os
neurônios biológicos utilizando uma regra de propagação e uma função de
ativação. No qual a emissão de sinal por este neurônio está baseada na Lei do
Tudo ou Nada conforme descrito anteriormente.
Conforme apresentado por Valença (2007), considere x 1, x 2, x 3, ..., x n,
como sendo as variáveis de entrada xj ( j = 1,...,n) do neurônio de saída i . A
entrada líquida neti é dada pela seguinte regra de propagação da Equação 1:
∑=
−=n
jjiji XWnet
1
θ
Equação 1 No qual ijW é o vetor dos pesos sinápticos entre o neurônio vencedor i e o
neurônio de entrada j e Θ é o limiar, como na Figura 2.
15
Figura 2: Neurônio de McCulloch e Pitts com limiar explícito (Valença, 2007). Xn representa a camada de entrada que esta conectada ao neurônio de saída pelos vetores de peso sinápticos W1n.
Com isso criou-se o conceito das RNAs. Geralmente esta rede é conectada
por canais de comunicação associados com pesos. As unidades fazem as
operações de entrada tendo como base as conexões, gerando interações entre
os nós desta rede a fim de criar um comportamento inteligente.
As Redes Neurais Artificiais tem como características sua capacidades de
fazer armazenamento associativo de informações, Robustez, Modelos
adaptativos através de treinamento, capacidade de generalizar informações
incompletas e grande paralelismo.
Deve-se considerar que as RNAs não foram desenvolvidas com a finalidade
de simular ou copiar o funcionamento do cérebro biológico, mas como um
modelo para resolução de problemas não algorítmicos inspirados na incrível
capacidade de processamento e de reconhecimento de padrões do cérebro
humano.
4.1 Aplicações
Atualmente as RNAs estão sendo aplicadas em várias áreas do
conhecimento, começando pelo reconhecimento de padrões, partindo para o
mercado de capitais, distribuição de energia elétrica e sistemas especialistas.
16
Como exemplo de aplicação pode-se citar o reconhecimento facial, sendo
usados para identificar a quem pertence um rosto visto em posições diversas
ou realizar a reconstrução de rostos parcialmente visualizados.
Ao empregar uma rede neural multi-nível treinando-a para o
reconhecimento de padrões de face e de objetivos não-face, a RNA realiza
uma busca baseada nas medidas de distância, existindo dois principais
componentes: uma rede capaz de detectar padrões e um módulo de decisão
para tomar a decisão dentre vários resultados detectados (CERA, 2005).
Nos casos de reconhecimento de padrões de voz são seguidos 4 passos
básicos. Primeiro a fala deve ser digitalizada, depois se realiza um computação
das características que representam o domínio espectral da fala. No próximo
passo é usada uma rede neural para realizar a classificação das características
fonéticas e por fim aplica-se o método de busca para associar as saídas com
padrões de palavras para encontrar aquela que mais se assemelha.
O Reconhecimento de caracteres é mais uma aplicação famosa das redes
neurais, sendo amplamente usado no reconhecimento de manuscritos.
Geralmente, a letra é apresentada a uma grade similar a retina. Cada grade é
referente a um neurônio da rede e as saídas são os neurônios que
representam as letras. Por exemplo, um identificar de caracteres da tabela
ASCII possuí 256 neurônios.
Também abordado com bastante ênfase nas técnicas de manipulação
simbólica, onde as letras encontram-se colocadas em diversas posições ou no
caso de manuscritos. Mesmo que no este último ainda esteja em processo de
desenvolvimento e otimização.
4.2 Métodos de Aprendizado
A RNA possui a capacidade de aprender e realizar interpolações destas
lições, determinando a intensidade de conexões entre neurônios. Como o
conhecimento armazenado está em suas conexões, entre processo, recebe o
nome de conexionismo.
O Algoritmo responsável pelo aprendizado é um conjunto de regras
desenvolvidas para a resolução do problema do aprendizado. Existem
17
inúmeros tipos de algoritmo de aprendizado, estando diretamente relacionado
ao tipo de RNA aplicada. Estes algoritmos se diferenciam entre si pelo método
de classificação e modificação dos pesos de suas conexões.
Entre os métodos de aprendizado podemos destacar:
• Aprendizado Supervisionado;
• Aprendizado Não Supervisionado;
• Aprendizado Hebbiano;
• Aprendizado por Reforço;
• Aprendizado por Competição.
Veremos todos esses métodos detalhadamente no capítulo 5.
4.3 Reconhecimento de Padrão
O Reconhecimento de padrão é uma das principais aplicações das redes
neurais artificiais. Por exemplo, os seres humanos são excelentes no
reconhecimento de rostos, músicas, textos, letras e símbolos. Os cães por sua
vez são exímios em reconhecer odores e muitos dizem até que possuem a
capacidade de identificar o humor de seus donos.
Em 1958 foi desenvolvida por Frank Rosenblatt uma rede neural que era
capaz de reconhecer padrões através de uma regra de aprendizagem
supervisionada que gerou grande interesse dos pesquisadores pela área. Esta
RNA recebeu o nome de Perceptron, que utilizada da abordagem simbólica
para classificar padrões de letras.
Para que uma rede neural torne-se capaz de reconhecer padrões, sejam
eles símbolos, faces, voz, etc., inicialmente a estrutura da rede é treinada,
adquirindo conhecimento, para então identificar os padrões almejados.
Ajustando os pesos das conexões sinápticas a cada iteração, sendo
supervisionado ou não, para que o erro seja cada vez menor e a saída torne-se
cada vez mais próxima da desejada.
Os estudos de reconhecimento de padrões dividem-se em duas
categorias: de reconhecimento de itens abstratos e a de reconhecimento dos
18
itens concretos. O reconhecimento de itens concretos engloba os padrões de
voz, faces, objetos e características como escrita. Já os abstratos trabalham
com resolução de problemas e seus métodos.
Por sua vez existem três níveis de processamentos envolvidos no
reconhecimento de padrões: filtragem das entradas, identificação das
características e classificação dos resultados. O filtro de entrada tem o objetivo
de eliminar os dados desnecessários apresentado nas entradas, deixando
apenas informações concisas para serem analisadas. A identificação das
características consiste em analisar os dados de entrada e destinar as
informações úteis para o processo de reconhecimento e classificação. Por fim a
classificação determina a qual categoria presente na saída da rede a entrada
pertence, gerando desta forma o agrupamento dos padrões de entrada.
4.4 Padrões de Texto com Java
Este trabalho visa utilizar aplicar o reconhecimento de palavras para montar
agrupamentos a partir de orações identificadas em textos completos. Para
alcançar este objetivo serão utilizadas as ferramentas de desenvolvimento
JAVA. Existem simuladores de reconhecimento de padrões desenvolvidas
nessa linguagem e através de estudos básicos, pode-se firmar o objetivo deste
trabalho.
Assim como o reconhecimento de caracteres, os padrões de texto podem
ser utilizados não só para especificar e identificar uma simbologia, mas de
forma mais abstrata utilizar esta capacidade das RNAs para separar orações
completas e através de neurônios de saída classificar seus significados. Por
exemplo, ao negar alguma coisa ou demonstrar afeto através de orações como
“Não gostaria de receber...” e “Possuo carinho por...”, os neurônios biológicos
realizam uma associação cognitiva com experiências passadas, agrupando de
maneira topológica padrões semelhantes de entrada. Este tipo de
agrupamentos é esperado da RNA, obviamente que não será tão preciso
quanto o reconhecimento humano, mas pode apresentar resultados próximos
aos agrupamentos do córtex cerebral como veremos no capítulo 9.
19
O “Aprendizado” inicialmente deve ser “Supervisionado” ou de “Reforço” e
quando uma grande quantidade de informações estiver disposta na rede, o
mesmo pode ser alterado para “Não-Supervisionado”, compreendendo que a
cada iteração da rede a mesma deverá se aproximar do significado desejado
na oração de entrada, dependendo do método escolhido para a aplicação.
Como iniciativa buscou-se simulações simples com caracteres ou números
para demonstrar que é possível alcançar um nível próximo de reconhecimento
de padrão. O simulador aplicado foi desenvolvido em JAVA pelo SNNS
(Stuttgart Neural Network Simulator) que foi desenvolvido no Institute for
Parallel and Distributed High Performance Systems (IPVR) da Universidade de
Stuttgart.
As informações processadas dentro dos neurônios no SNNS são
modeladas através de funções de ativação e funções de saída. A função de
ativação de uma unidade primeiramente computa os dados de entrada que
foram provenientes de dados de saída de unidades anteriores. Depois disso ele
computa um novo valor de ativação gerado a partir das entradas e
possivelmente a partir das ativações anteriores. A função de saída toma o
resultado gerado pela função de ativação para gerar a saída da unidade. Essas
funções podem ser funções arbitrárias ligadas ao kernel do simulador e podem
ser diferente para cada unidade.
Conforme os estudos de Cera (2005) ao utilizar de 26 unidades de saída
que representem as letras do alfabeto a serem reconhecidas, as entradas são
aplicadas no simulador que realiza interações internas e verifica com as saídas
qual é a mais aproximada. Apresentado conforme a Figura 3:
20
Figura 3: RNA com o JavaNNS - (CERA, 2005). Simulação de reconhecimento de caracteres utilizando o software SNNS. Matriz de neurônios de entrada [5 x 7], com camada intermediária e 26 unidades de saída, utilizando algoritmo backpropagation.
Nos casos de reconhecimento de números emprega-se a mesma técnica,
porém essa rede é composta por 35 unidades processadoras no primeiro nível
ou nível de entrada, onde a entrada terá a mesma função que na rede para
reconhecimento de caracteres. O segundo nível ou nível intermediário possui
10 unidades processadoras e no último nível têm-se 10 unidades que
representam a saída da rede, ou seja, os números de 0 a 9.
Para que o padrão seja identificado o JNNS ( SNNS em JAVA) dispõe de
um aplicações onde os padrões são estipulados através de um arquivo com
extensão “.pat”, fornecendo a configuração das entradas e saídas do sistema.
Com isso identificamos que os mesmo passos podem ser realizados para
tratar frases inteiras e os estudos realizados a partir deste ponto utilizaram o
simulador com a estrutura para textos, o desenvolvimento de arquivos que
possam servir de entrada para o simulador e outras diversas aplicações
usando as ferramentas JAVA, assim como feito no trabalho de Cera (2005).
21
4.5 Arquitetura das RNAs
Antes de definirmos qual algoritmo de aprendizado iremos utilizar é
necessário entender a arquitetura da RNAs. Enganam-se aqueles que acham
que existe apenas uma ou duas topologias utilizadas para representar uma
Rede Neural, são várias existentes e suas aplicações estão diretamente
ligadas aos problemas que podem ser tratados por elas e como iremos treiná-
las. Podemos classificá-las quanto ao número de camadas, tipo de conexões
ou mesmo a conectividade (BRAGA, 2007).
Quanto ao número de camadas temos a arquitetura MCP que possuí
uma única camada (saída), utilizada em grande parte para resolver problemas
linearmente separáveis, por exemplo, separar em domínios diferentes
retângulos de círculos. Conhecida como rede camada única (HAYKIN, 2002) é
constituída por uma camada de entrada seguida de uma camada de saída sem
retorno. Ou seja, a camada de saída não retorna qualquer informação para a
entrada, podemos dizer que isso é alimentação adiante ou feedfoward. Em
alguns livros vamos encontrar o termo rede acíclica. Vale ressaltar que é
chamada de camada única porque a camada de entrada não é considerada, já
que não existe lógica computacional em seus nós.
Ainda na classificação por número de camadas temos as Redes de
Múltiplas Camadas, que se diferem da MCP por possuir entre a entrada e a
saída algumas camadas denominadas ocultas que possuem a função de
atribuir conjuntos adicionais de conexões sinápticas, existindo interação a cada
camada que a informação passa. Assim como as MCP são feedfoward, ou
seja, os próximos nós são alimentados com as informações dos nós anteriores
e assim por diante, sem realimentação. Seu uso tem foco principal para
levantamentos estatísticos, sendo que em problemas de ordem estatística de
alta complexidade são particularmente eficientes principalmente quando a
camada de entrada é de um tamanho maior que o convencional (HAYKIN,
2002).
As Redes Recorrentes fecham as arquiteturas das RNAs. Diferentes das
Redes de Múltiplas Camadas apenas por seu sistema de alimentação, sendo
conhecidas por cíclicas e possuem pelo menos um neurônio com
realimentação, denominado feedback. Desta forma um neurônio de uma
22
camada mais próxima da saída pode alimentar com informações as camadas
anteriores, até mesmo a camada de entrada. Esta arquitetura é empregada
para resolver problemas de âmbito temporal. Variação do valor das ações na
bolsa de valores seria um bom exemplo. Vale ressaltar que as Redes
Recorrentes não possuem a necessidade de ter camadas ocultas podendo
seguir o padrão da MCP, apenas entrada e saídas, mas com feedback.
Referindo-se a métodos de alimentação, ou podemos dizer conexões
(BRAGA, 2007), temos como citado acima FeedFoward e FeedBack. Podemos
considerar FeedFoward como um método de alimentação onde a saída de um
neurônio na i-ésima camada não pode servir como entrada para um neurônio
de uma cada i inferior, apenas para neurônios que o procedem na cadeia. Por
usa vez o FeedBack é exatamente o contrário, considerado método de
realimentação segue a lógica que um neurônio de uma cada i pode servir de
entrada para qualquer neurônio de uma outra camada inferior ou igual, onde se
todas as ligações estiverem em clico são conhecidas como rede auto-
associativa. Estes métodos de alimentação também são chamados de Acíclico
e Cíclico respectivamente (BRAGA, 2007).
As RNAs ainda podem se fracamente ligadas ou completamente ligadas.
Fracamente significa que nem todos os neurônios estão conectados no sistema
e completamente ligados são aqueles onde todos os nós estão conectados
com todos os demais nós da RNA. Conforme Figura 4:
a) Completamente Conectada b) Fracamente Conectada
Figura 4: RNAs Completamente e Fracamente ligadas.
23
5 APRENDIZADO NAS REDES NEURAIS ARTIFICIAIS
Dentre as características mais importantes das RNAs está sua habilidade
para aprender com o ambiente proposto e com isso melhorar o desempenho.
Isso é feito através de um processo iterativo de ajustes aplicado a seus pesos,
denominado treinamento.
O aprendizado ocorre quando a rede neural atinge uma solução
generalizada para uma classe de problemas, produzindo diferentes
comportamentos a um estímulo externo devido à excitações recebidas do
passado, adquirindo conhecimento. Em IA podemos associar como o principal
fundamento de um comportamento inteligente.
5.1 Aprendizado Supervisionado
Método de aprendizado supervisionado é mais comumente encontrado
quando falamos de treinamento de Redes Neurais, isto acontece devido a
facilidade de controlar seus resultados. Tanto entradas quanto saídas são
informadas por um supervisor, ou professor em alguns livros (HAYKIN, 2002),
que tem conhecimento sobre o ambiente. Com este conceito é fácil perceber
que o supervisor irá fornecer o resultado que espera obter com uma
determinada entrada e a RNA irá comparar com a saída real.
Neste momento é definido um valor de erro que será tratado
posteriormente, de maneira incremental a RNA tenta minimizar o erro até um
ponto de resultado ótimo. Porém a desvantagem deste método é que sem um
professor a rede perde seu propósito e não conseguirá aprender novos
meandros para resolver problemas propostos que estejam fora do ciclo de
treinamento inicial.
A regra de delta criada por Widrow e Hoff em meados dos ano 60 é o
mais conhecido algoritmo utilizado para este método, assim como sua
generalização para múltiplas camadas, o backpropagation que veremos com
mais detalhes nas seções posteriores.
Segue modelo, Figura 5, de Aprendizado Supervisionado proposto por
Braga em seu trabalho (BRAGA, 2007):
24
Figura 5: Aprendizado Supervisionado. A entrada é apresentada a RNA que calcula a saída e compara com a saída esperada pelo professor, calcula o erro e retorna à RNA.
5.2 Aprendizado Não Supervisionado
Como o nome já sugere, o método de aprendizagem não supervisionado
é determinado pela não existência de uma interferência externa com
conhecimento do ambiente, ou seja, um supervisor ou mesmo professor. Desta
forma os vetores de entrada são dados a RNA e esta por sua vez tenta
reconhecer padrões através da similaridade dos dados.
A redundância é um fator muito importante para este método, já que sem
ela não seria possível aplicá-lo. Através das características similares dos dados
de entrada que são reconhecidos os padrões. Normalmente apresentando
estruturas feedfoward, não necessitam ser obrigatoriamente de uma única
camada, apresentando inúmeras formas diferentes de aplicação.
É curioso pensar que apesar da semelhança entre o aprendizado
supervisionado e método humano de aprendizado é através do método não
supervisionado que grande parte do nosso sistema biológico reconhece o
ambiente, como audição e visão (BRAGA, 2007).
Através de relações estatísticas (freqüência) com que um padrão de
entrada é relacionado à saída é que os pesos sinápticos são ajustados, a fim
Professor
RNA Σ -
+
Entrada Erro
Saída
25
de tornar cada vez mais próxima uma saída da característica de uma
determinada entrada. Inicialmente é possível que haja erros, mas com um
período regular de treinamento e um ajuste dos pesos iniciais esta taxa de erro
é reduzida até o aceitável.
O “ótimo” é uma característica do método supervisionado, mas quando
falamos em classificação de dados e organização de classes o não
supervisionado se torna melhor. Neste trabalho iremos utilizar como ferramenta
uma variante do treinamento não supervisionado para alcançar nossos
resultados, a aprendizagem competitiva que será melhor descrita nos próximos
tópicos.
5.3 Aprendizado Hebbiano
Existem diversos métodos baseados nos aprendizado não
supervisionado, como o modelo de Linsker, Regra de Yuille e a Regra de Oja
ou o aprendizado estocástico de Bolztmann, mas o postulado de Hebb foi
escolhido para estar neste trabalho devido a sua importância histórica para as
RNAs.
O aprendizado Hebbiano é o mais famoso e mais antigo método de
aprendizado para RNAs. Donald Olding Hebb foi um neuropsicólogo
canadense que estudou os aspectos do comportamento e a aprendizagem
cognitiva. E fez uma importantes citação em seu livro Hebb (1949), The
Orgaization of Behavior:
Quando um axônio da célula A está perto o suficiente para excitar uma célula B e participa do seu disparo repetida ou persistentemente, então algum processo de crescimento ou modificação metabólica acontece em uma das células ou em ambas, de maneira tal que a eficácia de A como uma das células que dispara B é aumentada.
Hebb quis dizer com isso que os pesos das conexões sinápticas devem
ser ajustados caso haja co-relação entre as atividades das entradas e saídas.
Ou seja, se dois neurônios são sincronamente ativados há um fortalecimento
de suas ligações sinápticas. Em contrapartida, se não houver sincronismo entre
26
as ligações com outros neurônios, estas ligações serão enfraquecidas ou
mesmo deixarão de existir.
Segue no Apêndice A um exemplo, utilizando a linguagem JAVA, de
como funciona uma RNA básica utilizando o postulado de aprendizagem de
Hebb. Neste método um vetor de treinamento com a entrada e a saída é
fornecido para a RNA, mas como não existe um supervisor para determinar um
“bom ou ruim” para o resultado fornecido pela rede, o algoritmo de Hebb é
classificado como não supervisionado.
5.4 Aprendizado por Reforço
A aprendizagem por Reforço é um método peculiar variante do método
supervisionado, suas diferenças entretanto estão em como avaliam o resultado
obtido pela RNA e a saída desejada. Como visto anteriormente o método
supervisionado estipula um fator “ótimo” e ajusta os pesos sinápticos para
alcançar este objetivo, todavia o método por Reforço apenas indica se o
resultado está correto ou não.
Nos anos 90 Garey Tesauro fez um estudo com este método aplicando a
um jogo de Gamão desenvolvendo um programa chamado TD-Gammon, e
mesmo sem conhecer o jogo sobre as regras do gamão ou instruções pré-
programas o programa foi capaz de aprender e jogar. Através de tentativa e
erro o método de aprendizado por reforço faz interações com o ambiente a fim
de obter uma heurística. Esta heurística tem relação com o conceito de
aplicação temporal que este método possui (HAYKIN, 2002).
Em outras palavras, o aprendizado por reforço recebe uma indicação do
supervisor do resultado esperado e compara sua saída, determina se esta
correta ou não e inicia uma nova iteração no sistema. Desta forma ajusta seus
pesos sinápticos através de um sinal de reforço, buscando compatibilizar sua
saída com o que se espera que seja.
Pode ser classificada como associativa ou não-associativa, onde a
primeira significa que além do sinal de reforço o ambiente deve lhe fornecer
outras informações, enquanto o segundo trabalha apenas com o sinal de
reforço buscando apenas uma resposta de cunho “ótimo”.
27
Segue representação, Figura 6, de um sistema de aprendizado por
Reforço (BRAGA, 2007):
Figura 6: Aprendizado por Reforço. A RNA apresenta a saída que é analisada imediatamente pelo crítico, que pode “premiar” ou “punir” o agente de acordo com o resultado.
5.5 Aprendizado Competitivo
O aprendizado competitivo ou aprendizagem por competição será
utilizado no desenvolvimento do programa que é o objetivo deste trabalho.
Uma descrição curta do método competitivo seria dizer que este
algoritmo recebe os padrões de entrada e os classificam de acordo com os
pesos sinápticos atribuídos as saídas, ativando apenas aquela com o maior
resultado. Por isso o nome “competitivo”, pois de maneira literal os neurônios
da camada de saída competem com os demais para ser o ganhador. Para essa
definição dizemos que o vencedor ganha tudo, ou no original “Winner takes
All”.
A maneira mais comum de encontrarmos uma rede de aprendizado
competitivo é com duas camadas, sendo uma de entrada e outra de saída
(também denominada competitiva, DAYHOFF. 1990). No qual todos os
neurônios da camada de entrada estão ligados de maneira feedfoward com a
camada de saída. Com isso ao ser reconhecido um padrão os pesos sinápticos
para com aquela saída são fortalecidos e por conseqüência em uma próxima
apresentação do mesmo padrão de entrada o neurônio de saída será mais
facilmente reconhecido.
Crítico
RNA
Reforço
Ação
28
Isso não descarta a possibilidade de redes competitivas com conexões
de realimentação, ou seja, ligações laterais. Porém quando isso acontece ao
mesmo tempo em que as ligações com o neurônio ganhador são fortalecidas,
as demais são enfraquecidas e possuem um efeito muitas vezes inibitório
denominada inibição lateral, o neurônio tenta inibir aquele que está
lateralmente ligado a ele (HAYKIN, 2002).
A arquitetura deste método prevê que o neurônio irá aprender a
concentrar todos os seus pesos sinápticos nos nós ativos. Caso um neurônio
de saída não for excitado por um determinado padrão de entrada, então não
haverá aprendizado. O padrão da regra de competitividade é definido pela
Erro! Fonte de referência não encontrada. :
( ) −
=∆0
wxw kjj
kj
η
Equação 2 onde η é a taxa de aprendizagem, x é o vetor de entrada, k o neurônio
vencedor e kw o vetor de pesos sinápticos. Esta regra tem por finalidade
aproximar o vetor kw do neurônio k (vencedor) do padrão de entradas x
(HAYKIN, 2002).
Isso torna a camada competitiva desta rede uma espécie de
classificadora de características, reunindo padrões em grupos. Estes são
chamados clusters, mas para que estes grupos sejam encontrados de maneira
correta os padrões de entrada devem ser distintos, pelos menos no inicio do
treinamento até que os pesos sinápticos estejam bem coerentes. Caso
contrário a rede ficará instável e pode responder para padrões de entrada
semelhantes com clusters de saída distintos.
Vale ressaltar que este método é classificado como não supervisionado,
ou seja, todo seu funcionamento não depende de influências externas como
Se o neurônio k vencer Se o neurônio k perder
29
um professor para lhe dizer se a saída obtida é a correta. Sendo assim os
padrões de entrada devem ser bem organizados
As principais aplicações do aprendizado por competição são as redes do
modelo ART de Grossberg (1987) e os mapas de Kohonen, mais conhecidos
como mapas auto-organizáveis (1982) ou SOM (self-organizing maps). Neste
trabalho não estudaremos o modelo ART, pois utilizaremos os mapas de
Kohonen como base, sendo que este último será descrito em detalhes em uma
seção futura.
Para esgotar o assunto sobre aprendizado vale citar Mendel e McLaren
(1970) quando definem o que é o aprendizado:
Apredizagem é o processo pelo qual os parâmetros de uma RN são, de forma continuada, ajustados através de estímulos pelo ambiente no qual a rede está operando, sendo o tipo específico de aprendizado realizado definido pelo modo particular como acontecem os ajustes realizados nos parâmetros.
30
6 REDES NEURAIS COM FEEDFORWARD
O processo de treinamento é fundamental para as redes neurais.
Mediante este fato temos dois métodos: Treinamento supervisionado e não
supervisionado como descrito anteriormente.
O Supervisionado possui resultados nos neurônios de saída já
conhecidos, permitindo ao sistema ajustar os pesos das conexões entre os
neurônios através da comparação de resultados. O treino não supervisionado é
utilizado para processos de classificação, apresentando padrões de entrada
para neurônios de entrada e quando este neurônio apresenta uma saída gera-
se uma classificação deste padrão. Não existindo saídas previstas para o
sistema.
FeedForward é um tipo de rede neural assim como as demais,
trabalhando com camadas de entrada que são conectadas a camadas
escondidas de processamento. Logo após este processamento sobre as
camadas escondidas a informação é enviada para as camadas de saída. Como
dito em Introduction to Neural NetWorks with Java, Jeff Heaton, geralmente as
redes neurais possuem uma camada escondida, mas raramente apresentam
mais do que duas destas.
Para esclarecimento, segue a estrutura na Figura 7 de exemplo extraído
do trabalho de Heaton. Uma camada não significa que existirá apenas um
neurônio executando este processo, e sim um grupo de neurônio por camada.
31
Figura 7: Arquitetura FeedForward (HEATON, 2005). Camada de Entrada (input) seguida de uma ou mais camadas escondidas (hidden) que são camadas de processamento intermediário entre a camada de entrada e a camada de saída, esta última representada por um único neurônio.
As camadas de entrada são utilizadas como via de conexão entre um
ambiente externo e a rede neural. E como em toda rede neural, após um
padrão ser iniciado na camada de entrada, haverá um novo padrão a ser
desenvolvido na camada de saída. Pois é na camada de entrada que
aplicamos o treinamento da rede, e cada variável presente na camada de
entrada tem influência sobre o contexto geral da saída.
Estas variáveis de entrada são pontos flutuantes, como neste trabalho
utilizaremos a linguagem JAVA como ferramenta, dados do tipo “DOUBLE", e
todas as representações não numéricas apresentadas na entrada, devem
passar por processos de normalização, para daí então desenvolver um padrão.
Em contrapartida as camadas de entrada, as camadas de saída
mostram os padrões encontrados para o ambiente externo. E este padrão que
está presente na saída pode ser redirecionado pra as camadas de entrada
novamente. Assim o sistema se realimentará com novos padrões.
A razão deste tipo de rede neural ser denominada como
FEEDFORWARD é a conexão utilizada entre seus neurônios, ou seja,
32
comunicação positiva de um único sentido. Outras redes com sentido recíproco
e sentido negativo são conhecidas como feedback.
6.1 Algoritmo BackPropagation
Como o conceito de FeedFoward foi detalhado podemos seguir a diante
e discutir o algoritmo backpropagation. É formado por conjuntos de equações
que corrigem os pesos de cada conexão dos neurônios apresentados na rede
(DAN, 1997), com isso realiza uma retropropagação dos erros encontrados nos
neurônios de saída, com a intenção de reduzir a diferença entre o padrão
encontrado e o padrão desejado.
Este algoritmo é classificado como método supervisionado e foi
introduzido em 1986 por Rumelhart e McClelland com o trabalho Parallel
Distributed Processing, e com isso aumentou o interesse nas RNAs, mesmo
que a proposta deste algoritmo tenha surgido muito antes de 1986.
O treinamento que utiliza este método é constituído de três etapas. A
primeira consiste em estímulos de entrada para alcançar um resultado. A
segunda etapa é a retropropagação do erro através de cálculos comparando
com o resultado esperado, que faz parte do conjunto de treinamento, e o grau
de diferença entrada nesta comparação é que consiste o erro. Na terceira
etapa, são refeitos os pesos das conexões dos neurônios, diminuindo ou
aumentando este peso conforme a necessidade. Citando Heaton (2005):
Existem várias maneiras de encontrar pesos que minimizem a função erro do sistema. A abordagem mais comum é a utilização do método de gradiente descendente. O algoritmo que avalia a derivada da função do erro é conhecido como backpropagation, porque retropropaga os erros pela rede.
As redes FeedFoward podem conectar sua camada de entrada com
camadas ocultas ou mesmo diretamente com as camadas de saída, mas onde
exatamente entrar o backpropagation neste ciclo? É ele que será responsável
por treinar a rede.
Segue na representação do fluxo do algoritmo contido no trabalho de
Braga, 2007:
33
Figura 8: Fluxo do Algoritmo BackPropagation. Os dados seguem em sentido feedfoward chegando ao neurônio de saída, o erro é calculado e retorna na RNA no sentido backward ajustando os pesos sinápticos.
Como ilustrado na Figura 8 a união do método FeedFoward com o
algoritmo Backpropagation possui 2 fases de aprendizado e conexão. Os
dados da camada de entrada seguem no sentido forward e depois das análises
da RNA os erros retornam pela fase backward.
A entrada é feita na primeira camada que podemos chamar de 0C , e
para cada uma das camadas seguintes é calculado o valor da saída, que pelo
método feedfoward serve como entrada para a próxima camada. Então quando
chega na camada de saída os resultados são comparados com os valores
desejados.
Na fase backward deste processo os nós da camada atual ajustam os
pesos sinápticos para adequar seus valores e diminuir o erro. Desta forma a
camada seguinte tem seus nós ajustados a fim de ponderar os pesos de suas
conexões, isso constitui um retorno pelas menos conexões iniciais sem
realimentação.
Existem diversas variações deste algoritmo para deixá-lo mais eficaz e
mais rápido. Este algoritmo é baseado na regra delta de Widrow e Hoff, mas
quando Rimelhart e McClelland desenvolveram o backpropagation otimizaram
Fase Backward
Fase Forward
34
a fórmula criando o que chamam de delta generalizado, como mostrado na
Equação 3:
( ) 2
12
1∑∑
=−=Ε
p
k
i
p
i
p
id γ
Equação 3
E é o erro total, k é a quantidade de saídas, d são as saídas
desejadas, y as saídas encontradas pela rede e p é o número de padrões.
Com estes valores o backpropagation determinar os ajustes dos pesos dos
erros sinápticos aproximando os padrões de entradas de encontrar as saídas
desejadas.
35
7 MAPAS AUTO-ORGANIZÁVEIS (SOM)
Existe uma classe de RNAs com a habilidade de auto-organização. São
elas: as Redes ART de Grossberg e as SOM de Kohonen. Como dito
anteriormente não estudaremos as Redes ART, mas como breve descrição
vale dizer que são estruturas em duas camadas, entrada e saída, que estão
conectadas por dois conjuntos de conexões conectando os nós de uma
camada a todos os nós da outra camada (BRAGA, 2007).
Os Mapas Auto-Organizáveis são outra opção de arquitetura de Redes
Neurais Artificiais baseadas em aprendizado competitivo e não supervisionado.
Diferem da FeedFoward BackPropagation em vários aspectos, principalmente
na maneira como reconhecem padrões e no método de aprendizado, inclusive
não fazendo uso de funções de ativação ou valores de limiar.
Esta arquitetura foi desenvolvida por Teuvo Kohonen nos anos 80,
pesquisador finlandês que teve grandes contribuições para a área de
inteligência computacional dentre elas vários modelos de arquitetura de Redes
Neurais Artificiais. Por este motivo muitas vezes as Self-Organizing Maps
(SOM), ou Mapas auto-organizáveis em tradução livre, são chamadas de
mapas de Kohonen, mas vale lembrar que não foi apenas esta arquitetura
desenvolvida por ele, apesar de ser a principal (HEATON, 2005).
Uma característica muito importante para se ressaltar sobre os SOM é
que seu método de treinamento é não supervisionado, ou seja, possui um
padrão de entrada conhecido, mas sua saída não é comparada ou
inspecionada por um agente externo, como um professor ou valores a serem
comparados.
Para este trabalho decidi não utilizar uma estrutura com camadas
ocultas, o que torna este modelo de aplicação limitado para resolver
determinados problemas, mas levando em consideração o objetivo que é obter
classificação de grupos de entradas será a ferramenta ideal e não exigirá
muitos recursos computacionais. Portanto vale ressaltar que se o leitor esta
interessando em desenvolver programas de classificação de dados mais
complexos ou que visem dados de entrada diferentes dos que serão
apresentados recomendo ler este trabalho como base conceitual, mas buscar
36
variações de SOM ou mesmo explorar o algoritmo FeedFoward
BackPropagation.
7.1 Estrutura dos Mapas Auto-Organizáveis
Normalmente iremos encontrar SOM organizados em grades mais
comumente bidimensionais, mas podendo ser unidimensional. Isso acontece
porque durante o período de treinamento os nós se especializam em detectar
os conjuntos de entradas. Desta forma os nós se organizam de maneira
topológica dentro da grade levando em consideração os padrões detectados
(HEATON, 2005).
Sendo que sua função que gera a saída é bem diferente da lógica
utilizada pelas redes feedfoward. No feedfoward todas as saídas geram
valores, mas nas SOMs apenas um dos neurônios de saída irá apresentar um
valor considerável.
Os neurônios de entrada iniciam o processo nos mapas auto-
organizáveis, suas entradas devem ser normalizadas para serem tratadas
como valores numéricos. A isto damos o nome de normalização, ou seja, estes
valores devem estar entre -1 e 1 independente do seu valor inicial, criando um
padrão. Assim que estes valores iniciarem na rede irá produzir uma reação nas
camadas de saída, (HEATON, 2005).
O processo de normalização será detalhado mais a frente, por hora
vamos ver como é a estrutura de uma SOM como ilustrado na Figura 9,
adaptado do trabalho de Jeff Heaton:
37
Figura 9: Processo de Normalização. Adaptado de Heaton(2005). Primeiro temos o vetor de entrada, este passa pelo processo de Normalização adequando seus valores dentro da faixa de -1 a 1. Em seguida é feita a entrada na primeira camada de rede que realiza os processamentos e apresenta o resultado na camada de saída com o neurônio vencedor da “competição”.
Com a definição de Simon Haykin (2002):
O principal objetivo do mapa auto-organizável (SOM) é transformar um padrão de sinal incidente de dimensão arbitrária em um mapa discreto uni- ou bidimensional e realizar esta transformação adaptativamente de uma maneira topologicamente ordenada.
Podemos concluir que a estrutura da SOM será organizada em uma
grande de maneira FeedForward onde o arranjo dos neurônios estarão
dispostos em linhas e colunas. Podendo como citado anteriormente ser uni- ou
bidimensional. Onde o uni- é sua representação mais simples.
Os neurônios se organizam neste “mapa” de acordo com seu padrão de
entrada, variando de um para o outro. Sendo assim todos os neurônios do
mapa devem ser treinados um número suficiente de vezes para que a auto-
organização seja garantida. Além de que devemos reforçar a importância da
38
redundância de dados neste caso e os diferentes padrões ao qual um neurônio
deve ser submetido, pois somente desta forma teremos resultado concisos.
Apesar de inicialmente atribuirmos valores aleatórios para o algoritmo
responsável por esta auto-organização, sem organização prévia, o processo de
aprendizado da SOM se encarregará de lhe trazer este conhecimento e
aprimorar sua função no reconhecimento e organização das informações da
camada de entrada.
Segue na Figura 10 uma representação de Grade Bidimensional citada
por Simon Haykin em Redes Neurais Princípios e Práticas:
Figura 10: Grade Bidimensional. (HAYKIN, 2002). Representação da estrutura de um mapa de Kohonen com aplicação Bidimensional.
É importante citar que após todo este processo de inicialização da grade
estruturada de neurônios, existem três etapas essenciais envolvidas na
formação desta grade, (HAYKIN, 2002):
• Competição: Cálculo do valor referente ao padrão de entrada para
inicializar a competição.
• Cooperação: O neurônio que vence a competição reestrutura sua
localização perante uma localização topológica.
Camada de nós de Fonte
39
• Adaptação Sináptica: Ajuste dos pesos sinápticos considerando o
vencedor e o padrão de entrada, facilitando posteriores padrões
de entrada semelhantes.
7.1.1 Competição
Este é um processo que tem como base o aprendizado competitivo
detalhado anteriormente na seção 5.5. Neste ponto é definido o número de
neurônios e vetores de entrada utilizados no algoritmo.
Estes valores vão de acordo com o resultado que deseja ser obtido. Por
exemplo, no reconhecimento de letras teremos 26 unidades de saída e na
camada de entrada podemos variar de acordo com o tipo de dado utilizado. Em
um reconhecimento de escrita podemos utilizar uma janela de tamanho X por
Y, onde o usuário iria escrever a letra a ser encontrada e então definiríamos o
número de entradas igual a X * Y representando cada pixel da imagem. Ou
mesmo no caso de um vetor contento o padrão da assinatura do dado apenas
um neurônio de entrada para o padrão.
Desta forma devemos levar como regra o conjuntos de equações 4:
1. [ ]T
mxxxx ,,2,1 L
=
2. [ ]jmjj wwww ,,, 21 L= , j = 1, 2, ..., l
3. ||||minarg)( jwxxi −= , j = 1, 2, ..., l
j
Equação 4
Onde m é a dimensão da entrada dos dados e x o vetor de entradas
selecionado deste espaço. jW o vetor de pesos do neurônio j , sendo que l é
o número de neurônios existentes na grade do mapa. Por fim )(xi é a função
que resgata a identidade do neurônio i . O neurônio i que satisfaz a condição
de x e vence a competição na relação dos pesos sinápticos é o vencedor,
onde x é o vetor com as entradas ou pode chamar de padrão.
A terceira parte da equação refere-se ao casamento do pesos sinápticos
com o vetor de entrada, sendo assim é matematicamente equivalente ao
40
produto interno encontrado na relação entre w e x, seguindo esta formula xwT
j
para melhor entendimento. Onde j = 1, 2, ..., l e ao achar o resultados pega-
se o menor como referência.
7.1.2 Cooperação
Compete ao processo cooperativo administrar a topologia do mapa auto-
organizável. Como vimos na seção 7.1.1 existe uma métrica a ser tomada
sobre o neurônio vencedor, partindo deste princípio este neurônio localiza o
centro de uma vizinhança topológica baseada nos conceitos neurobiológicos.
Para ser fiel a estes conceitos e traduzi-los de maneira computacional e
matemática exploramos a evidência de inibição lateral, ou seja, a conexão
lateral entre os neurônios excitados gerando uma vizinhança onde os mais
próximos terão uma ligação mais forte que os mais distantes, isto de maneira
gradual.
A equivalência matemática, exposta por Simon Haykin (2002) e baseado
no trabalho de Helge Ritter (1992), é dizer sendo ijh , representante de uma
vizinhança tendo como centro o neurônio vencedor i e que possua um
conjunto de neurônios de modo cooperativo, no qual um neurônio específico
identificado como j . Pode-se afirmar que a vizinhança topológica ijh , é uma
função unimodal da distância ',ijd quando satisfizer a seguintes exigências:
• A vizinhança topológica alcança o valor máximo quando a
distância ijd para o neurônio vencedor i é zero;
• A amplitude da vizinhança ijh , decresce com o aumento da
distância lateral ',ijd , onde tende a 0 quando ',ijd → ∞.
Nos falta agora definir a equação correspondente a ijh , já que
decompomos todas as suas variáveis. No qual a função )(, xh ij gera a
41
vizinhança topológica correspondente a distância gaussiana conforme a
Equação 5.
−=
2
2,
)(, 2exp
σij
xij
dh
Equação 5
O único fator até então desconhecido nesta função é o 2σ que se refere
à variância da vizinhança topológica. Definindo o grau de participação dos
neurônios excitados da vizinhança do neurônio i vencedor no aprendizado da
rede.
A cooperação entre os neurônios depende da relação entre a vizinhança
topológica ijh , e a distância lateral definida por ijd , do neurônio escolhido j e
do vencedor i no espaço de saída.
Quando falamos de grade unidimensional esta distância é definida por
|||| ij − sendo este valor um inteiro. Porém se estivermos tratando de grades
bidimensionais à equação muda para 22, |||| ijij rrd −= . Onde jr é o vetor
discreto que possui a posição do neurônio excitado j e ir é o equivalente para
o neurônio i (vencedor).
Estas distâncias (largura da rede) decaem com a variação do tempo
(iterações), como característica dos Mapas Auto-organizáveis, e podemos
definir este processo com a Equação 6 do decaimento exponencial:
−=
1
0 exp)(τ
σσ nn n= 0,1,2,...
Equação 6
Onde 0σ é o valor de σ no momento em que a rede é inicializada e 1τ é
uma constante de tempo. Desta forma a vizinhança topológica torna-se variável
no tempo como mostrou Haykin com a Equação 7 abaixo:
42
−=
)(2exp)(
2
2
,
)(, n
dnh ij
xij σ n=0,1,2,...
Equação 7
Função )()(, nh xij também conhecida como função da vizinhança.
7.1.3 Adaptação sináptica
Como definido por Haykin, para que o mapa seja auto-organizável “o
vetor de peso sináptico jw do neurônio j da grade se modifique em relação ao
vetor de entrada x ”. Com isso temos de adaptar as equações conhecidas do
método hebbiano para sanar seu principal problema, que seria a modificação
dos pesos em apenas uma direção, desta forma teremos as seguintes
equações propostas por Kohonen:
))()(()()()1( )(, nwxnhnnwnw jxijjj −+=+ η
Equação 8
A Equação 8 é utilizada em todos os neurônios contidos na grade da
vizinhança topológica do neurônio i vencedor. Ao aplicar esta equação temos
os resultados pretendidos conforme a citação de Haykin, ou seja, aproximar o
vetor de pesos sinápticos do neurônio vencedor do vetor de entradas da rede.
Mas não será apenas esta equação a ser aplicada, nos casos de
neurônios que não pertencem a vizinhaça topológicas utilizaremos a Equação
9:
)()1( nwnw jj =+
Equação 9
Sendo que em ambas as equações )1( +nwj é o vetor de novos pesos,
)( xijh é a heurística da vizinhança, x o vetor com os padrões de entrada e n a
43
taxa de aprendizado que normalmente inicia em η0 e decresce em função do
tempo.
Esta função de decaimento é exponencial, portanto pode ser
representada pela Equação 10 que segue, onde o 2τ é outra constante de
tempo do algoritmo SOM (Haykin, 2002):
−=
2
0 exp)(τ
ηη nn n=0,1,2,...
Equação 10
7.2 Espaço de Entrada
Após discursar sobre a estrutura da SOM e como ocorre seu processo
de auto-organização, é cabível discorrer sobre o espaço de entradas e como a
SOM realiza o agrupamento destes padrões.
A fim de gerar um clustering é necessário um vetor de entrada com
padrões muito bem definidos, pois como já citado neste trabalho qualquer
distorção anormal nestes valores irá acarretar em uma rede neural instável. Por
isso as redes de Kohonen possuem uma peculiaridade nas suas entradas, elas
devem estar em um range de valores numéricos que varia de -1 a 1.
Em alguns estudos podemos encontrar redes com variação de 1 a 0,
mas foi percebido que no fim das iterações e de todo o processo de
treinamento da rede, os resultados não eram tão satisfatórios e dificilmente
atingindo o ótimo.
Com o intuito de aplicar esta regra para tornar mais confiável o novo
vetor no espaço de entrada e baseado nos estudos de Márcio Zuchini na tese
“Aplicações de Mapas Auto-Organizáveis em Mineração de Dados e
Recuperação de Informações” (2003), pode ser verificado que um dos fatores
de maior relevância para aplicar um vetor de entrada com eficácia é o processo
de Normalização dos valores do desde mesmo vetor perante a camada de
entrada.
44
7.2.1 Normalização
Não é uma obrigatoriedade desta rede, porém de fato a normalização
das entradas da rede nos mapas auto-organizáveis melhora consideravelmente
a classificação dos dados.
Muitas vezes considerada como uma terceira camada na arquitetura de
uma SOM, na verdade é uma pré-execução da camada de entrada. Antes
mesmo do vetor de entrada entrar no espaço de entrada (input layer ou
camada de entrada), os valores passam pelo processo de normalização
fazendo com que entrem na faixa de -1 a 1. (HEATON, 2005)
Por sua vez os neurônios de entrada devem ser configurados para
reconhecer o valores desta faixa, caso os neurônios sejam configurados de
maneira limitada para uma faixa de valor de 0 a 1 existirá uma queda na
performance da rede.
Sendo assim podemos definir novos elementos serão considerados,
argumentos não dominem os demais na rede ou mesmo um atributo com
grande freqüência não distorça a descoberta do padrão. É de boa prática que
utilizemos a Normalização.
A normalização em si nada mais é do que uma de transformação linear
de cada um dos elementos do vetor inicial de entrada (ZUCHINI, 2003)
conforme Equação 11:
( )( ) Ddv
vvv
d
d
velho
dnovo
d ,...,1,.
. =−=σ
Equação 11
Onde velho
dv se refere ao valor do n-ésimo elemento do vetor v em sua
forma inicial, dv. é a média do valor do d-ésimo elemento e ( )dv.σ representa
o desvio padrão desta função para o mesmo elemento. Com isso teremos um
valor tal em cada elemento do vetor de entrada que sua média atingirá 0 e sua
variância 1.
45
Mas vale ressaltar que a normalização não é a melhor opção em todos
os casos. Em algumas ferramentas os resultados se tornam mais morosos
devido ao custo computacional e seus resultados podem ser insatisfatórios,
como mostra o estudo de Zuchini utilizando GTM (Generative Topographic
Mapping), um modelo de contrapartida probabilística do SOM fundamentado
em um modelo matemático de probabilidade. Entretanto neste trabalho a
normalização ajudou na definição concreta do espaço de entrada, desta forma
é recomendado que haja uma análise com ambas propostas de dados
(Normalizados e Não Normalizados) antes de aplicar a SOM definitivamente.
46
8 RECUPERAÇÃO DE INFORMAÇÃO
O objetivo inicial que motivou este trabalho seria obter um sistema que
pudesse através de um texto simples, determinar o assunto recorrente do
documento. Porém como temos visto ao longo de todo o estudo as redes
neurais artificiais trabalham com números (binários ou não), até mesmo porque
os computadores ou unidade de processamento são feitos para cálculos
numéricos. Sendo assim foi necessário pensar em uma maneira de converter o
texto em uma assinatura numérica que representasse um padrão de entrada
que fosse compreendido pela RNA.
A recuperação de informação esta relacionada com recuperação,
armazenamento, acesso e busca de itens da informação esperada (Salton &
McGill, 1983), que se tornam possíveis através de processos que transformam
nossa linguagem em uma heurística que pode ser entendida pela máquina.
Baseado no trabalho de Ricardo Baeza-Yates e Berthier Ribeiro-Neto
(1999), têm um documento jd que possui várias palavras-chaves (keywords)
que são utilizadas como índices de classificação ou busca de documento
descrito por ik . Por convenção utilizamos apenas palavras com real
significado para o texto removendo então artigos, preposições e conjuntivos
conhecidos como stopwords. Mas em alguns estudos também são
apresentados modelos que analisam todas as palavras do documento, full text
(BAEZA-YATES;RIBEIRO-NETO, 1999).
8.1 Redução de Contexto
Buscando tornar essa associação de palavras mais efetiva iremos
utilizar a lógica de radicalização do contexto das palavras encontradas em cada
documento. Excluindo, como dito anteriormente, as stopwords e as flexões de
47
cada palavra para encontrar sua métrica mais simples e reduzir a gama de
palavras que podem parecer nos documentos.
Como exemplo da efetividade deste processo e sua influência sobre a
rede, temos a palavra “abandonar” que pode aparecer no texto como
“abandonado”, “abandonada”, “abandonados”, “abandonou”, “abandono” e
mesmo “abandonar”. Perceba que todas se referenciam ao mesmo assunto e
podem ser representadas pelo radical “abandon”. Com isso aumentando sua
freqüência e relevância para o documento, além de impedir que a rede
disponha de mais um neurônio para cada flexão da palavra.
Portanto tomamos como meditas de redução remover o plural, gerúndio,
flexões de gênero, grau, adverbial, verbal e redução de substantivo. Como
mostra a Figura 11, esta técnica foi baseada no algoritmo de Orengo & Hyuck
que visam à língua portuguesa. Algoritmo de radicalização, imagem retirada do
trabalho de Zuchini (2003):
Figura 11: Algoritmo de Poter. Adaptado por Orengo & Hyuck. A palavra passa por vários processos de redução a fim de gerar um radical capaz de representar todas as flexões da mesma.
Para este fim foi desenvolvido um programa em linguagem JAVA que
após a verificação do documento radicalizava suas palavras e armazenava as
(30*n documentos) principais de acordo com sua freqüência em uma tabela do
banco de dados (Apêndice B).
48
Nem todas as palavras atingem o radical que esperamos, onde podem
se tornar o mesmo que outras palavras que não possuem qualquer significado
semelhante de contexto no documento. Exemplo, “verso” e “versado” se
tornam “vers”, mesmo radical para palavras com significando distinto.
Após este procedimento estamos prontos para aplicar os métodos de
recuperação de informação para cada palavra (radicalizada) do documento
baseado na análise de sua freqüência e criar uma assinatura numérica
(podendo ser booleana) para a palavra ou mesmo para o documento, a fim de
aplicar no mapa de Kohonen.
8.2 Métodos de Recuperação de Informação
A recuperação da informação se dá pela necessidade do usuário em
buscar informação, na compreensão ou mesmo a localização de um
determinado contexto dentro de um documento. Partindo deste princípio
podemos considerar a definição da frase “Recuperação de Informação” como
recobrar um aprendizado ou ensinamento, indo mais longe, trazer para o
usuário uma instrução já aprendida por ele ou por outro indivíduo, de acordo
com conceitos do dicionário Michaelis.
Existem alguns métodos para relacionar esta informação com um padrão
dentro de documentos e tem mostrado grande aplicabilidade quando usados
com redes neurais, em particular mapas auto-organizáveis. Dentro os vários
métodos que existem vale ressaltar dois deles, tanto pela quantidade de
experimentos já realizados quanto por seu valor histórico, o método booleano,
o método de espaço vetorial e o SOM semântico.
8.2.1. Método booleano
A utilização da lógica da álgebra booleana para implementar este
método o torna uns dos mais fáceis e com menos custo computacional. Ao
49
utilizar a lógica de indexação por keywords podemos determinar a relevância
de um documento dentro do conjunto de documentos ou mesmo de uma
palavra dentro de um documento de forma singular.
Este modelo foi desenvolvido por Salton & McGill em 1983, onde
aplicando a lei do “menor esforço” temos uma freqüência na representação de
uma idéia pelas mesmas palavras, mostrando que os indivíduos difícilmente
recorrem a novos termos para expressar uma mesma idéia. Assim ao
identificar as palavras que indexam um texto facilitamos a recuperação da
informação contida nele. Provando que os termos mais freqüentes trazem
pouco significado ao contexto do documento (SALTON & MCGILL, 1983).
É uma prática comum descartar as palavras com maior freqüência
no momento de aplicar o documento nos mapas auto-organizáveis, o intuito
disso é impedir que o resultado do mapeado seja distorcido, assim como as
palavras que possuem menor freqüência dentro do documento são
consideramos com menor relevância a analise. Porém é necessário considerar
que ao remover as palavras de menor freqüência do processamento estamos
sujeitos a impedir que a SOM se adapte a novas situações ou situações menos
freqüentes.
A freqüência em que as palavras aparecem em um documento
considera que uma palavra índice ik tem sua freqüência calculada dentro de
um documento jd e representada pela existência ou ausência dos termos
relevantes dentro do documento. Segue Equação 12 do método booleano:
∑=
=d
ik kfreq
1
Equação 12
Onde kfreq é a freqüência total da palavra k mediante as palavras
i do documento d . O mesmo conceito pode ser apresentado para um conjunto
de documentos, substituindo o elemento k pela freqüência que a palavra
aparece em outros documentos e d seria um conjunto em vez de um
documento individual.
50
Com isso definimos os termos mais relevantes de um documento e
podemos criar um vetor binário de acordo com algumas prerrogativas, onde
definimos “0” para a ausência do termo índice e “1” para a existência.
8.2.2. Método de espaço vetorial
Apesar de uma grande semelhança com o método booleano, o método
de espaço vetorial tem a proposta de superar as deficiências apresentadas no
método anterior. Como sua principal característica é a análise de freqüência
absoluta, difere do booleano que só verifica a ausência do termo chave no
documento.
Para o método vetorial cada documento é considerado um vetor que
corresponde à freqüência que a palavra aparece no contexto geral do
documento, sendo que o termo chave é diretamente proporcional a esta
freqüência, porém inversamente proporcional a quantidade de texto que
possuem o termo, destacando documentos com palavras específicas de baixa
freqüência (ZUCHINI, 2003).
O cálculo da freqüência dos termos que aparecem com maior raridade
pode ser dada pela Equação 13, onde kPF é a freqüência da palavra k no
documento i de um total de id palavras no documento.
i
ikk d
fPF =
Equação 13
Mas para o caso das palavras que apresentam maior freqüência nos
documento e que raramente possuem significância para o contexto, utilizamos
a Equação 14:
51
1log2 +
=
k
k fd
nIFD
Equação 14 Sendo kIFD a inversa freqüência do documento para o termo chave k
dentre os ndocumentos e kfd é o número de documentos em que se encontra
o termo k .
Com essas duas equações podemos encontrar um produto proporcional
ponderando cada palavra do documento, conforme sugerido por Salton &
McGill com a Equação 15:
ikik IFDPFw ×=
Equação 15
com ikw é o valor específico da palavra k no documento i .
Por fim ele se baseia em cálculos de distância vetorial, relacionando o
vetor de busca com o vetor dos documentos encontrados. O que o torna
inviável algumas vezes, dependendo diretamente da quantidade de termos
relacionados na busca.
8.2.3 SOM semântico
Em 1989 Ritter & Kohonen fizeram uma proposta de uma ferramenta de
processamento neural chamado SOM Semântico que trabalha sob os conceitos
comuns da linguagem, como seus estados e categorias.
Partindo deste pensamento propuseram que fossem criados vetores
para representar conjuntos de palavras, para que seu significado semântico
fosse compreendido pelo mapa neural. Mas isto não é tão simples, já que a
representação do significado de uma palavra esta ligado diretamente com o
contexto em que ela se apresenta (ZUCHINI, 2003). Para isso surgiu à idéia de
52
representar cada palavra com uma concatenação de dois vetores, onde um é a
palavra e o outro o contexto da palavra.
Sendo assim quando aplicados a rede neural e seus atributos tiverem
mais destaque do que a palavra em si, a tendência é de aproximar
topologicamente as palavras com atributos (contexto) parecidos. Em
contrapartida caso os atributos não sejam específicos a palavra em si domina a
rede e tende a se posicionar topologicamente.
Como a língua portuguesa tem muitas minúcias e dificilmente uma
palavra encontra seu significado sem um contexto, por haverem várias palavras
com significados distintos quando apresentadas sozinhas, é comum que os
valores do atributo venham a ter maior significância no momento do
reconhecimento do padrão de entrada. Por isso os vetores que representam a
palavra são escolhidos para serem ortogonais entre si, sem compor
informamos da precedência da palavra.
Segue na Tabela 1 - Animais e seus atributos. Adaptado de Ritter & Kohonen
(1989)Tabela 1 representando o conceito de mapeamento dos atributos de cada
palavra baseado no trabalho de Ritter & Kohonen em 1989, Self-organizing
semantic maps :
Tabela 1 - Animais e seus atributos. Adaptado de Ritter & Kohonen (1989)
pom
bo
galin
ha
pato
rapo
sa
cach
orro
lobo
gato
tigre
leão
pequeno 1 1 1 0 0 0 1 0 0 é Médio 0 0 0 1 1 1 0 0 0 Grande 0 0 0 0 0 0 0 1 1 2 patas 1 1 1 0 0 0 0 0 0
tem 4 patas 0 0 0 1 1 1 1 1 1
Pelos 0 0 0 1 1 1 1 1 1 Penas 1 1 1 0 0 0 0 0 0 Voar 1 1 1 0 0 0 0 0 0 gosta de Correr 0 0 0 0 1 0 1 0 0 Caçar 0 0 0 1 0 1 0 1 1
Para melhor exemplificar os dados acima e o conceito de aplicação
semântico, segue a representação de um vetor transposto da regra acima para
os casos do pombo e do cachorro, onde a partir deste vetor já podemos aplicar
na SOM referente.
53
Tabela 2: Resultado da concatenação dos vetores dos termos Pombo e Cachorro. Atributos Palavra Pombo 1 0 0 1 0 0 1 1 0 0 1 0 0 0 0 0 0 0 0 Cachorro 0 1 0 0 1 1 0 0 1 0 0 0 0 0 1 0 0 0 0
É perceptível que o vetor da palavra esta relacionado com sua posição,
ou pode ser relacionado com sua freqüência gerando assim um vetor único
para cada palavra encontrada, mesmo que seus atributos sejam iguais.
A aplicação acima é utilizada para textos fechados e com palavras bem
definidas com características atribuídas antes da inclusão na SOM. Mas não é
bem assim que encontramos a maioria dos textos no mundo real e também não
se encaixa com o objetivo proposto por este trabalho.
Para este problema Ritter & Kohonen sugerem que nos casos de
trabalhos com textos livre seja aplicada uma codificação que carregue o valor
da palavra dentro do contexto. A estratégia foi criar um contexto médio que
coloca como atributos de av de um símbolo sv a média de todos os símbolos
próximos de sv (antecessores e sucessores), mas primeiro sv é reduzido por
um fator ε , normalmente 0.2, para que a parte simbólica não tenha demasiada
influência no processo (RITTER;KOHONEN, 1989). Conforme a Equação 16 a
seguir:
{ }
{ }
=
+
−
1)(
)(
1)(
ks
ks
ks
k
vE
v
vE
v ε
Equação 16
Sendo { }1)( −ksvE a média dos antecessores e { }1)( +ksvE a média dos
sucessores da palavra k , gerando então um vetor v . Conceito muito utilizado
para textos livres como os encontrados na internet, estudado e aplicado por
Scholtes (1991).
54
9 IMPLEMENTAÇÃO
Após explanar todas as ramificações das quais as Redes Neurais
Artificiais nos permite trabalhar, foi decido seguir pela linha dos mapas auto-
organizáveis aplicando o método de SOM semântico.
Seguindo nesta linha de raciocínio levantou-se a necessidade de
criamos uma lista de palavras baseadas em assuntos para serem aplicados a
SOM e analisar o seu comportamento. A esta lista de termos damos o nome de
bag of words,e iremos retirar estas palavras de textos distintos sobre “esporte”
e “culinária”.
Pensou-se em criar um banco de dados simples com 3 tabelas. Sendo a
primeira um dicionário de palavras que iria conter um número nde termos e
cada termo teria atributos bem definidos, uma segunda tabela que iria conter
cada palavra do texto e a sua freqüência conforme um novo texto fosse
analisado, e por último cada termo já radicalizado e seu vetor de entrada na
SOM.
Porém no momento da aplicação não se viu necessária a criação desta
base, pois o programa desenvolvido para radicalizar e calcular a freqüência dos
termos (feito em JAVA e contido no Apêndice B) realizada o processo de
maneira seqüencial e apresentava seu resultado ao fim.
Os atributos utilizados neste processo para classificar os termos foram
adaptações da lógica utilizada Ritter & Kohonen sendo 10 para esportes e 10
para culinária conforme Tabela 3:
Tabela 3: Atributos de Classificação
campo quadra ringe água outro atuante gerador expressão +ponto -ponto
verd/leg fruta carne bebida quente frio doce salgado consumido ferramenta
Vale lembrar que a distinção e as distâncias encontradas pela SOM
estão diretamente relacionadas com a forma como são classificados os seus
dados.
55
9.1 Radicalização
O processo de Radicalização é fundamental na execução deste trabalho.
Basicamente a radicalização irá realizar a redução de contexto, transformando
todas as palavras do texto em forma de radical que pode compor qualquer
flexão desta palavra. É valido observar que a radicalização pode transformar
termos distintos em uma mesmo radical, como citado anteriormente.
Neste trabalho utilizamos o algoritmo adaptado de Poter por Orengo e
Hyuck, seguinto os passos já vistos. Em suma devem-se remover todos os
sufixos comuns da língua portuguesa, as flexões verbais, aumentativos,
diminutivos e vogais.
Este processo foi realizado para 11 textos distintos, sendo um sobre um
assunto aleatório, 5 sobre esporte e 5 sobre culinária (receitas). Entre vários
métodos de verificação de texto calculou-se a freqüência das palavras, já com
as stopwords removidas, sobre todos os textos. Por fim ficamos com as 24
melhores palavras para dar seqüência ao estudo.
Segue o trecho de um dos documentos de esporte:
“O Fluminense derrotou o Figueirense por 4 a 0 neste domingo, no estádio Orlando Scarpelli,
em Florianópolis, em jogo válido pela 36ª rodada do Brasileirão. Novamente o atacante Fred
voltou a dar show com três gols marcados...”
Segue o trecho de um dos documentos sobre culinária:
“ Tempere as bistecas com o suco de limão e o caldo de carne, dissolvido em 2 colheres (sopa)
de água fervente. Deixe tomar gosto por 1 hora. Frite as bistecas no óleo, dourando dos dois
lados. Junte a cebola, os tomates, 1 xícara ( chá ) de água fervente e a mandioquinha. Tampe a
panela e cozinhe em fogo baixo, até a mandioquinha ficar macia ( cerca de 10 minutos).
Polvihe com a salsa. Sirva quente...”
Todos os textos utilizados neste trabalho (Apêndice D) passaram pelo
processo de recuperação de informação e cálculo de freqüência dos seus
termos antes de serem aplicados na SOM.
56
9.2 Atributos
Com o cálculo da freqüência realizado nos resta atribuir os valores dos
atributos conforme o escopo da SOM semântica. As 24 palavras foram
submetidas a uma análise, que poderia ser feita de maneira computacional e
gerando uma nova tabela conforme a necessidade.
Os atributos foram escolhidos para definir determinada relevância entre
os assuntos escolhidos. Porém com a necessidade de abordar diversas
palavras que continham nos assuntos específicos, não foi possível criar
determinantes que realmente deixassem os vetores bem definidos. Com isso
pode-se perceber um distúrbio no resultado da SOM. Mas nada que não
permita visualizar o contexto em que se baseou este trabalho.
Em grande parte os atributos são características que envolvem de
maneira comum os padrões de entrada. Assim o espaço de entrada ao
percorrer a rede tende a se aproximar e criar agrupamentos (clusters) onde os
atributos têm alto valor descriminante.
No momento em que o vetor de entrada é criado, necessariamente todos
os atributos a qual foram submetidas as palavras de “esporte” deve-se atribuir
a culinária, mesmo que o valor elemento seja 0, representando ausência. O
mesmo deve ser feito para as palavras de culinária. Conforme Tabela 4
e Tabela 5:
Tabela 4: Atributos de Esporte e Culinária aplicados a palavra ARROZ.
Tabela 5: Atributos de Esporte e Culinária aplicados a palavra ATACANT.
campo quadra ringe água outro atuante gerador expressão +ponto -ponto arroz 0 0 0 0 0 0 0 0 0 0 arroz verd/leg fruta carne bebida quente frio doce Salgado consumido ferramenta
1 0 0 0 1 0 0 1 1 0
campo quadra ringe água outro atuante gerador expressão +ponto -ponto
atacant 1 0 0 0 0 1 0 0 1 0 atacant verd/leg fruta carne bebida quente frio doce salgado consumido ferramenta
0 0 0 0 0 0 0 0 0 0
57
9.3 Resultados
Após construir o vetor de entrada, sendo este a concatenação dos
vetores de atributos de culinária e esportes, foi gerado um arquivo “.data” a fim
de utilizarmos a ferramenta SOM ToolBox do MATLAB® (Alhoniemi et al. 2000)
para demonstrar os resultados de uma Matriz-U de agrupamentos.
Para melhor resultados optamos por utilizar um mapa com grade
hexagonal de 8 x 12, um radio de ação de 6 reduzindo até 1 e 20 épocas de
treinamento.
A Matriz-U é composta pelas distâncias todos os neurônios vizinhos que
compõe o mapa, é o método mais comumente utilizado quando utiliza-se a
SOM para obter agrupamentos de dados, também conhecida como matriz de
distâncias unificadas. Quando a utilizamos para representar superfícies de
nível, podemos verificar visualmente a existência de “vales” ou “elevações”.
Quanto mais distintos forem os dados, maiores serão suas distâncias.
Distintos resultados podem ser encontrados alterando estes valores,
porém de acordo com as observações feitas após diversos testes, esta foi a
configuração que mais se encaixou com a necessidade de nossa aplicação.
Em momento algum descartamos que ao usar uma gama maior de palavras e
atributos distintos poderíamos necessitar de modificações neste escopo.
Após aplica nosso arquivo .data foi possível verificar uma distinção dos
termos utilizados. Segue o conteúdo do arquivo “.data” no apêndice C. A SOM
apresentou os resultados a seguir na Figura 12 e Figura 13 em escala de cinza
para facilitar a visualização:
58
Figura 12: Matriz-U em cores. O mapa evidencia uma projeção do relevo (margem vermelha) que separa os agrupamentos de esporte, ficando acima deste relevo, e os agrupamentos de esporte abaixo deste relevo.
Figura 13: Matriz-U em escala de cinza. Fica mais ilustrar algumas áreas em tons de cinza, o mapa agrupa de maneira topológica palavras como combat e box ilustrando sua proximidade.
Na ilustração em cores podemos perceber que a escala representa a
distância gaussiana entre os termos, com isso fica claro que o mapa auto-
organizável teve a capacidade de separar as palavras de “culinária” das
palavras de “esporte”.
59
Através da margem vermelha apresentada os assuntos ficam
evidenciados, bem como na figura em escala de cinza que nos ajuda a
perceber a ação dos neurônios sobre a rede. Onde os vales em preto traçam
uma margem entre as palavras.
Pode-se notar também que a rede iniciou um agrupamento secundário
dentro dos grupos iniciais, sendo que expressões de esporte como “gol”,
“empate”, “derrota” e “ponto” ficaram muitos próximos, enquanto “round” e
“boxe” ficaram distantes dos primeiros, mas próximos entre si.
Existem alguns métodos que podem melhorar estes resultados, um
deles é criar um vetor que representando a palavra de maneira individual em nℜ e concatenar com o vetor de atributos. E ainda utilizar o método de soma de
sufixo, onde se soma sempre o vetor da próxima palavra no texto afim de gerar
uma correlação entre elas.
Resumindo, a cada palavra que se verifica dentro do texto, soma-se ao
seu vetor de palavra o vetor da próxima palavra, gerando um novo vetor para
esta primeira. Este processo é feito para cada vez que a palavra aparecer no
texto. Infelizmente por falta de tempo hábil não foi possível representar esta
funcionalidade neste trabalho.
Mas como visto foi possível provar que através de um mapa auto-
organizável de uma Rede Neural Artificial podemos separar textos através de
seus padrões de entrada e desta forma gerar classificações semelhantes as
apresentadas no córtex cerebral humano.
60
10 CONCLUSÃO
Com base nos critérios e resultados desta monografia, onde o objetivo
era apresentar uma maneira de classificar textos obtidos na WEB de acordo
com seu tema utilizando para isso Redes Neurais Artificiais, constatou-se que o
objetivo foi alcançado de maneira satisfatória.
Através dos conceitos aplicados de radicalização de palavras e
agrupamento de características utilizando mapas auto-organizáveis, foi
possível verificar que ao apresentar a rede um padrão de entrada bem definido,
em que existe associação direta ou indireta pelos termos, seremos bem
sucedidos na classificação das palavras em grupos distintos, predominando
seu significado real, muito semelhante à função apresentada pelo córtex
cerebral humano.
Para que isso fosse possível reproduziu-se em linguagem JAVA a
função de radicalização e cálculo da freqüência das palavras, o que também
era esperado que fosse apresentado no trabalho, por fim todos os processos
foram executados com sucesso.
O que reforça a afirmação feita no início deste trabalho quando
classificou as Redes Neurais Artificiais (RNA), principalmente os mapas auto-
organizáveis (SOM), como ótima ferramenta de agrupamento de
características. Permitindo ser aplica também para seleção de padrões de
texto.
61
Referências Bibliográficas
[1] ANDERSON, J. A., “An Introduction to Neural Networks”, The MIT Press. 1995. [2] BABINI, M. Reconhecimento De Objetos Contidos Em Imagens Através De Redes Neurais. Universidade Estadual Paulista – UNESP, 2006. [3] BAEZA-YATES, R; NETO, B. R. “Modern Information Retrieval”. ACM Press, 1999. [4] BRAGA, Antônio P.;Carvalho, André P.L.F.; Ludermir, Teresa Bernarda; Redes Neurais Artificiais , 2a edição, Editora LTC, 2007. [5] CERA, M. C., Uso de Redes Neurais para o Reconhecimento de Padrões. 2005 [6] DAYHOFF, J. , “Neural network architectures”, an introduction. 1990. [7] GROSSBERG, S. “Competitive learning: From interactive activation to adaptive resonance”. Cognitive Science, 1987. [8] HARVEY, M. D. and Paul J. DEITEL. Java: como programar. Terceira edição, Prentice Hall, 2000. [9] HAYKIN, Simon; ENGEL, Paulo Martins. Redes neurais: principios e pratica. 2. ed. Porto Alegre: Bookman, 2002. [10] HEATON Jeff. Introduction to Neural Networks for Java. Segunda edição, Heaton Research, 2005. [11] HEBB, D.O. “The Organization of Behavior”. Wiley, 1949 [12] HEBB, D.O.. Brain Mechanisms and Learning. London: J. F. Delafresnaye (Ed.), 1961 [13] KOHONEN, T., “An introduction to neural computing” Neural Networks, vol.1 1988 [14] LINSKER, R. “ From basic network principles to neural architecture: Emergence of orientation columns” . Proceedings of the National Academy of Sciences, USA, 1986. [15] LvCoN. Laboratório Virtual em Computação Natural – Redes Neurais Artificiais, 2011. http://www.natcomp.com.br/lvcon/tema?tema=2 - acessado em abril de 2011.
[16] MCCULLOCH, W. S. e PITTS, W. / “A Logical Cauculos of the Ideas Immanent in Nervus Activity”, Bulletin of Mathematical Biophysics, vol 5, 1943;
[17] ORENGO, V. M; HUYCK, C. “A stemming algorithm for the portuguese
62
language. In: Proceedings.Eighth International Symposium on String Processing and Information Retrieval”. (SPIRE 2001). Chile, 2001. [18] ORENGO, V.M; HUYCK, C. Portuguese-English Experiments using Latent Semantic Indexing. Middlesex University for Bilingual Task, 2003. [19] POTTER, B. “Linguistique générale: théorie et description”. Paris : Klincksieck, 1985. [20] RITTER, H. and KOHONEN, T. “ Self-Organizing Semantic Maps” . Biological Cybernetics , 1989. [21] ROSENBLATT. “The perceptron: A probabilistic model for information storage and organization in the brain”. Psychol. 1958. [22] ROSENBLATT. “Principles of Neurodynamics: Perceptrons and the theory of brain mechanisms”. Spartan Books, New York, 1962. [23] RUMELHART, D. E.,HINTON, G. E. e WILLIAMS, R. J. / Learning Representations of Back- Propagation Error., Nature vol. 323, - 1986; [24] RUMELHART, D.E. and MCCLELLAND, J.L. “Parallel Distributed Processing, vol. 1: Foundations”. The MIT Press, 1986 [25] SILVA, J. M., Uma Metodologia para Extração de Conhecimentos em Objetos Textuais Baseada em Conceito para o Português do Brasil. Universidade Federal de Goiás, 2007. [26] SNNS-Group. “Stutgart Neural Network Simulator 4.2 Sturgart”, University of Stuttgart, 1998. [27] TESAURO, G. and Sejnowski, T. J. “Parallel network that learns to play backgammon,” Artificial. Intelligence, 1889. [28] VALENÇA, Mêuser. Fundamentos das Redes Neurais: exemplos em Java. Editora Livro Rápido, Recife 2000. [29] VON DER MALSBURG, C. “An automaton with brain-like properties”. Kybernetes, 1973. [30] ZUCHINI, M. H., Aplicações de Mapas Auto-Organizáveis em Mineração de Dados e Recuperação de Informação. UNICAMP, 2003.
63
APÊNDICES
APÊNDICE A – Algoritmo de Aprendizado Hebbiano public class HebbRule { public static void main(String args[]){ final HebbRule delta = new HebbRule(); delta.run(); } double peso1; double peso2; double limiar = 1.0; int epoch = 1; public HebbRule() { this.peso1 = 1; this.peso2 = -1; } protected void padraoAtual(double e1, double e2) { double result; double delta; System.out.println("Entrada ["+e1+","+e2+"]"); result = reconhecer(e1, e2); System.out.print("Saída = "+result); delta = treinamentoFunc(this.limiar, e1, result); this.peso1 += delta; System.out.println(", delta peso1 = "+delta); delta = treinamentoFunc(this.limiar, e2, result); this.peso2 += delta; System.out.println(", delta peso2 = "+delta); } public void run() { for(int i = 0; i < 5; i++) { epoch(); } } protected void epoch() { System.out.println("Inicio do Epoch nº "+this.epoch); padraoAtual(-1,-1); padraoAtual(-1, 1);
64
padraoAtual( 1,-1); padraoAtual( 1, 1); this.epoch++; } protected double reconhecer(double e1, double e2) { final double a = (this.peso1 * e1) + (this.peso2 * e1); return (a * .5); } protected double treinamentoFunc( double limiar, double entrada, double saida) { return limiar*entrada*saida; } }
65
APÊNDICE B – Algoritmo Adaptado de Poter, Radicalização e Cálculo de Freqüência de Palavras
//CLASSE FILEMANAGER package SOM; import java.io.File; import java.io.FileNotFoundException; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import javax.swing.JOptionPane; public class FileManager { public static void main (String args[]) throws FileNotFoundException{ int contador = 0; String word; String prepos1 = "/do/de/da/a/o/as/os/para/pra/um/uma/nos/que/eu/tu/ele/ela/"; String prepos2 = "/nas/por/ao/ou/das/em/no/na/dos/com/como/nós/vós/eles/elas/"; String arq; ArrayList<String> acum = new ArrayList(); //acumulador de palavras ArrayList<Termos> ltermos = new ArrayList(); //lista de termos utilizados do{ arq = JOptionPane.showInputDialog("Indique o local do arquivo:"); if (!arq.isEmpty()){ File file = new File(arq); Scanner sc = new Scanner(file); sc.useDelimiter("[,\\s\\n\\t\\-\"]"); //Delimitador para separa as palavras por vírgula, List<String> palavras = new ArrayList(); //aspas, hífen, espaço em branco, tabulação e enter while (sc.hasNext()) { word = (sc.next().trim()).toLowerCase(); //System.out.println("-"+word+"-"); if (!word.isEmpty()) { if (!(prepos1.contains(word)) && !(prepos2.contains(word))){ palavras.add(word); } } } /* //Impressão prévio do texto for (Object words : palavras) { System.out.println(words); } */ palavras = Radicalizar.radicalizador(palavras); for (Object frq : palavras){ acum.add((String)frq);
66
} /* //Imprimir todas as palavras acumuladas for (Object obj : acum){ String obj1 = (String) obj; System.out.println(obj1); } */ } contador++; }while(!arq.isEmpty()); ltermos = Radicalizar.frequencia(acum, contador); for (Object obj : ltermos){ Termos obj1 = (Termos) obj; System.out.println(obj1.getPalavra()+" - "+obj1.getFreq()); } PadraoEntrada.transformar(ltermos); } } //CLASSE RADICALIZAR package SOM; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class Radicalizar { public static List radicalizador (List<String> termos){ List radicalizados = new ArrayList(); Boolean sufix = false; String analisa; for(Object str : termos){ analisa = (String) str; sufix = false; if( analisa.length() > 2){ System.out.println(analisa); //Redução de pontuação if(analisa.endsWith("\"") || analisa.endsWith("'") || analisa.endsWith(")") ){ analisa = analisa.substring( 0, analisa.length()-1);
67
} else if(analisa.endsWith(",") || analisa.endsWith(".") || analisa.endsWith(";") ){ analisa = analisa.substring( 0, analisa.length()-1); } else if(analisa.endsWith(":") || analisa.endsWith("!") || analisa.endsWith("?") ){ analisa = analisa.substring( 0, analisa.length()-1); } //Redução de Plural if(analisa.endsWith("s")){ analisa = analisa.substring( 0, analisa.length()-1); } //Redução Adverbial if(analisa.endsWith("mente") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-5); } //Redução de Grau -> Remove aumentativo e diminutivo //Os tamanhos mínimos das palavras foram considerados analisando a língua portuguesa //A fim de não descartar palavras como cão, mão, aço e vinho if(analisa.endsWith("zão") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ção") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ão") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if(analisa.endsWith("zona") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("ona") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ço") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if(analisa.endsWith("inho") && analisa.length() > 6){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("inha") && analisa.length() > 6){ analisa = analisa.substring( 0, analisa.length()-4); } //Redução de Substantivo //Realizar este método de maneira completa requer a remoção de cerca de 60 sufixos //No nosso caso escolhemos os 30 principais if(analisa.endsWith("encialista") && analisa.length() > 4){
68
analisa = analisa.substring( 0, analisa.length()-10); } else if(analisa.endsWith("alista") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-6); } else if(analisa.endsWith("agem") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("iamento") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-7); } else if(analisa.endsWith("amento") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-6); } else if(analisa.endsWith("imento") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-6); } else if(analisa.endsWith("alizado") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-7); } else if(analisa.endsWith("atizado") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-7); } else if(analisa.endsWith("izado") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-5); } else if(analisa.endsWith("ativo") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-5); } else if(analisa.endsWith("tivo") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("ivo") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ado") && analisa.length() > 2){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ido") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ador") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("edor") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("idor") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("atória") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-6); } else if(analisa.endsWith("or") && analisa.length() > 2){ analisa = analisa.substring( 0, analisa.length()-2); }
69
else if(analisa.endsWith("abilidade") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-9); } else if(analisa.endsWith("icionista") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-9); } else if(analisa.endsWith("cionista") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-8); } else if(analisa.endsWith("ional") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-5); } else if(analisa.endsWith("ência") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-5); } else if(analisa.endsWith("ância") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-5); } else if(analisa.endsWith("eiro") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("oso") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-3); } else if(analisa.endsWith("ividade") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-7); } else if(analisa.endsWith("idade") && analisa.length() > 5){ analisa = analisa.substring( 0, analisa.length()-5); } else if(analisa.endsWith("inal") && analisa.length() > 4){ analisa = analisa.substring( 0, analisa.length()-4); } else if(analisa.endsWith("ano") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-3); } //Redução de Sufixo if(analisa.endsWith("ando") && analisa.length() > 2){ analisa = analisa.substring( 0, analisa.length()-4); sufix = true; } else if(analisa.endsWith("endo") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); sufix = true; } else if(analisa.endsWith("indo") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); sufix = true; } else if(analisa.endsWith("ondo") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-4); sufix = true; } else if(analisa.endsWith("ada") && analisa.length() > 6){ analisa = analisa.substring( 0, analisa.length()-3); sufix = true; }
70
//Redução Verbal if (!sufix) { if (analisa.endsWith("ar") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("er") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("ir") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("or") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("ur") && analisa.length() > 3){ analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("aríamo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-6); } else if (analisa.endsWith("ássemo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-6); } else if (analisa.endsWith("eríamo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-6); } else if (analisa.endsWith("êssemo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-6); } else if (analisa.endsWith("iríamo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-6); } else if (analisa.endsWith("íssemo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-6); } else if (analisa.endsWith("áramo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("árei" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("aremo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("ariam" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("aríei" ) && analisa.length() > 2) {
71
analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("ássei" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("assem" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("ávamo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("êramo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("eremo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("eriam" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("eríei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("êssei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("essem" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("íramo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("iremo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("iriam" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("iríei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("íssei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("issem" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-5); } else if (analisa.endsWith("ando" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("endo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("indo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4);
72
} else if (analisa.endsWith("ondo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("aram" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("arde" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("arei" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("arem" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("aria" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("armo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("asse" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("aste" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("avam" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("ávei" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("eram" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("erde" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("erei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("êrei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("erem" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("eria" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("ermo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("esse" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("este" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4);
73
} else if (analisa.endsWith("íamo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("iram" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("íram" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("irde" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("irei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("irem" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("iria" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("irmo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("isse" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("iste" ) && analisa.length() > 4) { analisa = analisa.substring( 0, analisa.length()-4); } else if (analisa.endsWith("amo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ara" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ará" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("are" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ava" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("emo" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("era" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("erá" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ere" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("iam" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3);
74
} else if (analisa.endsWith("íei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("imo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ira" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("irá" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ire" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("omo" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ai" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("am" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("ear" ) && analisa.length() > 4) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ar" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("uei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-3); } else if (analisa.endsWith("ei" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("em" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("er" ) && analisa.length() > 2) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("eu" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("ia" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("ir" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("iu" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("ou" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-2); } else if (analisa.endsWith("i" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-1);
75
} if (analisa.endsWith("a" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-1); } else if (analisa.endsWith("e" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-1); } else if (analisa.endsWith("o" ) && analisa.length() > 3) { analisa = analisa.substring( 0, analisa.length()-1); } } //Redução de Feminino if(analisa.endsWith("a")){ analisa = analisa.substring( 0, analisa.length()-1); } //Redução de acentuação analisa = analisa.replace("é", "e"); analisa = analisa.replace("á", "a"); analisa = analisa.replace("í", "i"); analisa = analisa.replace("ó", "o"); analisa = analisa.replace("ú", "u"); analisa = analisa.replace("ã", "a"); analisa = analisa.replace("õ", "o"); analisa = analisa.replace("â", "a"); analisa = analisa.replace("ê", "e"); analisa = analisa.replace("ô", "o"); System.out.println(analisa); if (analisa.length() > 2){ radicalizados.add(analisa); } } } return radicalizados; } public static ArrayList frequencia ( List termos, int contador){ ArrayList<Termos> nTermos = new ArrayList(); String palavra = new String(); int count = 0; for(Object str : termos){ Termos termo1 = new Termos(); Boolean found = false; palavra = (String) str; if (nTermos.isEmpty()){ termo1.setPalavra(palavra);
76
termo1.setFreq(1); nTermos.add(termo1); } else { Termos termo2 = new Termos(); found = false; count = 0; for (Termos obj : nTermos){ if (obj.equals(palavra)){ nTermos.remove(count); termo2.setPalavra(palavra); termo2.setFreq(obj.getFreq()+1); nTermos.add(termo2); found = true; break; } count++; } if (!found){ termo2.setPalavra(palavra); termo2.setFreq(1); nTermos.add(termo2); } } } Collections.sort(nTermos); ArrayList termosFinal = new ArrayList(); count = 1; for (Termos t2 : nTermos) { if (count > 0 && count <= (30*contador)){ termosFinal.add(t2); } count++; } return termosFinal; } }
77
APÊNDICE C – Arquivo .data para MatLab® //O número 20 abaixo refere ao número de atributos utilizados 20 #n cmo qdr rng água otr atnte grdor expr +pnt -pnt vrd/leg frt car beb qte fri dce salg consu ferr 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 arroz 1 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 atacant 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 azeit 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 batat 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 1 1 0 bistec 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 box 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 1 0 cald 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 1 1 0 carn 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 1 1 0 cebol 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 0 cha 0 0 1 0 1 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 combat 1 1 1 1 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 derrot 1 1 1 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 empat 1 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 gol 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 juiz 0 0 1 0 0 0 1 0 1 1 0 0 0 0 0 0 0 0 0 0 lut 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 0 molh 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 round 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 0 sal 0 0 0 1 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 pont
78
APÊNDICE D – URL dos textos utilizados no estudo Culinária: http://www.vortexhost.com.br/blogs/si/category/culinaria/ http://gastronomiaenegocios.uol.com.br/portal/carnes/3901-receita-de-bisteca-com-mandioquinha.html http://receitas.uol.com.br/ Esporte: http://esporte.uol.com.br/futebol/campeonatos/brasileiro/serie-a/pos-jogo/2011/11/20/fred-faz-tres-em-goleada-sobre-o-figueirense-e-fluminense-garante-vaga-na-libertadores.htm http://manoamano.blog.terra.com.br http://www.aovivoagora.com/
Top Related