Notícias
SmartSerpro: desenvolvendo aplicações inteligentes no Serpro
TemaTec 233
Inteligência Web (WI) é a área de estudo e pesquisa da aplicação da inteligência artificial e tecnologia da informação na web, a fim de criar a próxima geração de produtos, serviços e estruturas baseadas na internet. O uso de aplicações inteligentes pode facilitar a consulta em bancos de dados usando termos de negócios diários. O uso de processos de aprendizado de máquina pode possibilitar a criação de interfaces adaptáveis e de fácil uso. A WI pode possibilitar o compartilhamento de informações e auxiliar a tomada de decisões.
Inteligência Web permite acessar, analisar e compartilhar dados corporativos com muita facilidade. O uso de Inteligência Artificial pode possibilitar ao Serpro o aprimoramento de diversos de seus produtos como a categorização automática de e-mails pelo Expresso, o aprimoramento da identificação de declarações de imposto de renda para a malha fina ou a possibilidade de uma interface adaptável às preferências dos usuários do portal corporativo do Serpro.
O presente trabalho propõe o uso de técnicas de inteligência web no desenvolvimento de novos produtos pelo Serpro. O trabalho pretende utilizar técnicas de classificação, agrupamento, algoritmos genéticos de forma a automatizar tarefas e possibilitar o desenvolvimento de aplicações inteligentes. Dentre as principais funcionalidades apresentadas pelo trabalho e que podem ser incorporadas em diversas aplicações do Serpro estão: o ranqueamento de produtos ou funcionalidades, a recomendação de produtos ou funcionalidade, a indexação e a busca de termos dentro de um site, o uso de análise de sentimento em fóruns e comentários, a classificação de e-mails e de objetos.
O trabalho pretende também apresentar o uso de recursos de mineração de dados no desenvolvimento de novos relatórios de análise em aplicações desenvolvidas no Serpro. O presente estudo tem por objetivo propor um conjunto de alternativas de ação para desenvolvimento de aplicações com WI. O estudo pretende, ainda, utilizar técnicas de classificação, agrupamentos e algoritmos genéticos, de modo a automatizar tarefas e possibilitar o desenvolvimento de aplicações inteligentes.
Dentre as diversas funcionalidades apresentadas pelo estudo e que podem ser incorporadas a variadas aplicações do Serpro, destacam-se o ranqueamento de produtos ou funcionalidades, a recomendação de produtos ou funcionalidades, a indexação e a busca de termos dentro de um site, o uso de análise de sentimentos em fóruns e comentários, a classificação de e-mails e de objetos e o uso de telas adaptativas O estudo pretende também apresentar o uso de recursos de mineração de dados no desenvolvimento de novos relatórios de análise em Desenvolvendo aplicações com Aprendizado de Máquina.
1. Desenvolvendo aplicações com Aprendizado de Máquina
O aprendizado de máquina é um subcampo da Inteligência Artificial, dedicado ao desenvolvimento de algoritmos e técnicas por meio das quais o computador venha a aprender. Os algoritmos de aprendizado de máquina podem ser divididos em algoritmos preditivos e algoritmos descritivos. Os algoritmos preditivos têm como principais objetivos utilizar uma base de treinamento criada a partir de dados históricos e realizar previsões ou extrapolações de comportamentos futuros. Os algoritmos de caráter descritivo descrevem regras e comportamentos da base no momento em que esta é analisada. Dentre os algoritmos de caráter preditivo, destacam-se os grupos de classificação, regressão e séries temporais. Dentre os algoritmos com característica descritiva estão os associativos e de agrupamento (Witten et al., 2011) (Jiawei and Kamber, 2006).
Algoritmos de classificação
Um grupo de algoritmos bastante utilizado é o grupo de algoritmos de classificação. Por classificação entende-se o processo por meio do qual se atribui a determinado dado o rótulo de uma ou mais classes. Nesse sentido, as técnicas de aprendizado de máquina são empregadas na indução, a partir de um conjunto de exemplos, de um classificador, que deve ser capaz de prever as classes de novos dados. A Figura 2 mostra um exemplo de classificador que identifica cães e gatos em um dado conjunto de animais. O classificador deve utilizar uma base com características comuns aos dois grupos de animais, desenvolver um modelo que possa descrever a maioria das características e fazer predições acerca de novos elementos, classificando-os em um dos dois grupos (cães e gatos). O uso de um algoritmo de classificação sempre está atrelado ao correlacionamento dos elementos do conjunto de dados analisados e à margem de erro obtida pelo algoritmo. Dentre as práticas mais comuns de uso de classificação, destacam-se o uso de árvores de decisão, a classificação de textos e a análise de sentimentos.
Possibilidades de uso de algoritmos de classificação no Serpro
Dentre os diversos usos de algoritmos de classificação, destacam-se: detecção de spam, reconhecimento de imagens e classificação de e-mails. No Serpro, esse tipo de algoritmo pode ser utilizado em aplicações como a classificação de e-mails no Expresso ou a seleção de pessoas na malha fina, pelos sistemas da Receita Federal.
Árvores de decisão
O desenvolvimento de uma árvore de decisão pode ser descrito como um procedimento recursivo, no qual um conjunto de dados é distribuído em subconjuntos, até se encontrar elementos pertencentes a uma mesma “classe” (Matsubara, 2008).
As árvores de decisão classificam as instâncias a partir da raiz da árvore para um nodo folha, que fornece a classe da instância. Cada nodo da árvore especifica o teste de algum atributo da instância, e cada arco alternativo que desce desse nodo corresponde a um dos possíveis valores desse atributo. Uma instância é classificada começando no nodo raiz da árvore, testa o atributo relacionado a esse nodo e segue o arco que corresponde ao valor do atributo na instância em questão. Esse processo é repetido então para a subárvore abaixo, até chegar a um nodo folha (Mitichell, 1997).
Classificação de texto
É crescente a necessidade de processamento de informação textual, devido à dificuldade enfrentada pelas organizações ao lidar com grande quantidade de informações distribuídas eletronicamente. Os métodos capazes de prover organização, recuperação, filtragem e controle desses dados digitais podem ser úteis e aplicados em diversas funcionalidades de sistemas, como, por exemplo, a classificação de tópicos em e-mails, a classificação de notícias jornalísticas e a filtragem de spam ou classificação de e-mails (Medeiros, 2004).
Dentre as técnicas utilizadas para organizar informações textuais, destaca-se a classificação de textos. Seu objetivo é a categorização de documentos textuais dentro de um grupo de categorias prefixadas. Ao final de uma classificação, cada texto pode pertencer a múltiplas categorias, ou não pertencer a nenhuma.
O modelo mais utilizado para classificação de textos é denominado Bag of Words Vector. A ideia-chave do modelo é criar uma representação não ordenada de um documento com a frequência de cada palavra do texto. Nesse modelo, o texto é transformado em um conjunto de palavras, que é submetido a um algoritmo de classificação.
Possibilidades de uso de algoritmos de classificação de texto no Serpro
Um dos principais usos de algoritmos de classificação de textos no Serpro seria sua aplicação no Expresso, fazendo a classificação dos e-mails por assunto. O uso de análise de sentimentos pode prover uma série de novas funcionalidades, como a análise da imagem, positiva ou negativa, de um assunto em redes sociais.
Análise de sentimentos
A análise de sentimentos é o estudo de opiniões, sentimentos e emoções expressos em textos. Existem muitas tarefas relacionadas nessa área, como a extração de elementos do texto relacionados à opinião, a classificação da opinião quanto ao seu caráter (positivo, negativo ou neutro) e a comparação de sentenças quanto a suas opiniões. Diversas ferramentas fazem análise de sentimentos. No Java, a análise pode ser realizada pelas ferramentas Twitter4J (para coletar os tweets) e LingPipe (para classificar os sentimentos). No Python, a análise de sentimentos pode ser realizada de forma mais simples, utilizando a biblioteca TextBlob.
Algoritmos de agrupamento
Os dados podem ser organizados em grupos de alta similaridade, sendo essa prática habitualmente adotada nas atividades de marketing e conhecida como segmentação; na psicologia, nas práticas de sorting; na estatística, nos processos de classificação; e na área de Inteligência Artificial, na prática de aprendizado não supervisionado (Bishop and Nasrabadi, 2006) (Witten et al., 2011). Pode-se dizer que dois elementos são similares quando possuem características semelhantes. A similaridade entre os elementos de um grupo é obtida por meio do cálculo da distância entre suas características. A distância (dissimilaridade) entre dois elementos O1 e O2 é dada por um número real denominado d(O1,O2). A Figura 3 mostra um exemplo de duas impressões digitais em que a distância d de valor 342,2 é um valor numérico que quantifica a diferença entre as duas digitais (Bishop and Nasrabadi, 2006) (Witten et al., 2011) (Azevedo, 2010).
Os algoritmos de agrupamento têm como principal objetivo obter um grupo de dados a partir da similaridade de seus elementos, os quais possibilitam a obtenção de padrões inesperados. Os grupos gerados por algoritmos de agrupamento são denominados clusters. Um cluster é uma região de alta densidade circundada por outra, de baixa densidade. Um algoritmo de agrupamento atinge a sua convergência quando todos os elementos de um conjunto de dados pertencem a um cluster com elementos de características similares, levando-se em conta a menor taxa de erro possível (Teknomo, 2006) (Witten et al., 2011).
A literatura cita inúmeros algoritmos de agrupamento. Categorizar esse conjunto de algoritmos não é uma tarefa simples, pois alguns deles podem pertencer a mais de uma categoria. Dentre as diversas categorias utilizadas, destacam-se os algoritmos de particionamento, os algoritmos hierárquicos e os algoritmos baseados em densidade, descritos a seguir (Jiawei and Kamber, 2006):
• algoritmos de particionamento: dado um conjunto de dados de n tuplas, o algoritmo de particionamento apresenta k clusters, onde k≤n. Cada cluster deve satisfazer a dois requisitos: conter pelo menos um elemento e pertencer a um único cluster; (Jiawei and Kamber, 2006).
• algoritmos hierárquicos: esse tipo de algoritmo cria uma decomposição hierárquica de um conjunto de dados. Os algoritmos podem utilizar métodos aglomerativos ou divisivos. O método aglomerativo se inicia com todos os objetos pertencendo a clusters diferentes, enquanto o método divisivo se inicia com todos os objetos pertencendo a um mesmo cluster. À medida que percorre os objetos, o algoritmo agrupa os elementos por proximidade, resultando em uma hierarquia num gráfico denominado dendograma; e
• algoritmos baseados em densidade: enquanto os algoritmos de particionamento se baseiam principalmente na distância entre os objetos, os algoritmos baseados em densidade agrupam objetos até que a densidade atenda a um limite estabelecido, criando clusters de diferentes tamanhos e mais densidade.
Possibilidades de uso de algoritmos de agrupamento no Serpro
Os algoritmos de agrupamento podem ser utilizados em sistemas de auditoria e em extração de conhecimento em sistemas Data Warehouse.
Algoritmo K-Means
O K-Means é um algoritmo de agrupamento que objetiva particionar um conjunto de elementos a partir da distância de similaridade entre dois desses elementos. A grande vantagem do uso desse algoritmo reside em sua simplicidade e performance de execução. Uma das suas desvantagens é que o número de clusters deve ser informado antes da execução. A descoberta do número de clusters algumas vezes requer a execução do algoritmo com diferentes valores (Witten et al., 2011). O K-Means agrupa n amostras de dados em k grupos, de maneira que as amostras em um mesmo cluster sejam similares entre si e diferentes das outras. O funcionamento do algoritmo K-Means dá-se em quatro principais etapas, a saber: seleção de k centroides iniciais; atribuição de uma amostra ao centroide mais próximo, com base em um critério de distância; cálculo de novos centroides através da média das amostras pertencentes ao mesmo centroide; e as segunda e terceira etapas são repetidas até o algoritmo convergir para uma solução ótima.
Bibliotecas de aprendizado de máquina
As APIs de aprendizado de máquina podem ajudar os desenvolvedores a criar aplicativos com recursos de Inteligência Artificial e a realizar análises de dados sofisticadas sem que esses profissionais precisem ser especialistas em ciências de dados. Dentre as diversas APIs disponíveis para uso de aprendizado de máquina, destacam-se o Scikit-learn e o Apache Mahout, descritos a seguir:
• o Scikit-learn é uma API voltada para desenvolvimento Python simples e de fácil utilização, e fornece implementações de algoritmos de aprendizado de máquina para classificação e agrupamento; e
• o Apache Mahout disponibiliza um ambiente para o rápido desenvolvimento de aplicações de aprendizado de máquina escalável. A seguir, são apresentados exemplos de uso do Scikit-learn no desenvolvimento das técnicas de agrupamento e classificação.
Utilizando classificação de dados com o Scikit-learn
A API do Scikit-learn fornece suporte para aplicação de técnicas de classificação, agrupamento e regressão. Um dos usos mais comuns do Scikit-learn para classificação de dados é a árvore de decisão. A Listagem 1 mostra um exemplo de uso da API utilizando como treinamento dois vetores X e Y (X contendo os exemplos e Y contendo os labels de classificação).
# importando classificador
>>> from sklearn import tree
#Criando vetor de treinamento
>>>X= [[0, 0], [1, 1]]
#Criando vetor com labels de classificacao
>>> Y = [ 0 , 1 ]
#Criando classificador
>>> clf = tree . DecisionTreeClassifier ()
#Realizando treino
>>> clf = clf.fit(X, Y)
Aplicação do algoritmo K-Means utilizando o Scikit-learn
O Scikit-learn disponibiliza também uma API para descoberta e desenvolvimento de clusters. A Listagem a seguir mostra um exemplo de uso do algoritmo K-Means no Scikit-learn.
# Importando pacotes
>>> from sklearn import cluster , datasets
# Carregando dataset de nome iris
>>> i r i s = datasets . load_iris ()
# Carregando dados do dataset para o valor de X
>>> X_iris = iris.data
# Carregando labes do dataset para o valor de Y
>>> y_iris = iris . target
# Instanciando algoritmo
>>> k_means = cluster .KMeans( n_clusters=3)
# Aplicando algoritmo nos dados armazenados no valor X
>>> k_means. fit (X_iris)
Classificando textos utilizando o Scikit-learn
A ferramenta Scikit-learn fornece classificadores que podem ser utilizados no processo de classificação de textos. A seguir, é apresentado um exemplo do uso de classificação de textos com o Scikit-learn. No caso, um dataset de notícias é utilizado para ser classificado em quatro categorias (alt.atheism, soc.religion.christian,comp.graphics e sci.med). O primeiro passo no uso do dataset é a sua tokenização. O texto é transformado em vetor de palavras (Klein, 2015) (Scikit-learn, 2015).
>>> from sklearn . feature_extraction . text import CountVectorizer
>>> count_vect = CountVectorizer ()
>>> X_train_counts = count_vect.fit_transform(twenty_train.data)
>>> X_train_counts.shape
Após a aplicação da tokenização, é calculada a frequência de ocorrência de palavras
>>> tfidf_transformer = TfidfTransformer ()
>>> X_train_tfidf = tfidf_transformer.fit_transform(X_train_counts)
>>> X_train_tfidf.shape
Finalmente, o modelo é treinado e a predição é aplicada
>>> from sklearn.naive_bayes import MultinomialNB
>>> clf = MultinomialNB().fit(X_train_tfidf, twenty_train.target)
# Treinando modelo
>>> docs_new = [’God␣is␣love’, ’OpenGL␣on␣the␣GPU␣is␣fast’]
>>> X_new_counts = count_vect.transform(docs_new)
>>> X_new_tfidf = tfidf_transformer.transform(X_new_counts)
>>> predicted = clf.predict(X_new_tfidf)
# Realizando predicao
>>> for doc, category in zip(docs_new, predicted):
print(’%r␣=>␣%s’ % (doc, twenty_train.target_names[category]))
...
’God␣is␣love’=> soc.religion.christian # Resultado da predicao’
OpenGL␣on␣the␣GPU␣is␣fast’=> comp.graphics # Resultado da predicao
Realizando análise de sentimentos em Python
O framework TextBlob do Python realiza classificação de textos. O exemplo a seguir utiliza um classificador simples, treinado em um pequeno conjunto de dados de tweets falsos. A primeira atividade consiste em importar os classificadores e criar alguns dados de treinamento e teste. No exemplo, o classificador NaiveBayes é utilizado, e são criados exemplos de tweets de treinamento, positivos e negativos (Gioviz, 2015) (TextBlob, 2015).
from textblob.classifiers import NaiveBayesClassifier
train = [(’Amo␣sanduiche.’, ’pos’), (’Isso␣e␣maravilhoso!’, ’pos’),
(’Me␣sinto␣bem␣quanto␣a␣comida.’, ’pos’), .... ("Nao␣consigo␣lidar␣com␣isso", ’neg’),
(’Ele␣e␣meu␣pior␣inimigo’, ’neg’), (’Meu␣chefe␣e␣horrivel.’, ’neg’)]
test = [(’A␣cerveja␣esta␣boa.’, ’pos’), (’Nao␣gosto␣do␣meu␣trabalho’, ’neg’), ...
(’Ele␣e␣meu␣amigo.’, ’pos’), ("Nao␣acredito␣que␣fiz␣isso.", ’neg’)]
O próximo passo é utilizar um classificador com o conjunto de dados a ser classificado. Na listagem, é utilizado o classificador NaiveBayesClassifier.
cl = NaiveBayesClassifier(train)
cl.classify ("Os␣sanduiches␣estavam␣otimos") # “pos"
cl.classify("Nao␣gosto␣de␣pizza.") # "neg"
2. Recomendação de Produtos ou Funcionalidades
Os sistemas de recomendação estão a cada dia mais presentes nas aplicações Web, tornando os usuários cada vez mais dependentes de suas recomendações. Diversos usuários se apoiam nas recomendações de sistemas para tomar decisões. A Figura a seguir apresenta exemplo de uso de recomendação no portal da Amazon (http://www.amazon.com/) (Apache, 2015).
Os sistemas de recomendação podem ser aplicados em diversos cenários, como, por exemplo, na recomendação de funcionalidades na tela de um sistema ou na recomendação de novos itens de consulta em um sistema de auditoria. Dentre as diversas técnicas aplicadas para geração de recomendações, destaca-se o uso de filtros colaborativos (Carvalho et al., 2010). O termo Filtro Colaborativo (FC) foi definido em um dos estudos pioneiros em sistemas de recomendação. A ideia de uso de filtros colaborativos é que os usuários com perfis semelhantes podem compartilhar interesses semelhantes; ou seja, para um usuário a informação pode ser filtrada em relação aos comportamentos de usuários semelhantes. Os filtros colaborativos baseiam-se na experiência dos usuários com itens para tentar adivinhar itens adicionais.
O Apache Mahout (mahout.apache.org/) é uma das ferramentas que implementam o uso de filtros colaborativos. A ferramenta gera recomendações a partir de uma lista de três colunas. A primeira coluna representa o Id de usuário; a segunda representa o Id do item; e a terceira coluna representa a força da relação. A força da relação é dada pela nota que o usuário forneceu ao item. A Listagem mostra um exemplo de dataset com itens escolhidos e avaliados por um usuário.
Lista de Exemplo com preferências de usuário (Apache, 2015)
1 ,10 ,1.0
1 ,11 ,2.0
...
4 ,17 ,4.0
4 ,18 ,1.0
A seguir é apresentado o conjunto de atividades necessárias para uso do Mahout com recomendação de produtos. O primeiro passo na criação de recomendações é ler a lista e carregá-la em um modelo de dados. O Mahout realiza essa operação utilizando as classes FileDataModel e DataModel
DataModel model = new FileDataModel(new File("/path/to/dataset.csv"));
Nesse exemplo, a proposta é criar um recomendador baseado nas preferências do usuário. A ideia por trás da abordagem é calcular recomendações por determinados usuários olhando para outros usuários com seleções semelhantes e adotar as recomendações de seus itens. Para localizar usuários similares, é necessário comparar suas interações. A figura seguinte mostra um exemplo de escolhas de produtos por usuário. No exemplo da figura, poder-se-ia recomendar a pizza (Produto 1) ao Usuário 3 e o Produto 4 ao Usuário 5.
Existem diversos métodos para realizar essa atividade. Um método popular consiste em calcular o coeficiente de correlação entre as suas interações de usuário. O Mahout realiza essa operação a partir da classe PearsonCorrelationSimilarity.
UserSimilarity similarity = new PearsonCorrelationSimilarity(model);
A tarefa seguinte é definir quais usuários semelhantes o recomendador deve utilizar. Por uma questão de simplicidade, o exemplo usa todos os que têm uma semelhança superior a 0,1. Isso é implementado por meio de classe denominada ThresholdUserNeighborhood. A classe usa a similaridade calculada.
UserNeighborhood neighborhood = new ThresholdUserNeighborhood(0.1,similarity, model);
Finalmente são instanciados o recomendador utilizando o modelo, os usuários semelhantes e suas similaridades, e o recomendador recomenda novos produtos para o usuário de Id 2 que comprou um produto com Id de valor 3.
UserBasedRecommender recommender = new
GenericUserBasedRecommender(model, neighborhood , similarity);
List recommendations = recommender.recommend(2, 3);
for (RecommendedItem recommendation : recommendations) {
System.out.println(recommendation);
}
3. Desenvolvendo com algoritmos genéticos
O Algoritmo Genético (AG) é o tipo mais conhecido de algoritmo evolutivo. Os algoritmos genéticos são técnicas de busca que utilizam procedimentos que simulam o processo de evolução de uma população. O processo de evolução é aleatório, porém, guiado por um mecanismo de seleção baseado na adaptação de estruturas individuais. A Figura mostra o modelo de funcionamento de algoritmos genéticos (Eubanks, 2005) (Mitchell, 1998).
O JGAP é um framework Java para programação de algoritmos genéticos. O componente fornece mecanismos genéticos básicos que podem ser utilizados para aplicar os princípios evolutivos para solução de problemas. A construção de uma solução com algoritmos genéticos passa pela definição da estrutura do cromossomo. O cromossomo representa uma solução potencial e é dividido em múltiplos genes. Os genes no framework JGAP representam aspectos distintos da solução como um todo, assim como os genes humanos representam aspectos distintos de pessoas individuais, como o sexo ou a cor dos olhos. Durante o processo de evolução, os cromossomos ficam expostos a vários operadores genéticos que representam acasalamento, mutação etc., e, em seguida, são escolhidos para a próxima geração, durante uma fase de seleção natural, com base na sua aptidão. Aptidão é a medida de solução ótima comparada a outras soluções possíveis.
A aptidão de um indivíduo em um algoritmo genético é calculada utilizando-se uma função de fitnesse. O JGAP fornece a classe FitnessFunction que deve ser sobrescrita para o cálculo da aptidão. A Listagem a seguir apresenta função de fitnesse para calcular o troco ideal de uma compra. O objetivo do problema consiste em apresentar um troco para uma compra em dinheiro com o menor número de moedas. O construtor da função verifica o valor em dinheiro apresentado. O valor de fitnesse afere quão próximo o valor em moedas está do troco necessário e o número total de moedas. O algoritmo seleciona os indivíduos com valor em moedas mais próximo do troco necessário. O segundo passo da função de fitnesse é ajustar o valor de acordo com o número de moedas. Indivíduos com menores números de moedas têm mais valor de função.
"
public class MinimizaTrocoFitnessFunction extends FitnessFunction {
private final int valorDinheiro;
public MinimizaTrocoFitnessFunction( int valorDinheiro ) {
if( valorDinheiro < 1 || valorDinheiro > 99 ) {
throw new
IllegalArgumentException( "Troco␣necessita␣estar␣entre␣1␣e␣99␣reais." );
}
this.valorDinheiro = valorDinheiro;
}
public double evaluate( IChromosome cromossomo ) {
int valorTroco = valorTroco(cromossomo );
int numeroTotalMoedas = getNumeroMoedas( cromossomo);
int diferenca = Math.abs( valorDinheiro − valorTroco );
double valorFitnesse = ( 99 − valorTroco);
// Passo 2
if( valorTroco == valorDinheiro )
{
fitness += 100 − ( 10 ∗ numeroTotalMoedas );
}
return fitness; ...
A Listagem a seguir apresenta um código de exemplo de uso do JGAP no problema de troco para uma compra em dinheiro. O código recebe como parâmetro um valor em dinheiro, instância a função de fitnesse a ser aplicada, define os genes do problema a ser resolvido, inicializa a população inicial e inicia o processo de evolução.
//Cria configuracao de algoritmo
Configuration conf = new DefaultConfiguration(); //Recebe valor em dinheiro
int valorDinheiro = Integer.parseInt(args[0]); //Define funcao de fit
FitnessFunction myFunc =new MinimizaTrocoFitnessFunction( targetAmount );
//Seta funcao para a configuracao
conf.setFitnessFunction( myFunc );
//Instancia genes
Gene[] sampleGenes = new Gene[ 4 ];
// No exemplo sao usados de 0 a 3 moedas de 25 centavos, 0 a 2 moedas de 10 centavos, 1
moeda de 5 centavos, 0 a 4 moedas de 1 centavo
//Genes para moeda de 25 centavos
sampleGenes[0] = new IntegerGene(conf, 0, 3 ); //Genes para moedas de 10 centavos
sampleGenes[1] = new IntegerGene(conf, 0, 2 ); //Genes para moedas de 5 centavos
sampleGenes[2] = new IntegerGene(conf, 0, 1 ); //Genes para moedas de 1 centavo
sampleGenes[3] = new IntegerGene(conf, 0, 4 ); //Instancia cromossomo
Chromosome sampleChromosome = new Chromosome(conf, sampleGenes ); //Aplica estrutura do cromossomo
conf.setSampleChromosome( sampleChromosome );
//Define a populacao inicial de 500 individuos
conf.setPopulationSize( 500 );
//Cria populacao inicial
Genotype population = Genotype.randomInitialGenotype( conf );
//Realiza uma evolucao
population.evolve();
//Retorna melhor solucao da evolucao
A proposta da solução do presente artigo consiste em fornecer recursos para o desenvolvimento de aplicações inteligentes a partir do uso de aprendizado de máquina, busca, indexação e ranqueamento de objetos, recomendação de objetos ou funcionalidades e algoritmos genéticos. A partir do estudo, foram encontradas as ferramentas mostradas na Tabela a seguir.
Funcionalidade | Objetivo da Funcionalidade | Exemplos de Aplicação | Ferramenta |
---|---|---|---|
Classificação de objetos | Aprende e diferenciar objetos de forma automática | Detecção de spam, categorização de documentos | Scikit-learner ApacheMahout Weka Mallet Spark Lingpipe |
Detecção de clusters | Detecção de padrões ou anormalidades | Relatório de auditoria, detecção de perfis e anormalidades | Scikit-learner Apache Mahout Weka Spark Lingpipe |
Análise de sentimento | Análise de comentários positivos ou negativos | Análise de chamados Análise de opiniões Análise de redes sociais |
Scikit-learner TextBlob Lingpipe |
Indexação e busca | Indexação e busca de documentos | Motor de busca | Apache Lucene Apache Nutch Lemur |
Ranqueamento | Ordenação de objetos | Ordenação de objetos por ocorrência de palavra-chave ou similaridade | Implementação do Modelo TF-IDF Implementação do Modelo BM-25 Implementação do Modelo RanksSVM Implementação do Modelo PageRank |
Recomendação | Recomendação de objetos baseado na experiência de outros usuários | Recomendação de palavras-chaves em consultas Recomendação de funcionalidades |
Apache Mahout |
Algoritmos | Evolução de problemas utilizando o conceito de algoritmos genéticos | Telas adaptativas Menus adaptativos Busca de padrões |
JGAP |
IChromosome bestSolutionSoFar = population.getFittestChromosome();
Há diversas possibilidades de aplicação da solução no Serpro. A análise de Malha Fina da Receita Federal pode utilizar recursos de classificação, de modo a aprender quando um contribuinte deve ser incluso na Malha Fina. O Expresso pode categorizar as suas mensagens eletrônicas de forma automática. Os menus e links de funcionalidades das aplicações do Serpro podem ser adaptativos e apresentados e evoluir de acordo com a experiência dos usuários.
O uso de recursos de ranqueamento torna possível que as aplicações do Serpro ordenem objetos de diversas maneiras, além da ordenação alfanumérica comumente utilizada. Os sistemas do Serpro poderão fazer recomendações, de modo que quando um usuário realizar uma busca ou usar uma funcionalidade, o sistema recomenda novas buscas ou funcionalidades, de acordo com as preferências ou similaridades entre diversos usuários.
À medida que os usuários governamentais exigem aplicações que se adaptem ou aprendam de acordo com a sua experiência de uso, torna-se fundamental a internalização das práticas apresentadas nesse estudo no processo de desenvolvimento do Serpro.
4. Conclusão
A Inteligência Web (WI) é a área de estudo e pesquisa da aplicação da Inteligência Artificial (IA) e da Tecnologia da Informação (TI) na Web. O uso de aplicações inteligentes pode facilitar a consulta em bancos de dados, possibilitar a criação de interfaces adaptáveis e de fácil uso, viabilizar o compartilhamento de informações e auxiliar o processo decisório ou analisar e compartilhar dados corporativos com mais facilidade. O estudo apresentou o uso de técnicas de inteligência Web que podem ser utilizadas pelo Serpro no desenvolvimento de novos produtos. Foram aqui apresentadas técnicas de classificação, agrupamento, algoritmos genéticos, de forma a automatizar tarefas e possibilitar o desenvolvimento de aplicações inteligentes. As funcionalidades apresentadas pelo estudo podem ser incorporadas em diversas aplicações do Serpro.
Dentre as possibilidades de aplicação das técnicas apresentadas no estudo, destacam-se: a análise de Malha Fina da Receita Federal; a classificação de mensagens eletrônicas pelo Expresso; a criação de telas adaptativas às preferências de usuários; o desenvolvimento de consultas em que os registros podem ser obtidos por critérios alternativos ao uso de ordenação alfanumérica; o desenvolvimento de aplicações para descobertas de padrões; e o desenvolvimento de funcionalidades de recomendação. O estudo apresentou diversas ferramentas que podem ser utilizadas pelo Serpro. Algumas dessas ferramentas foram apresentadas em detalhes, como o Scikit-learn, o Apache Mahout, as ferramentas Lucene e Nutch e as bibliotecas TextBlob e JGAP.
Dentre as possibilidades de estudo futuro, recomenda-se: definição de uma arquitetura de uso para aplicações inteligentes; melhor detalhamento das práticas apresentadas no estudo; aplicação das técnicas apresentadas em projeto-piloto no Serpro; e definição de novos produtos inteligentes no Serpro.
O estudo tem como principal desafio apresentar a diversidade de técnicas de WI disponíveis para desenvolvimento de aplicações inteligentes. O estudo se apresenta como um catálogo de soluções em que o Serpro poderá aplicar as funcionalidades apresentadas nos diversos projetos.
Referências
Apache (2015). Creating a User-Based Recommender in 5 minutes. https:// mahout. apache.org/users/recommender/userbased-5-minutes.html. [Online; accessed 18-March- 2015].
Azevedo, P. J. (2010). Clustering. www.di.uminho.pt/~pja/msc/Cluster- UCE.pptx. [Online; accessed 18-March-2015].
Bishop, C. and Nasrabadi, N. (2006). Pattern recognition and machine learning, volume 4. Carvalho, D. B. F., Milidiú, R. L., and Lucena, C. J. P. D.
(2010). Sistemas de Recomendação: uma abordagem por filtro colaborativo baseado em modelos.
Crestani, G. A. F. (2011). Advances in Information Retrieval Theory. Eubanks, B. D. (2005). Wicked Cool Java: Code Bits, Open-Source Libraries, and Project Ideas. No Starch Press. Gioviz (2015). How to: Sentiment Analysis of Tweets Using Java. http:// www.gioviz. com/2013/05/how-to-sentiment-analysis-of-tweets.html. [Online; accessed 18-March- 2015].
Guendouz Mohamed (2015). Implementation of TF-IDF in JAVA. https:// guendouz. wordpress.com/2015/02/17/implementation-of-tf-idf-in-java/. [Online; accessed 18- March-2015].
Guerra, G. (2015). Alta performance na indexação com Apache Lucene. http://www. devmedia.com.br/alta-performance-na-indexacao-com-apachelucene- parte-ii/ 4876. [Online; accessed 18-March-2015]. Hatcher,
Hatcher, E., Gospodnetic, O., and McCandless, M. (2004). Lucene in action. Manning Publications Greenwich, CT.
IPL (2015). How to run the BM25 similarity function using Lucene. http://ipl.cs. aueb.gr/stougiannis/bm25_2.html. [Online; accessed 18-March-2015].
JGAP (2015). JGAP: Java Genetic Algorithms Package. jgap.sourceforge.net/. [On- line; accessed 18-March-2015].
Jiawei, H. and Kamber, M. (2006). Data mining: concepts and techniques.
Klein, B. (2015). Text Categorization and Classification. http://www.pythoncourse. eu/text_classification_introduction.php. [Online; accessed 18-March-2015].
Manning, C. D., Raghavan, P., Schütze, H., et al. (2008). Introduction to information retrieval, volume 1. Cambridge university press Cambridge.
Martins, G. O. (2013). Avaliação de algoritmos para Ordenação de Documentos Digitais recuperados em busca.
Matsubara, E. T. (2008). Relações entre Ranking, Análise ROC e Calibração em Aprendizado de Máquina. Training.
Medeiros, E. A. (2004). Técnica de aprendizagem de máquina para categorização de textos.
Mitchell, M. (1998). An introduction to genetic algorithms. MIT press.
Mitichell, T. (1997). Aprendizado de máquina: árvore de decisão indutiva. pages 3–6.
Pamplona, V. (2015). Introdução ao Apache Lucene. http://vitorpamplona.com/wiki/ Introdu%C3%A7%C3%A3oaoApacheLucene. [Online; accessed 18-March-2015].
Sckikit-learn (2015). SciKit-learn Machine Learning in Python. http://scikitlearn. org/. [Online; accessed 18-March-2015].
Silva, M. N. C. (2014). Preparação do Nutch para descarga massiva.
Teknomo, K. (2006). K-Means Clustering Tutorial. Medicine, pages 1–12.
TextBlob (2015). Tutorial: Quickstart. http://textblob.readthedocs.org/en/latest/ quickstart.html. [Online; accessed 18-March-2015].
Witten, I. H., Frank, E., and Hall, M. a. (2011). Data Mining: Practical Machine Learning Tools and Techniques (Google eBook).
Este trabalho foi premiado no Congresso Serpro de Tecnologia e Gestão aplicadas a Serviços Públicos (ConSerpro) 2015, em primeiro lugar no tema Engenharia e Arquitetura de Software.
Francisco Nauber Bernardo Gois
Doutorando em Informática Aplicada. Mestre em Informática Aplicada pela Universidade de Fortaleza. Especialista em Desenvolvimento Web pela Universidade Federal do Ceará. Atualmente é analista de desenvolvimento do Serpro e professor do curso de graduação da Faculdade Lourenço Filho. Atuando principalmente nas áreas de Testes de Software, Testes Evolutivos, Desenvolvimento Web e Geoprocessamento.