UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE …siaibib01.univali.br/pdf/Rodrigo Andreatta da...
Transcript of UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE …siaibib01.univali.br/pdf/Rodrigo Andreatta da...
UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR
CURSO DE CIÊNCIA DA COMPUTAÇÃO
ANÁLISE DE MÉTODOS DE CONSULTA POR SIMILARIDADE DE TEXTOS EM BANCO DE DADOS
Área de Banco de Dados
por
Rodrigo Andreatta da Costa
Julia Marques Carvalho da Silva, MSc Orientadora
Itajaí (SC), dezembro de 2008
UNIVERSIDADE DO VALE DO ITAJAÍ CENTRO DE CIÊNCIAS TECNOLÓGICAS DA TERRA E DO MAR
CURSO DE CIÊNCIA DA COMPUTAÇÃO
ANÁLISE DE MÉTODOS DE CONSULTA POR SIMILARIDADE DE TEXTOS EM BANCO DE DADOS
Área de Banco de Dados
por
Rodrigo Andreatta da Costa Relatório apresentado à Banca Examinadora do Trabalho de Conclusão do Curso de Ciência da Computação para análise e aprovação. Orientadora: Julia Marques C. da Silva, MSc
Itajaí (SC), dezembro de 2008
ii
SUMÁRIO
LISTA DE ABREVIATURAS...................................................................v
LISTA DE FIGURAS................................................................................vi LISTA DE TABELAS............................................................................... ix
RESUMO.....................................................................................................x
ABSTRACT................................................................................................xi 1 INTRODUÇÃO......................................................................................1
1.1 PROBLEMATIZAÇÃO ..................................................................................... 3 1.1.1 Formulação do Problema................................................................................. 3 1.1.2 Solução Proposta ............................................................................................... 3 1.2 OBJETIVOS ........................................................................................................ 3 1.2.1 Objetivo Geral ................................................................................................... 3 1.2.2 Objetivos Específicos ........................................................................................ 3 1.3 METODOLOGIA................................................................................................ 4 1.4 ESTRUTURA DO TRABALHO ....................................................................... 5
2 FUNDAMENTAÇÃO TEÓRICA........................................................6
2.1 BANCO DE DADOS ........................................................................................... 6 2.1.1 Linguagem SQL ................................................................................................ 9 2.1.2 Algoritmos para Operações de Consulta...................................................... 12 2.1.3 Funções para Tratamento de Strings ............................................................ 13 2.2 ALGORITMOS DE BUSCA............................................................................ 15 2.2.1 Algoritmo da Força Bruta.............................................................................. 15 2.2.2 Algoritmo de Knuth-Morris-Pratt ................................................................ 16 2.2.3 Algoritmo de Boyer-Moore ............................................................................ 20 2.2.4 Algoritmo de Rabin-Karp .............................................................................. 24 2.2.5 Algoritmo de Levenshtein .............................................................................. 27 2.2.6 Algoritmo de Smith Waterman ..................................................................... 28 2.2.7 Algoritmo de Stochastic Model...................................................................... 29 2.2.8 Algoritmo de Jaro Metric............................................................................... 30 2.2.9 Algoritmo de Hamming Distance .................................................................. 31 2.2.10 Algoritmo de Soundex Distance Metric ........................................................ 31 2.2.11 Algoritmo de Convington’s Distance Function............................................ 33 2.2.12 Considerações sobre os Algoritmos de Similaridade Analisados............... 33 2.3 APLICAÇÕES COM ALGORITMOS DE SIMILARIDADE..................... 34 2.3.1 Similarity Retrivel Engine.............................................................................. 35 2.3.2 XSimilarity....................................................................................................... 37 2.3.3 Sistema de Reconhecimento de Imagens Similares ..................................... 41 2.3.4 Considerações sobre os aplicativos similares ............................................... 43
iii
2.4 SISTEMA DE AVALIAÇÃO DA PESQUISA INSTITUCIONAL ............. 44
3 PROJETO.............................................................................................52
3.1.1 Hamming Distance.......................................................................................... 53 3.1.2 Levenshtein ...................................................................................................... 55 3.1.3 KMP ................................................................................................................. 60 3.1.4 Jaro................................................................................................................... 62 3.1.5 Rabin-Karp...................................................................................................... 63 3.1.6 Algoritmo Proposto......................................................................................... 66 3.2 TESTES .............................................................................................................. 67 3.3 RESULTADOS OBTIDOS............................................................................... 69 3.4 ANÁLISE DA HIPÓTESE ............................................................................... 71 3.4.1 Hipótese 1......................................................................................................... 72 3.4.2 Hipótese 2......................................................................................................... 72 3.4.3 Hipótese 3......................................................................................................... 73 3.4.4 Hipótese 4......................................................................................................... 73 3.4.5 Hipótese 5......................................................................................................... 73 3.4.6 Hipótese 6......................................................................................................... 74 3.4.7 Conclusões........................................................................................................ 74
4 CONCLUSÃO ......................................................................................75
REFERÊNCIAS BIBLIOGRÁFICAS ...................................................77
A Cenários de testes .................................................................................80
A.1 CENÁRIO 1: USUÁRIO COM POUCAS PRODUÇÕES............................ 80 A.1.1 Cenário 1a: Participação em Bancas ............................................................ 80 A.1.2 Cenário 1b: Projeto de Pesquisa.................................................................... 81 A.1.3 Cenário 1c: Artigo em Evento Nacional ....................................................... 82 A.1.4 Cenário 1d: Orientação de TCC.................................................................... 83 A.1.5 Cenário 1e: Projeto de Pesquisa .................................................................... 84 A.1.6 Cenário 1f: Projeto de Pesquisa .................................................................... 84 A.1.7 Cenário 1g: Participação em Banca .............................................................. 85 A.1.8 Cenário 1h: Participação em Banca.............................................................. 86 A.1.9 Cenário 1i: Participação em banca ............................................................... 87 A.2 CENÁRIO 2 – USUÁRIO COM MAIS DE 1000 PRODUÇÕES................. 88 A.2.1 Cenário 2a: Participação em Banca .............................................................. 88 A.2.2 Cenário 2b: Artigo em Evento Internacional............................................... 89 A.2.3 Cenário 2c: Artigo em Evento Nacional ....................................................... 90 A.2.4 Cenário 2d: Curso de Curta Duração........................................................... 91 A.2.5 Cenário 2e: Participação em Banca .............................................................. 92 A.2.6 Cenário 2f: Artigo em Evento Internacional................................................ 93 A.2.7 Cenário 2g: Resumo em Evento Nacionais................................................... 94 A.2.8 Cenário 2h: Artigo em Evento Internacional............................................... 95 A.2.9 Cenário 2i: Comissão de Avaliação de Cursos............................................. 96
v
LISTA DE ABREVIATURAS
BD Banco de Dados CCIFM Centro de Ciências das Imagens e Física Médica CGI Common Gateway Interface CNPq Conselho Nacional de Desenvolvimento Científico e Tecnológico CPF Cadastro de Pessoa Física DCL Data Control Language DDL Data Definition Language DLL Dynamic-link library DML Data Manipulation Language DNA Deoxyribonucleic acid DQL Data Query Language HCFMRP Hospital das Clínicas da Faculdade de Medicina de Ribeirão Preto KMP Knuth-Morris-Pratt ODBC Open Data Base Connectivity PACS Picture Archiving and Communication System PL/SQL Procedural Language/Structured Query Language PROPPEC Pró-reitoria de Pesquisa, Pós-graduação, Extensão e Cultura SAPI Sistema de Avaliação da Produção Institucional SIREN Similarity Retrivel Engine SGBD Sistema Gerenciador de Banco de Dados SQL Structured Query Language SRIS Sistema de Reconhecimento de Imagens Similares TCC Trabalho de Conclusão de Curso UNIVALI Universidade do Vale do Itajaí XML Extensible Markup Language
vi
LISTA DE FIGURAS
Figura 1. Exemplo de banco de dados relacional.................................................................................8 Figura 2. Sintaxe do comando de consulta.........................................................................................10 Figura 3. Exemplo de uma consulta SQL ..........................................................................................12 Figura 4. Exemplo de uma consulta SQL com operador LIKE..........................................................12 Figura 5. Tipos de alinhamentos de strings........................................................................................15 Figura 6. Exemplo de funcionamento do algoritmo de força bruta ...................................................16 Figura 7. Exemplo da fórmula para calculo da próxima posição a ser utilizada na comparação do
algoritmo KMP...........................................................................................................................18 Figura 8. Valores de d(k) para o exemplo da Figura 6.......................................................................19 Figura 9. Algoritmo para determinação do D(k)................................................................................19 Figura 10. Resolução do mesmo exemplo mostrado na Figura 6, mas com a utilização do algoritmo
de KMP ......................................................................................................................................20 Figura 11. Explicação da heurística do bom sufixo e do mau caractere ............................................21 Figura 12. Exemplo da utilização da heurística do mau caractere baseado na Figura 11 ..................21 Figura 13. Exemplo da utilização da heurística do bom sufixo baseado na Figura 11 ......................22 Figura 14. Exemplo de applet comparando as palavras “a costa” e “rodrigo a costa” ......................23 Figura 15. Resultado da pesquisa do algoritmo Boyer-Moore...........................................................24 Figura 16. Exemplo do algoritmo de Rabin Karp. .............................................................................26 Figura 17. Definição da função de Levenshtein.................................................................................27 Figura 18. Exemplo de applet comparando as palavras “andreata” e “andreatta”.............................28 Figura 19. Definição da função de Smith Waterman .........................................................................29 Figura 20. Exemplo de comparação usando a função Smith Waterman............................................29 Figura 21. Métrica do algoritmo de Jaro. ...........................................................................................30 Figura 22. Exemplo da métrica de Jaro..............................................................................................31 Figura 23. Exemplo de cadeia de bits ................................................................................................31 Figura 24. Atribuição de valores do algoritmo de Convington’s Distance ........................................33 Figura 25. Exemplo de execução de consultas por similaridade sobre a tabela Exame, k-NN query
usando a métrica textura.............................................................................................................36 Figura 26. Exemplo da execução de consultas por similaridade sobre a tabela automóveis. ............37 Figura 27. Casos de uso apresentando as principais funcionalidades do sistema ..............................38 Figura 28. Interface do Xsimilarity ....................................................................................................39 Figura 29. Exemplo arquivo XML.....................................................................................................40 Figura 30. Exemplo de uma consulta do XSimilarity ........................................................................41 Figura 31. Visualização das imagens médicas do SRIS.....................................................................42 Figura 32. Tela de resultados de consultas por similaridade do SRIS ...............................................43 Figura 33. Tela do SAPI.....................................................................................................................46 Figura 34. Referências das produções................................................................................................47 Figura 35. Detalhes das produções.....................................................................................................48 Figura 36. Diagrama entidade-relacionamento do SAPI ...................................................................49 Figura 37. Código PHP do SAPI utilizado para efetuar a comparação..............................................51 Figura 38. Sintaxe das funções de similaridade produzidas...............................................................52 Figura 39. Comparação entre as strings “ABACATE” e “ABATE”. ................................................53 Figura 40. Implementação da função Hamming Distance. ................................................................54 Figura 41. Resultado da comparação entre as palavras ABACATE e ABATE utilizando a função
Hamming Distance. ....................................................................................................................54
vii
Figura 42. Tabela gerada na comparação entre as palavras “ABACATE” e “ABATE” utilizando a função Hamming Distance. ........................................................................................................55
Figura 43. Trecho principal do código da função Levenshtein..........................................................55 Figura 44. Resultado da comparação entre as palavras “ABACATE” e “ABATE” utilizando a
função Levenshtein. ...................................................................................................................56 Figura 45. Primeiro passo do exemplo do algoritmo de Levenshtein. ...............................................56 Figura 46. Primeira comparação da segunda iteração do exemplo do algoritmo de Levenshtein. ....57 Figura 47. Segunda comparação da segunda iteração do exemplo do algoritmo de Levenshtein. ....58 Figura 48. Terceira comparação da segunda iteração do exemplo do algoritmo de Levenshtein......58 Figura 49. Quarta comparação da segunda iteração do exemplo do algoritmo de Levenshtein. .......59 Figura 50. Quinta comparação da segunda iteração do exemplo do algoritmo de Levenshtein. .......60 Figura 51. Resultado final da tabela de comparações do exemplo do algoritmo de Levenshtein .....60 Figura 52. Implementação da função KMP. ......................................................................................61 Figura 53. Resultado da comparação entre as strings “ABACATE” e “ABATE” utilizando o
algoritmo KMP...........................................................................................................................61 Figura 54. Primeira comparação do exemplo do algoritmo KMP. ....................................................61 Figura 55. Segunda comparação do exemplo do algoritmo KMP. ....................................................62 Figura 56. Resultado da comparação entre “ABACATE” e “ABATE” utilizando o algoritmo Jaro.
....................................................................................................................................................62 Figura 57. Implementação da função KMP. ......................................................................................63 Figura 58. Implementação da função Rabin-Karp. ............................................................................64 Figura 59. Resultado da comparação entre as strings “ABACATE” e “ABATE” utilizando o
algoritmo Rabin-Karp. ...............................................................................................................64 Figura 60. Primeira comparação do exemplo do algoritmo de Rabin-Karp. .....................................65 Figura 61. Segunda comparação do exemplo do algoritmo de Rabin-Karp. .....................................65 Figura 62. Terceira comparação do exemplo do algoritmo de Rabin-Karp.......................................66 Figura 63. Terceira comparação do exemplo do algoritmo de Rabin-Karp.......................................67 Figura 64. Gráfico do número de docentes por faixa de quantidade de produções. ..........................68 Figura 65. Gráfico da média do grau de similaridade resultante dos dois cenários de testes. ...........70 Figura 66. Gráfico da média do tempo de execução em segundos resultante dos dois cenários de
testes. ..........................................................................................................................................71 Figura 67. Teste Z para comparação entre médias.............................................................................72 Figura 68. Produção original e alterada do cenário 1a. ......................................................................80 Figura 69. Produção original e alterada do cenário 1b.......................................................................81 Figura 70. Produção original e alterada do cenário 1c. ......................................................................82 Figura 71. Produção original e alterada do cenário 1d.......................................................................83 Figura 72. Produção original e alterada do cenário 1e. ......................................................................84 Figura 73. Produção original e alterada do cenário 1f. ......................................................................85 Figura 74. Produção original e alterada do cenário 1g.......................................................................86 Figura 75. Produção original e alterada do cenário 1h.......................................................................87 Figura 76. Produção original e alterada do cenário 1i........................................................................88 Figura 77. Produção original e alterada do cenário 2a. ......................................................................89 Figura 78. Produção original e alterada do cenário 2b.......................................................................90 Figura 79. Produção original e alterada do cenário 2c. ......................................................................91 Figura 80. Produção original e alterada do cenário 2d.......................................................................92 Figura 81. Produção original e alterada do cenário 2e. ......................................................................93 Figura 82. Produção original e alterada do cenário 2f. ......................................................................94 Figura 83. Produção original e alterada do cenário 2g.......................................................................95 Figura 84. Produção original e alterada do cenário 2h.......................................................................96
viii
Figura 85. Produção original e alterada do cenário 2i........................................................................97 Figura 86. Produção original e alterada do cenário 2j........................................................................98
ix
LISTA DE TABELAS
Tabela 1. Composição de um comando de seleção ............................................................................11 Tabela 2. Comparação entre funções dos bancos Oracle, Postgre e SQL Server ..............................14 Tabela 3. Regras do Soundex Code ...................................................................................................32 Tabela 4. Exemplo da regra do algoritmo Soundex Code com a string “Dickson” e “Dixon”. ........32 Tabela 5. Valores das penalidades da função de Convigton’s Distance ............................................33 Tabela 6. Tabela comparativa entre aplicativos similares..................................................................44 Tabela 7. Tabela de resultados geral dos testes quanto ao grau de similaridade ...............................69 Tabela 8. Tabela de resultados do cenário 1a.....................................................................................81 Tabela 9. Tabela de resultados do cenário 1b. ...................................................................................81 Tabela 10. Tabela de resultados do cenário 1c...................................................................................82 Tabela 11. Tabela de resultados do cenário 1d. .................................................................................83 Tabela 12. Tabela de resultados do cenário 1e...................................................................................84 Tabela 13. Tabela de resultados do cenário 1f. ..................................................................................85 Tabela 14. Tabela de resultados do cenário 1g. .................................................................................86 Tabela 15. Tabela de resultados do cenário 1h. .................................................................................87 Tabela 16. Tabela de resultados do cenário 1i. ..................................................................................88 Tabela 17. Tabela de resultados do cenário 2a...................................................................................89 Tabela 18. Tabela de resultados do cenário 2b. .................................................................................90 Tabela 19. Tabela de resultados do cenário 2c...................................................................................91 Tabela 20. Tabela de resultados do cenário 2d. .................................................................................92 Tabela 21. Tabela de resultados do cenário 2e...................................................................................93 Tabela 22. Tabela de resultados do cenário 2f. ..................................................................................94 Tabela 23. Tabela de resultados do cenário 2g. .................................................................................95 Tabela 24. Tabela de resultados do cenário 2h. .................................................................................96 Tabela 25. Tabela de resultados do cenário 2i. ..................................................................................97 Tabela 26. Tabela de resultados do cenário 2j. ..................................................................................98
x
RESUMO
COSTA, Rodrigo Andreatta da. Análise de Métodos de Consulta por Similaridade de Textos em Banco de Dados. Itajaí, 2008. 127 f. Trabalho de Conclusão de Curso (Graduação em Ciência da Computação)–Centro de Ciências Tecnológicas da Terra e do Mar, Universidade do Vale do Itajaí, Itajaí, 2008. Os sistemas de bancos de dados evoluíram nos últimos anos, sendo cada vez mais comum encontrar bases com grandes volumes de dados. Nelas são encontradas informações dos mais diversos tipos, números, textos, datas e inclusive dados de tipos mais complexos, como arquivos e imagens. Porém estas informações não têm muita valia se não puderem ser recuperadas de alguma forma. A consulta vem a ser, por este motivo, uma funcionalidade muito importante para auxiliar os usuários. Contudo este procedimento permite apenas pesquisas por palavras fixas. Por outro lado, existem aplicações que necessitam realizar buscas textuais cujas consultas não podem retornar resultados iguais (idênticos) ou distintos, mas qual é o grau de semelhança. O objetivo deste trabalho é apresentar os principais algoritmos de busca por similaridade de textos, escolher alguns para serem implementados e analisar qual melhor se adequa ao cenário do Sistema de Avaliação da Produção Institucional (SAPI) e executar uma comparação entre os resultados obtidos nos testes. Palavras-chave: Busca por String. Algoritmos de Similaridade. Similaridade de Textos.
xi
ABSTRACT
The databases systems have been improved significantly in the last years. Nowadays, it’s very
common to find bases with a large number of records. They are able to store different kinds of data,
like numbers, characters, date and also complex data as images and files. But this stored
information doesn’t have any value if it cannot be recovered. The query comes to be, therefore, a
very important feature to help the users. The problem is that the database management systems
allow only exact searches. Otherwise, there are applications that need to do text searches can’t
return distinct or identical results, but the similarity’s degree. The aim of this work is to show some
algorithms to search for similar texts, choose some of them to implement and to analyze which is
the best for the scenario of SAPI and to execute a comparison among the test’s results.
Keywords: String Searches, Similarity Algorithms, Text Similarity.
1 INTRODUÇÃO
No passado era comum encontrar em empresas áreas de arquivamento de documentos, tanto
de texto, quanto de imagens, vídeos e sons, que formavam uma base de dados. O armazenamento
requeria muito espaço físico e a busca por informações era lenta e imprecisa. Com o
aperfeiçoamento da tecnologia, foi criada uma forma computacional de guardar estas informações,
forma esta que ficou conhecida como banco de dados.
Os bancos de dados costumam ser acessados e configurados por um sistema gerenciador de
banco de dados (SGBD). O SGBD normalmente utiliza um modelo relacional, onde as estruturas
têm forma de tabelas, compostas por linhas e colunas.
Em bancos de dados pode ocorrer o armazenamento de dados semelhantes, um exemplo
disso ocorre em bibliotecas digitais. Em uma base de dados composta pela integração de sistemas
de informações externos pode acontecer de existir informações relacionadas ao mesmo assunto,
porém gravadas de maneiras diferentes.
Borges et al. (2005) cita como exemplo o caso onde, o nome de uma cidade pode estar
armazenado das seguintes formas: “Rio Grande - RS”, “R. Grande”, “Rio Grande”, “Rio Graande.”
e assim por diante. Nestes casos, como não há como afirmar se duas representações são
provenientes de um mesmo objeto, uma saída é criar um mecanismo que verifique a proximidade
entre os valores.
Entretanto as possibilidades de busca e cruzamento de informações são realizadas de
diversas formas, possibilitando que uma consulta retorne dados não pertinentes. Neste cenário, para
se conseguir realizar uma consulta eficaz e confiável, é necessário a indexação adequada dos
registros armazenados na base que possua suporte à similaridade, o que nem sempre ocorre.
A idéia da técnica de busca por similaridade é baseada em recuperar objetos semelhantes ou
próximos ao elemento pesquisado, sendo definido como espaço métrico o conjunto dos objetos
referenciados. Na atualidade existem programas na área da medicina que utilizam Content-based
image retrieval em consultas à banco de dados de imagens.
2
Santos Filho (2001 apud Borges et al., 2005) afirma que: “Esta técnica executa comparações
por semelhança, permitindo uma consulta precisa o suficiente para que possa retornar resultados
satisfatórios, porém não tão precisa que venha deixar de retornar resultados relevantes.”.
Outra possível utilização de similaridade em consultas está na validação de estruturas
genéticas, onde uma seqüência de DNA (formada por agrupamento de letras que dão origem a
cadeias compostas por milhares de nucleotídeos). Altschul (1990) apud Souza (2004) desenvolveu
uma ferramenta capaz de definir o coeficiente de semelhança entre diferentes cadeias de seqüências.
A busca em textos é um importante recurso utilizado em ferramentas para edição de texto,
para recuperação de dados e manipulação de símbolos. Segundo Carvalho et al. (2005):
Os problemas de busca em texto consistem em encontrar todas as ocorrências (ou a primeira ocorrência) de uma palavra no texto. Onde a palavra e o texto são strings de um mesmo alfabeto. O importante é reportar todas as ocorrências sabendo-se que a busca por uma palavra de tamanho m em um texto de tamanho n (onde n > m) tem um tempo O(n) no pior caso (para m fixo).
A UNIVALI possui um sistema conhecido como Sistema de Avaliação da Produção
Institucional (SAPI) que é utilizado para gerenciar as produções dos docentes, mantendo uma base
de dados de todas as produções que são desenvolvidas, de forma integrada com o sistema Lattes.
Uma produção é qualquer artigo, trabalho acadêmico ou orientação. Cada produção
registrada no Lattes é carregada para o SAPI. Neste momento, cada produção do Lattes é
comparada com aquelas que já existem no currículo do SAPI, onde aquelas que apresentam 90% de
similaridade são consideradas iguais e então os dados são atualizados. As produções com menos de
90% são consideradas como novas e inseridas no SAPI.
Atualmente, para realizar esta comparação todas as produções do Lattes e do SAPI são
carregadas para a página PHP e então comparadas. Esta tarefa demanda um alto processamento do
servidor web, onde em currículos com alto número de produções (por exemplo, 450 produções)
pode levar até cinco minutos para realizar o processamento.
Considerando o cenário citado acima, surgiu a idéia de desenvolver rotinas implementadas
nos sistemas gerenciadores de banco de dados para resolver o problema de lentidão nas
comparações e também nas ineficiências existentes no processo.
3
Atualmente, os sistemas gerenciadores de banco de dados (SGBD's) comerciais existentes
não conseguem executar consultas de strings aproximadas para textos (GRAVANO, 2001 apud
BORGES, CONY, FREITAS, 2005). Desta forma, o presente TCC visa pesquisar e avaliar
algoritmos de pesquisa que consigam distinguir informações similares, mas que possam estar
representadas de maneiras diferentes em base de dados textuais.
1.1 PROBLEMATIZAÇÃO
1.1.1 Formulação do Problema
Os SGBD’s foram criados para permitir o armazenamento de informações, permitindo aos
usuários a recuperação dos dados através de consultas. Estas consultas possuem certa restrição, pois
apenas são possíveis comparações exatas com operadores do tipo: maior que, menor que, igual,
diferente, entre outros. Uma deficiência deste sistema está no fato da impossibilidade da execução
de consultas buscando por informações similares. Na grande maioria dos gerenciadores de banco de
dados há apenas funções para alterar a formatação e comparação de strings.
1.1.2 Solução Proposta
A solução proposta é pesquisar funções baseadas em algoritmos que realizam busca por
similaridade. Após análise das funções encontradas foram escolhidas algumas delas para serem
implementadas e disponibilizadas no SGBD. Foram realizados testes para saber qual algoritmo
realiza as buscas trazendo os dados mais próximos aos desejados e com o melhor desempenho. E
por último, foi documentado os resultados de cada algoritmo codificado.
1.2 OBJETIVOS
1.2.1 Objetivo Geral
Investigar, implementar e avaliar o uso de algoritmos de busca por similaridade, baseados
em métricas de distância entre Strings.
1.2.2 Objetivos Específicos
• Pesquisar e analisar possíveis aplicações similares;
• Compreender o processo de pesquisa em banco de dados;
4
• Pesquisar e definir os algoritmos que serão implementados;
• Implementação dos algoritmos:
o KMP;
o Rabin Karp;
o Levenshtein;
o Hamming Distance;
o Jaro.
• Testes dos algoritmos;
• Comparar os algoritmos, resultados obtidos e documentar informações sobre as
informações obtidas.
1.3 METODOLOGIA
O projeto tem como modelo de metodologia as seguintes etapas principais: (i) estudo; (ii)
especificação; (iii) implementação; (iv) testes; e (v) documentação.
A etapa de estudo tem como função a análise do problema que gerou o motivo do trabalho,
pesquisa de tecnologias necessárias para o desenvolvimento dos objetivos propostos, busca por
produtos similares e análise quanto a viabilidade do projeto.
A especificação é a segunda etapa do projeto proposto. É nesta fase que é feito o
levantamento e definição do que será desenvolvido, é procurado por algoritmos que possuem
características de pesquisa em textos, é feita a escolha os algoritmos que serão codificados e
formulada a criação da documentação em geral.
O próximo passo é a implementação dos algoritmos que foram escolhidos na etapa de
especificação. Nesta fase também se encontra a tarefa da obtenção e instalação do SGBD. Nesta
fase foram escolhidos alguns dos algoritmos encontrados para serem transformados em funções
codificadas na linguagem PL/SQL.
As duas últimas etapas são os testes e documentação, onde após a criação de um banco de
dados real são processadas as rotinas com as funções criadas. Para os testes, foram selecionados
registros da base de dados obtida. Após isso, cada registro foi copiado e modificado para ser
5
executado nas funções. Cada dupla de registros (original e modificado) teve sua similaridade
calculada pelos algoritmos implementados e também por uma função do PHP chamada similar_text
para haver um ponto de referência ao avaliar os resultados gerados em cada teste.
1.4 ESTRUTURA DO TRABALHO
Este trabalho está dividido em quatro capítulos principais, onde no primeiro é descrita uma
introdução do assunto de banco de dados, explicado qual o problema que originou a idéia deste
trabalho e definida qual a solução proposta. Também são expostos os objetivos gerais e específicos
do projeto.
O segundo capítulo é composto pela fundamentação teórica, onde são explicados os
principais assuntos que serão abordados no trabalho. Há tópicos que conceituam e definem os temas
de banco de dados, linguagem SQL, principais algoritmos existentes para realização de consultas
em banco de dados, funções para tratamentos de strings e os aplicativos existentes no mercado que
possuem uma funcionalidade parecida ao projeto proposto.
O terceiro capítulo é formado pela implementação dos algoritmos escolhidos, onde são
selecionadas duas palavras para serem aplicadas às funções e para explicar como cada algoritmo se
comporta para as mesmas variáveis de entrada. Este capítulo é a base de informação para
documentar o capítulo quatro que é onde são comentados os resultados obtidos.
2 FUNDAMENTAÇÃO TEÓRICA
Considerando que este trabalho é focado ao assunto de banco de dados, mais
especificadamente ao procedimento de consultas por strings em textos, neste capítulo serão
apresentados alguns conceitos sobre banco de dados, a linguagem utilizada para realizar consultas,
algoritmos existentes e algumas funções utilizadas para tratamento de strings.
2.1 BANCO DE DADOS
No cotidiano, a maioria das pessoas se depara com situações ou atividades que utilizam
algum tipo de banco de dados. Situações como, ir ao banco imprimir um extrato da conta, fazer uma
reserva de um hotel ou passagem aérea, consultar a disponibilidade de livros em uma biblioteca e
consultar preços de produtos em supermercados são formas invisíveis de interação com banco de
dados.
Segundo Date (2007) banco de dados é basicamente um sistema computacional que executa
a manutenção de registros. Pode ser feita uma comparação como sendo o equivalente eletrônico de
um armário de arquivamento, onde são armazenados conjuntos de arquivos de dados
computadorizados. Podem também ser considerados como um sistema de computador cuja função
principal é armazenar informações, permitindo que estas possam ser consultadas ou alteradas
quando necessário.
Para Elmasri (2006) “Um banco de dados é uma coleção de dados relacionados. Os dados
são fatos que podem ser gravados e que possuem um significado implícito”.
Estes sistemas podem ser encontrados desde em pequenos computadores de mão (palm),
computadores pessoais, até grandes mainframes ou clusters de computadores, sendo que quanto
mais mobilidade existir menor é a quantidade de recursos fornecidos pelo sistema. Em máquinas
com grande poder de processamento os sistemas costumam ser multi-usuário, onde mais de que um
usuário pode acessar o banco de dados ao mesmo tempo, diferentemente do que ocorre em sistemas
monousuário.
Date (2007) caracteriza os dados de um banco de dados como integrados e compartilhados,
pois é uma unificação de vários arquivos que podem ser acessados por mais de um usuário onde,
7
normalmente, cada usuário está interessado em apenas uma pequena parte das informações
armazenadas.
Segundo Elmasri e Navathe (2006), um banco de dados pode ser de qualquer tamanho e ter
sua complexidade variável, podendo ser mantido manualmente ou automaticamente.
Quando se está lendo sobre banco de dados é comum encontrar o termo Sistema
Gerenciador de Banco de Dados, conhecido como SGBD. Trata-se de um conjunto de softwares
(programas) responsáveis por manter o banco de dados em funcionamento. Segundo Date (2007), o
SGBD é a peça mais importante de todo o sistema. De uma forma simples, ele está localizado entre
o banco de dados físico (hardware), onde os dados estão realmente gravados, e o usuário que está
utilizando o sistema.
Para Elmasri e Navathe (2006) “O SGBD é um sistema de software de propósito geral que
facilita os processos de definição, construção, manipulação e compartilhamento de banco de dados
entre vários usuários e aplicações”.
Atualmente os SGBD’s utilizam o modelo de dados relacional que foi considerado como
sendo o mais flexível e adequado para tratar os vários problemas que se colocam no nível de
implementação da base de dados. A estrutura fundamental do modelo relacional é a relação (tabela),
que é formada por várias linhas (conhecidas como registros) que por sua vez são compostas por um
ou mais atributos que guardam o tipo de dados a ser armazenado.
Um SGBD possui algumas funcionalidades importantes, como por exemplo:
• Controlar a concorrência entre usuários ou programas: isto ocorre pois a mesma
informação não pode ser alterada por mais de um recurso ao mesmo tempo.
Considerando como exemplo uma reserva de passagem de avião, no momento em
que a atendente estiver realizando uma alteração na reserva do passageiro, o registro
que possui as informações desta reserva é bloqueado pelo SGBD contra a ação de
outros recursos (outros funcionários ou rotinas que são executadas no banco de
dados). Apenas a pós o fim da tarefa da atendente é que o registro é liberado para
outra operação. Segundo Mattoso (2005), o bloqueio pode ser lógico (através de
linguagem de programação) ou físico (travando o registro ou a tabela).
8
• Controlar as transações: por exemplo, em uma operação de reserva de vôo, no
decorrer das alterações feitas pela atendente operações de inserção, deleção e
alteração são executadas, porém serão percebidas ou visualizadas por outros recursos
apenas após a confirmação (comando conhecido como commit) ou rejeição
(comando conhecido como roolback) das ações.
• Controlar o acesso feito pelos usuários: é possível atribuir permissões para cada
usuário separadamente ou para grupos informando quais tabelas cada um tem acesso
e quais operações (alteração, inserção, deleção, consulta) cada um pode realizar.
• Controle de integridade nos dados: por exemplo, em uma operação de reserva de
vôo, o SGBD deve validar o que a atendente está informando como cidade destino,
sendo que, a tabela de reservas pode aceitar apenas cidades que já foram cadastradas
em outra tabela no banco de dados.
Por exemplo, a Figura 1 apresenta a tabela CURSO, com quatro registros, sendo que cada
registro é composto pelos campos NOME, NÚMERO, CRÉDITOS e DEPARTAMENTO.
Figura 1. Exemplo de banco de dados relacional
Um ponto interessante no modelo ER é que não há caminhos pré-definidos para se fazer
acesso aos dados. Por exemplo, é possível ligar a tabela CURSO (campo “Número”) com a tabela
9
SECAO (campo “Curso”). Da mesma forma pode-se ligar a tabela CURSO (campo “Número”) com
a tabela PRE-REQUISITO (campo “Número”) para saber qual curso precisa ser feito primeiro.
Contudo, para a utilização de tal funcionalidade, precisa-se tomar cuidado de alguns fatores
como, por exemplo, a repetição de informação e a incapacidade de representar parte da informação
e perda de informação.
2.1.1 Linguagem SQL
A SQL (Structured Query Language), conhecido também como Linguagem de Consulta
Estruturada, é uma linguagem padrão de pesquisa criada para se comunicar com bancos de dados.
Segundo Battisti (2006), esta linguagem foi desenvolvida para ser independente de hardware e
software.
Para Battisti (2006):
Ao usar o SQL, não é necessário saber a respeito do software de banco de dados ou do hardware envolvido em uma operação. Tudo o que você precisa conhecer são os comandos/instruções SQL padrão para solicitar informações, que obrigatoriamente é o mesmo em todos os sistemas que utilizam o SQL.
Battisti (2006) comenta que as instruções SQL são conduzidas com um único comando que
contém uma descrição completa da informação exigida. Explica também que o maior benefício do
método SQL é não haver a necessidade de se preocupar em como os dados são recuperados, mas
somente com o conteúdo do conjunto de dados.
Segundo Leme (2006), os comandos SQL são divididos conforme abaixo:
• Data Definition Language (DDL), Linguagem de Definição de Dados: Permite ao
usuário criar/apagar tabelas, índices e visões. Os principais comandos são create, drop e
alter.
• Data Manipulation Language (DML), Linguagem de Manipulação de Dados: Permite ao
usuário inserir, alterar, apagar ou selecionar registros (dados) em uma tabela. Os
principais comandos são insert, update, delete e select.
• Data Control Language (DCL), Linguagem de Controle de Dados: Controla as
permissões de acesso dos usuários do banco de dados para ver ou manipular
informações. Os principais comandos são grant e revoke.
10
• Data Query Language (DQL), Linguagem de Recuperação de Dados: É a parte da SQL
mais utilizada, sendo baseada no comando select para elaborar consultas.
Um dos comandos DML mais importante é a Consulta (select), pois é responsável por
recuperar os dados armazenados no banco de dados utilizando, ou não, critérios de restrição e
junção a outras tabelas. Sua sintaxe é apresentada na Figura 2.
SELECT [predicado] {*|tabela.*|[tabela.]campo1 [AS alias1] [,[tabela.]campo2 [AS alias2] [, ...]]} FROM tabelaexpression [, ...] [@externaldatabase] [WHERE <condição>] [GROUP BY <atributos agrupados>] [HAVING <condição de agrupamento>] [ORDER BY <lista de atributos>] [WITH OWNERACCESS OPTION]
Figura 2. Sintaxe do comando de consulta
Fonte: Adaptado de Battisti (2006); Elmasri e Navathe (2006).
Cada um dos elementos apresentados na Figura 2 é descrito em detalhes na Tabela 1.
11
Tabela 1. Composição de um comando de seleção
Elemento Descrição Predicado Um dos seguintes: ALL, DISTINCT, DISTINCTROW ou TOP.
Você usa um predicado para restringir o número de Registros que é retornado pela consulta. Se nenhum for especificado o padrão é ALL
* Especifica que todos os campos de uma determinada tabela ou consulta devem ser selecionados. Por exemplo: Select * from Pedidos - Retorna todos os campos da tabela Pedidos.
Tabela O nome da tabela ou consulta de onde são selecionados os campos. Por exemplo, Select Pedidos.NúmeroDoPedido, Pedidos.DataDoPedido from Pedidos - Seleciona os Campos NúmeroDoPedido e DataDoPedido, da tabela Pedidos.
Campo1, Campo2 O Nome dos campos a serem selecionados. Alias1, Alias2 Um "apelido" para o campo. Na Folha de Dados o apelido
aparece como o título da coluna. Por exemplo, Select Pedidos.NúmeroDoPedido As Número from Pedidos, faz com que a coluna NúmeroDoPedido tenha o nome Número a ela associado.
TabelaExpression O nome da tabela de onde os campos serão selecionados ExternalDatabase O nome do Bando de Dados que contem a tabela, caso não seja o
banco de dados atual. Where Utilizado para especificar critérios na consulta.
Por exemplo, Where Pedidos.PaísDeDestino="Brasil"
Group By O mesmo que Agrupar Por no modo estrutura da consulta, na linha Total
Having Especifica critérios quando utilizamos Agrupar Por. Order By Utilizado para classificação dos registros em ordem crescente ou
descendente de um determinado campo.
Fonte: Adaptado de Battisti (2003)
Em SQL, os operadores lógicos básicos de comparação usados para confrontar os valores
entre os atributos e constantes são: =, <, <=, >, >= e <>. A maioria dos SGBD’s possui uma
condição conhecida como LIKE, onde o usuário consegue definir apenas uma parte da string e
aceitar qualquer caractere nas demais posições da string como pode ser visto nos exemplos da
Figura 3 e Figura 4.
12
Select * From fornecedor Where cd_base_fornecedor = 157456811;
Figura 3. Exemplo de uma consulta SQL
Na consulta apresentada na Figura 3, o usuário deseja buscar todos os fornecedores que
possuam o código de base de fornecedor igual a 157456811.
Select * From cliente Where ds_logradouro like ‘%Brasil%’;
Figura 4. Exemplo de uma consulta SQL com operador LIKE
Na consulta apresentada na Figura 4, o usuário deseja buscar todos os clientes que possuam
a palavra ‘Brasil’ no campo de endereço da tabela, não importando se a palavra é rua, avenida,
estrada, rodovia ou o que mais estiver preenchido.
A PL/SQL (Procedural Language/Structured Query Language) é uma extensão da
linguagem padrão SQL para o SGBD Oracle da Oracle Corporation.
Novelli (2003) comenta que:
PL/SQL permite que a manipulação de dados seja incluídas em unidades de programas. Blocos de PL/SQL são passados e processados por uma PL/SQL Engine que pode estar dentro de uma ferramenta Oracle ou do Server. A PL/SQL Engine filtra os comandos SQL e manda individualmente o comando SQL para o SQL Statement Executor no Oracle Server, que processa o PL/SQL com os dados retornados do Server. É a linguagem básica para criar programas complexos e poderosos, não só no banco de dados, mas também em diversas ferramentas Oracle.
2.1.2 Algoritmos para Operações de Consulta
Segundo Elmasri e Navathe (2006), existem diversas opções para a execução da operação de
consulta (select), onde algumas dependem de o arquivo possuir caminhos específicos de acesso e
apenas podem aplicar certos tipos de condições de seleção. Os métodos de busca para seleção são
classificados em:
• Simples: selecionam registros de um arquivo podendo utilizar técnicas de varreduras de
arquivo (file scan) – percorrem os registros de um arquivo para buscar e recuperar os
13
registros que satisfazem a condição de seleção-; ou índices de varredura – se envolver
um índice; ou
• Complexos: se a consulta envolver diversas condições simples conectadas pelo operador
lógico and.
Abaixo estão alguns tipos de seleção dos métodos de busca (ELMASRI; NAVATHE, 2006):
• Busca linear (força bruta): recupera cada registro do arquivo e testa se seus valores de
atributos satisfazem a condição de seleção;
• Busca binária: se a condição de seleção envolver uma comparação de igualdade em um
atributo-chave para o qual o arquivo está ordenado. Ex: select * from cidade where nome
= ‘Itajaí’;
• Utilização de um índice primário (ou chave de hash): se a condição de seleção envolver
uma comparação de igualdade em um atributo-chave com um índice primário. Vale
ressaltar que esta condição recupera, no máximo, um único registro;
• Utilização de um índice primário para recuperar múltiplos registros: se a condição de
comparação for >, >=, < ou <= em um campo-chave com um índice primário, usa o
índice para encontrar o registro que satisfaça a condição de igualdade correspondente e
depois recupera os registros seguintes do arquivo de forma ordenada.
• Utilização de um índice cluster para recuperar múltiplos registros: se a condição de
seleção envolver uma comparação de igualdade em um atributo que não seja chave com
um índice clustering, usa o índice para recuperar todos os registros que satisfaçam a
condição; e
• Utilização de um índice secundário em uma comparação de igualdade: utilizado para
recuperar um único registro se o campo de indexação for uma chave ou para recuperar
múltiplos registros se o campo de indexação não for chave. Pode ser aplicado para
comparações com operadores: >, >=, < ou <=.
2.1.3 Funções para Tratamento de Strings
No banco de dados, as tabelas possuem campos que podem ser definidos para aceitar apenas
uma data, números, caracteres ou outros tipos de dados específicos. Existem funções criadas nos
bancos de dados para tratamento de cada tipo dos dados citados, funções estas que variam conforme
14
o SGBD utilizado. Na Tabela 2 são apresentadas as principais funções de tratamento de strings
existentes em três dos principais gerenciadores de banco de dados.
Tabela 2. Comparação entre funções dos bancos Oracle, Postgre e SQL Server
Elemento ORACLE SQL SERVER POSTGRE Converter a string caso seja nula
NVL ISNULL NULLIF
Retornar a string que possuir a maior letra inicial
GREATEST Não Encontrado Não Encontrado
Quantidade de caracteres de uma string
LENGHT LEN CHAR_LENGTH
Substituir uma string dentro de outra string
REPLACE STUFF REPLACE
Colocar a primeira letra em maiúsculo de cada palavra de uma string
INITCAP Não Encontrado INITCAP
Consultar parte de uma string
SUBSTR SUBSTRING SUBSTRING
Converter numérico para caractere
TO_CHAR STR TO_CHAR
Completar string com espaços ou caracteres
RPAD, LPAD SPACE RPAD, LPAD
Posição inicial de um caractere em uma string
INSTR PATINDEX POSITION
Retirar espaços em branco à direita de uma string
RTRIM RTRIM RTRIM
Retirar espaços em branco à esquerda de uma string
LTRIM LTRIM LTRIM
Converter todos os caracteres para maiúsculo
UPPER UPPER UPPER
Converter todos os caracteres para minúsculo
LOWER LOWER LOWER
Converter ASCII para caractere
CHR CHAR ASCII
Repetir uma string n vezes Não Encontrado Não Encontrado REPEAT
Na Tabela 2 pode-se verificar que há algumas funções com o mesmo nome, outras parecidas
e há ainda algumas que existem apenas em um SGBD específico, porém os gerenciadores são muito
parecidos neste ponto considerando as informações coletadas como um todo.
15
2.2 ALGORITMOS DE BUSCA
Para o ramo da computação, um algoritmo de busca, em termos gerais, é um algoritmo que
toma um problema como entrada e retorna uma solução, geralmente após resolver um número
possível de soluções.
Segundo Gondim (2006), há basicamente três tipos de comparações quanto aos
alinhamentos das strings, sendo:
• Global, quando as duas strings são alinhadas como um todo;
• Semi-Global, quando ignora os espaços nos extremos das seqüências e;
• Local, quando ignora espaços e diferenças nos extremos das strings.
A Figura 5 apresenta os tipos de alinhamentos de string.
Figura 5. Tipos de alinhamentos de strings
Fonte: Gondim (2006)
2.2.1 Algoritmo da Força Bruta
O algoritmo da força bruta verifica a existência de uma cadeia em um texto de forma
exaustiva. Considerando o padrão P a ser encontrado no texto T e i como a posição de inicio da
comparação na cadeia, são feitas comparações iniciando da primeira posição de T (P[1] = T[1]; P[2]
= T[2]; P[3] = T[3] …) (GOMES Jr., 2003). No momento em que a comparação informar que os
caracteres são diferentes, o algoritmo pára a análise, verifica qual é a posição de início e soma um a
16
este valor, continuando as comparações da posição seguinte do texto (P[1] = T[2]; P[2] = T[3]; P[3]
= T[4] … ). Na Figura 6 é ilustrado um exemplo do algoritmo de força bruta, considerando P como
a string abaeabaeaae e T como a primeira linha da figura.
Figura 6. Exemplo de funcionamento do algoritmo de força bruta
Fonte: Gomes Jr. (2008)
Neste algoritmo as comparações são executadas coluna à coluna. Quando uma das letras não
é igual, a posição inicial de comparação passa a ser a posição à direita seguinte conforme mostrado
na Figura 6. O algoritmo da força bruta repete estas tarefas até percorrer todo o texto, não se
preocupando em armazenar nenhuma informação referente aos caracteres que foram comparados
anteriormente.
2.2.2 Algoritmo de Knuth-Morris-Pratt
Este algoritmo, conhecido também como KMP, foi publicado no ano de 1977 por D. Knuth,
J. Morris e V. Pratt (REGO, 2006). A idéia do algoritmo é identificar um padrão P em uma
seqüência T analisando apenas uma vez cada termo da seqüência. Ele utiliza uma tabela, conhecida
17
como vetor next, temporária auxiliar para armazenar informações que serão usadas nas
comparações.
Rego (2006) comenta que o algoritmo possui implementação mais complicada porém mais
eficiente do que comparado com o da força bruta, e eficiência pior ao comparar com o Boyer-
Moore que será analisado em seguida.
Ao iniciar uma comparação de um novo padrão, informações importantes podem estar sendo
perdidas. Após a comparação de parte da string já se sabe os últimos caracteres da cadeia, sendo
possível em alguns casos, não perder tempo comparando alguns caracteres pois já se sabe que as
letras são diferentes e o algoritmo irá apenas perder tempo ao executar tal comparação.
O objetivo desta melhoria é evitar comparações repetidas, aproveitando ao máximo o padrão
correto após uma diferença ser encontrada. Considerando a Figura 6, as comparações das linhas
quatro, cinco e seis poderiam ter sido puladas. Isto se dá ao fato que na linha três as comparações
foram feitas até a coluna 17 do texto. Utilizando-se de um vetor auxiliar pode se concluir que a
comparação poderia continuar tendo como posição inicial a coluna sete, pois já se tem
conhecimento que as colunas quatro, cinco e seis não possuem caracteres válidos para o padrão.
Utilizando a Figura 7 como base, Gomes Jr. (2008) afirma que:
Dada uma discordância na posição k, uma sub-cadeia (l+h) conseqüente só poderá fornecer casamento se e somente pi = pi + h , 1 <= i <= k – h. A próxima posição a ser examinada após Bl + 1 é Bl + 1 + h. Para determinar o valor de h, calcula-se d(k-1), onde d(k-1) é o comprimento do maior prefixo próprio de pi , … pk – 1 tal que esse prefixo coincida com o sufixo de mesmo tamanho. Com isso, o valor mínimo de h = k – 1 – d(k-1), onde d(1) = 0 e se houver coincidências, d(k-1) = 0.
18
Figura 7. Exemplo da fórmula para calculo da próxima posição a ser utilizada na comparação do algoritmo KMP
Fonte: Gomes Jr. (2008)
Na Figura 8 é exemplificado o cálculo dos valores do vetor next (D(k)) necessário para saber
quantas posições deve ser deslocada a string ao efetuar um novo alinhamento. Para o cálculo, copia-
se a string que se deseja localizar e alinha-se está cópia com a ela mesma. Por padrão, a primeira
posição (d(1)) é sempre zero e para as demais o valor de D(k) é sempre igual ao acumulado de
número de letras que são iguais. No caso de k = 2, está se comparando “a” com “b” e por serem
diferentes a variável acumulada continua sendo zero. Para k = 3, está se comparando “a” com “a” e
por serem iguais verifica-se as próximas letras (“b” e “e”). Por elas serem diferentes, a variável
acumulada recebe o valor dela mesma mais um (quantidade de letras iguais), ou seja, D(3) = 1. Para
k = 4, está se comparando “a” e “e”, que por serem diferentes atribui-se zero para a variável
acumulada. Para k = 5, está se comparando “a” com “a”, que por serem iguais incrementa-se o valor
da variável acumulada (0 + 1), sendo desta forma D(5) = 1. Para k = 6, está se comparando “b” com
“b”, que por serem iguais incrementa-se o valor da variável acumulada (1 + 1), sendo desta forma
D(6) = 2. Para k = 7, está se comparando “a” com “a”, que por serem iguais incrementa-se o valor
da variável acumulada (2 + 1), sendo desta forma D(7) = 3. O cálculo de D(k) para os demais
valores de k continua seguindo a mesma idéia até que ocorra uma diferença na comparação. Quando
isto ocorrer a variável acumulada recebe o valor zero e a verificação continua com a mesma regra
até toda string ser percorrida.
19
Figura 8. Valores de d(k) para o exemplo da Figura 6
Fonte: Gomes Jr. (2008)
A Figura 9 apresenta o algoritmo para determinar o valor de D(k) (vetor next utilizado para o
cálculo do deslocamento).
j = d[1] = 0 k = 1 enquanto k < m faça se P[k + 1] = P[j + 1] então k = k + 1 j = j + 1 d[k] = j senão se j = 0 então k = k + 1 d[k] = 0 senão j = d[j]
Figura 9. Algoritmo para determinação do D(k)
Fonte: Adaptado de Gomes Jr. (2008)
A Figura 10 mostra como seria o processo de comparação do algoritmo de KMP com base
no mesmo exemplo da Figura 6 onde foi utilizado o algoritmo da força bruta.
20
Figura 10. Resolução do mesmo exemplo mostrado na Figura 6, mas com a utilização do algoritmo de KMP
Fonte: Adaptado de Gomes Jr. (2008)
Como pode ser analisado na comparação da Figura 6 com a Figura 10, verifica-se que o
algoritmo da força bruta executa 58 comparações enquanto o KMP executa apenas 30.
2.2.3 Algoritmo de Boyer-Moore
A idéia deste algoritmo é realizar uma busca da direita para a esquerda no padrão a ser
buscado. O algoritmo posiciona o padrão sobre o caractere mais à esquerda no texto, e faz uma
busca da direita para a esquerda. Se não ocorrer nenhuma diferença, então o padrão foi encontrado.
O algoritmo de Boyer-Moore possui duas heurísticas para calcular esta mudança, utilizadas
simultaneamente. Essas heurísticas freqüentemente permitem que muitos caracteres sejam pulados
evitando diversas comparações. Elas são conhecidas como a heurística do bom sufixo e a heurística
do mau caractere.
Segundo Moura, Dantas Filho e Porto (2002), este algoritmo desenvolvido por Robert Boyer
e Strother Moore é utilizado na grande maioria dos editores de textos existentes atualmente para
executar as tarefas de busca e substituição de texto.
Na Figura 11 o padrão a ser encontrado é representado pela segunda linha (string
“reminiscence”). Ao executar a comparação com o texto “writen_notice_that”, após executado o
alinhamento, percebe-se que as duas letras “ce” são iguais, porém ao analisar a terceira letra nota-se
uma diferença. Desta forma os caracteres “ce” formam o bom sufixo enquanto que o “i”, terceira
letra da analise, é o mau caractere.
21
Figura 11. Explicação da heurística do bom sufixo e do mau caractere
Fonte: Moura, Dantas Filho e Porto (2002)
Segundo Moura, Dantas Filho e Porto (2002), as heurísticas trabalham paralela e
independentemente. Quando ocorre uma diferença, cada uma das duas indica uma posição para o
deslocamento da próxima comparação, sendo escolhida sempre a que tiver maior valor.
A heurística do mau caractere verifica onde o caractere errado é encontrado no padrão
proposto para informar a nova possível posição de comparação. Moura, Dantas Filho e Porto (2002)
afirmam que o melhor caso ocorre quando o erro se encontra na primeira posição e este caractere
não existe no padrão, propondo o deslocamento igual a m (tamanho do padrão).
Na Figura 12 pode-se analisar o que a heurística do mau caractere faria no exemplo anterior.
Como a letra “i” foi a marcada com sendo o mau caractere, é procurado na string o caractere “i”
para fazer o novo alinhamento para seguir a analise da similaridade, alinhamento este que teve custo
de 4 posições.
Figura 12. Exemplo da utilização da heurística do mau caractere baseado na Figura 11
Fonte: Moura, Dantas Filho e Porto (2002)
22
A heurística do bom sufixo procura na string, da direita para esquerda, se existe dentro dela
o sufixo correto, sendo neste caso a string “ce”. Na Figura 13 é mostrado o novo alinhamento
proposto, que teve custo de 3 posições, utilizando a regra do bom sufixo.
Figura 13. Exemplo da utilização da heurística do bom sufixo baseado na Figura 11
Fonte: Moura, Dantas Filho e Porto (2002)
Depois de calculado as duas possíveis respostas, o algoritmo de Boyer-Moore acabaria
escolhendo a proposta pela heurística do bom sufixo, pois é a que retornou o menor custo de
deslocamento para realizar o próximo alinhamento.
A Figura 25 ilustra um applet que utiliza a função Boyer-Moore onde a string padrão “a
costa” é comparada com o texto “rodrigo a costa”. Na parte inferior encontra-se a tabela auxiliar
que mostra a posição de cada letra dentro da string padrão.
23
Figura 14. Exemplo de applet comparando as palavras “a costa” e “rodrigo a costa”
Fonte: Bühler (2004).
O resultado do exemplo da Figura 14 é encontrado na Figura 15, mostrando a quantidade de
comparações, a média de comparações por quantidade de caracteres, tamanho do texto e do padrão
e a posição em que o padrão foi encontrado dentro do texto.
24
Figura 15. Resultado da pesquisa do algoritmo Boyer-Moore.
Fonte: Bühler (2004).
2.2.4 Algoritmo de Rabin-Karp
Este algoritmo, criado por Michael Rabin e Richard Karp é baseado em uma teoria de
números, utilizando uma função hash para localizar strings em textos. Segundo Spido (2007), uma
função hash é utilizada para converter strings em valores numéricos. A idéia principal está no fato
de que caso duas cadeias de letras são iguais, os seus valores hash também devem ser iguais. Desta
forma, deve-se calcular o valor hash do padrão a ser procurado e, após isto, iniciar a comparação
com o valor hash do texto de referência.
Spido (2007) explica que existe uma desvantagem neste procedimento. Ocorre que devido
ao grande número de strings e para manter o tamanho dos valores hash pequenos, algumas strings
acabam recebendo valores iguais. Desta forma, mesmo que os valores hash sejam iguais, as strings
podem ser diferentes.
No exemplo da Figura 16 deseja-se encontrar a string “cab” na palavra “aabbcaba”. No
primeiro passo, armazenam-se os três primeiros caracteres em uma tabela hash que serão
comparados com a string que se deseja encontrar. Após isso se verifica quantos caracteres são
diferentes ao comparar com a string desejada, ainda não importando a seqüência que se encontra.
25
No primeiro passo calcula-se o valor hash da string “cab” (igual a 0) com o valor hash das
três primeiras letras, “aab” (igual a 1). Como os valores são diferentes, a comparação vai para o
passo seguinte onde é trocada a letra mais à esquerda pela letra seguinte da direita. Neste segundo
passo, o padrão “cab” é comparado com a string “abb”, que possui valor hash igual a 2. Como os
valores são diferentes, faz-se um deslocamento para gerar o novo alinhamento. No passo 3 o padrão
“cab” é comparado com a string “bbc” que possui valor hash igual a 1. Como os valores são
diferentes faz-se um deslocamento para gerar o novo alinhamento. No passo 4, o padrão “cab” é
comparado com a string “bca” que possui valor hash igual a 0. Neste caso, é iniciada uma
comparação da ordem de cada caractere pois os dois valores hash são iguais. A função ainda retorna
falso pois a seqüência das letras não é igual. No passo cinco, tanto os valores hash quanto a ordem
das letras são iguais e por isto a função termina sua execução retornando a posição como resposta.
26
Figura 16. Exemplo do algoritmo de Rabin Karp.
Fonte: Sparknotes (2008).
Spido (2007) conclui que, mesmo que este algoritmo possua o pior desempenho para O(mn)
e tenha desempenho inferior para pesquisa de padrões simples, o método possui a vantagem na
busca de padrões compostos, tendo assim uma grande aplicação como validação de rotinas para
analise de plágio.
27
2.2.5 Algoritmo de Levenshtein
Também conhecido como Edit Distance, foi um dos primeiros algoritmos de comparação
criados e é um dos mais utilizados nos dias de hoje. Permite inserções, exclusões e substituições de
caracteres para igualar duas strings.
Segundo Gondim (2006), são atribuídos diferentes valores para as operações: match
(igualdade dos caracteres); mismatch (substituições); inserções e exclusões para ser comparada a
pontuação de todas as possibilidades.
Na Figura 17 é mostrada a definição desta função onde, X e Y são as duas strings a serem
comparadas, M é uma matriz de Levenshtein, I e J são as posições dos caracteres das respectivas
strings, e a função p(i,j) é utilizada para determinar o grau de igualdade das strings.
Figura 17. Definição da função de Levenshtein
Fonte: Gondim (2006)
Considerando a regra da Figura 17, para a criação da tabela deve-se preencher as células
partindo da primeira linha/coluna, onde M(0,0) recebe valor 0 e as células à direita e abaixo
recebem o valor da célula anterior decrementando em 1. Para o preenchimento dos demais campos
da tabela deve-se seguir a regra:
• M(i – 1, j) – 1 : valor da célula da linha acima e da mesma coluna;
• M(i – 1, j – 1) + p(i,j) : valor da célula da linha acima e uma coluna à esquerda, onde
p(i,j) será igual a 2 caso os caracteres em questão sejam iguais ou -1 caso sejam
diferentes; e
• M(i , j – 1) – 1 : valor da célula da mesma linha e coluna à esquerda.
28
Figura 18. Exemplo de applet comparando as palavras “andreata” e “andreatta”
Fonte: Charras (1998).
Na Figura 18 está um exemplo de um applet que mostra a tabela auxiliar do algoritmo
levenshtein distance (preenchida conforme regra citada acima) para a comparação das palavras
“andreata” e “andreatta”. Na parte inferior estão os dois alinhamentos possíveis para o exemplo em
questão e a última célula da última linha mostra a quantidade de diferenças entre as duas palavras
(valor igual a um).
2.2.6 Algoritmo de Smith Waterman
Este algoritmo é similar ao de Levenshtein, tendo como diferencial a melhoria no
alinhamento de substrings ao invés de alinhar toda a string.
Gondim (2006) explica que qualquer pontuação negativa é trocada por zero e a pontuação
do alinhamento é o que possuir melhor pontuação entre todos, permitindo que as extremidades não
estejam alinhadas. A Figura 19 ilustra a definição da função de Smith Waterman.
29
Figura 19. Definição da função de Smith Waterman
Fonte: Gondim (2006)
O que diferencia o Levenshtein do Smith Waterman está no fato de que no segundo, caso o
valor seja negativo, ele será substituído por zero. Na Figura 20 foi executada a comparação das
strings “biomedicina” e “medico”, tendo 10 como a maior pontuação obtida na matriz.
Figura 20. Exemplo de comparação usando a função Smith Waterman
Fonte: Gondim (2006)
2.2.7 Algoritmo de Stochastic Model
Este algoritmo, da mesma forma que o de Levenshtein e o de Smith Waterman, é baseado na
execução de inserções, exclusões e alterações para a construção de uma matriz de pontuações. O
seu diferencial está no fato de que o algoritmo possui um mecanismo que dá valores às pontuações
dinamicamente, se adaptando conforme o conjunto de informações que o algoritmo recebe.
Gondim (2006) explica que o algoritmo de Stochastic Model possui um desempenho muito
parecido com o de Levenshtein, porém sua grande vantagem está na sua taxa de erro que é
aproximadamente 75% menor. O autor cita também que o algoritmo pode ser utilizado para
30
comparar qualquer tipo de string, mas foi testado apenas para o aprendizado de palavras em
conversações.
Uma desvantagem deste algoritmo está no fato de que é realizado um alinhamento global
das strings, possibilitando um baixo desempenho na atribuição de pontuações para palavras que
possuam sufixos semelhantes, como por exemplo as strings “telecomunicação” e “comunicação”.
Entretanto, Gondim (2006) explica que devido ao dinamismo do algoritmo, ele pode ser adaptado
para tratar este tipo de caso específico.
2.2.8 Algoritmo de Jaro Metric
Este algoritmo é parecido ao Levenshtein, pois também utiliza uma matriz, porém não
precisa ser implementada já que não é preciso guardar todos os dados na matriz.A idéia do
algoritmo está na quantidade de caracteres iguais na comparação de duas strings e na semelhança
quanto ao posicionamento na apresentação dos caracteres nas strings. Gondim (2006) explica o
algoritmo da seguinte forma:
Seja s = a1 ... ak e t = b1 ... bL, um caractere ai será considerado "em comum" com t se existir um caractere bj = ai, e o valor de i não pode diferir do valor de j mais do que H, onde H = mínimo( |s| |t| )/2, onde |s| e |t| são os tamanhos das strings s e t respectivamente. Seja s' = a'1 ... a'k os caracteres em s que são comuns com os de t (na mesma ordem que aparecem em s), e seja t' = b'1 ... b'L, análogo a s'.
A Figura 21 ilustra o algoritmo de Jaro.
Figura 21. Métrica do algoritmo de Jaro.
Fonte: Gondim (2006)
Na Figura 22 exemplifica-se a métrica de Jaro comparando-se as strings s = “Martha” e t =
“Marhta”. Para estas duas strings, o grau de similaridade obtido é igual a 0,944. Considere que uma
transposição ocorre quando duas palavras possuem as mesmas letras, porém há alguma diferença
nas posições. Isto ocorre neste exemplo onde as letras t e h estão trocadas entre si.
31
|s| = 6 (tamanho de s); |t| = 6 (tamanho de t); |s’ | e |t’ | = 6 (quantidade de letras iguais); Ts’,t’ = (quantidade de transposições dividido por 2) = 2 / 2 = 1. Jaro(Martha,Marhta) = 1/3 ( 6/6 + 6/6 + (6-1) / 6) Jaro(Martha,Marhta) = 0,944
Figura 22. Exemplo da métrica de Jaro
2.2.9 Algoritmo de Hamming Distance
Este algoritmo possibilita apenas substituições com custo igual a 1. Segundo Navarro (2001)
apud Gondim (2006), este problema é conhecido como “string matching with k mismatches”. Outra
definição da função por Chapman (2005 apud GONDIM, 2006) é “Número de bits que diferem
entre duas strings binárias, ou número de bits que precisam ser modificados para transformar uma
string idêntica à outra”. No exemplo da Figura 23 o valor da hamming distance entre as duas strings
que estão sendo comparadas é igual a 4, pois há 4 bits diferentes entre elas.
1 0 0 1 1 0 1 0 1 0 0 0 1 1 0 1
Figura 23. Exemplo de cadeia de bits
Fonte: Gondim (2006)
Ao comentar sobre este algoritmo, Gondim (2006) conclui que o mesmo é bastante eficiente
porém não seria capaz de comparar strings como “datanascimento” e “data-nascimento”, devido ao
fato de não permitir inserções ou exclusões.
2.2.10 Algoritmo de Soundex Distance Metric
A idéia deste algoritmo está em transformar cada string em um código formado por uma
letra e três números, conhecido como Soundex Code. O primeiro caractere deste código será sempre
o primeiro caractere da string e as demais letras devem ser substituídas por valores conforme as
regras apresentadas na Tabela 3.
32
Tabela 3. Regras do Soundex Code
Termo Valor A, E, I, O, U, H, W, Y 0 B, P, F,V 1 C, S, K, G, J, Q, X, Z 2 D, T 3 L 4 M, N 5 R 6
Fonte: Adaptado de Gondim (2006)
Na Tabela 4 está um exemplo de aplicação da regra utilizando as palavras “Dickson” e
“Dixon”. O primeiro passo é separar cada letra e atribuir seu respectivo valor conforme apresentado
na Tabela 3. Na coluna “Valor 1” da Tabela 4 encontram-se os valores de cada letra da palavra
“Dickson”, que juntos formam o código: D022205. O primeiro caractere do código sempre é igual a
primeira letra da string, sendo neste caso a letra “D”. No segundo passo, todos os números “0”
(zero) devem ser removidos, formando o código D2225. E por fim, para os números que aparecem
repetidos em seqüência deve-se deixar a penas um, formando o código D25. A palavra “Dixon”
possui o código D0205 (valores da coluna “Valor 2” da Tabela 4), que após a execução do passo
dois forma-se o código D25, mesmo soundex code da palavra “Dickson”. Gondim (2006) explica
que o algoritmo é bom apenas para verificar questões de fonética, pois foi desenvolvido para a
língua inglesa.
Tabela 4. Exemplo da regra do algoritmo Soundex Code com a string “Dickson” e “Dixon”.
Palavra 1 Valor 1 Palavra 2 Valor 2 D D D D I 0 I 0 C 2 X 2 K 2 O 0 S 2 N 5 O 0 N 5
Fonte: Adaptado de Gondim (2006)
33
2.2.11 Algoritmo de Convington’s Distance Function
Este algoritmo possui uma idéia parecida ao Soundex Distance, onde são realizadas
comparações que consideram se o caractere é uma vogal ou consoante. A função é simples, pois é
baseada na “tentativa / erro”. Ela considera três tipos de dados: consoantes, vogais e espaços em
branco. A Tabela 5 apresenta os valores das penalidades da função Convigton’s Distance.
Tabela 5. Valores das penalidades da função de Convigton’s Distance
Termo Penalidade Consoantes idênticas ou espaços 0 Vogais idênticas 5 Vogais diferentes 30 Consoantes diferentes 60 Termos Diferentes 100
Fonte: Adaptado de Gondim (2006)
Na Figura 24 é demonstrado o funcionamento da função de Convigton comparando-se as
strings “paciente” e “patient”. Após efetuar o alinhamento das duas palavras aplicam-se as
penalidades conforme regra da Tabela 5. O valor da soma das penalidades da comparação destas
duas palavras é igual a 125. Considerando que o número de letras da maior string é igual a 8,
conclui-se que no pior caso o valor da penalidade seria igual a 800 (oito termos diferentes). Desta
forma o grau de semelhança é igual a 125 / 800, que é igual a 0,844.
Figura 24. Atribuição de valores do algoritmo de Convington’s Distance
Fonte: Gondim (2006)
2.2.12 Considerações sobre os Algoritmos de Similaridade Analisados
Após as explicações realizadas sobre os algoritmos citados acima, pode-se concluir que o
com menor desempenho entre todos é o da força bruta, pois faz verificações de forma exaustiva,
sem utilizar comparações previas para melhorar o desempenho.
34
O algoritmo KMP é mais eficiente quanto utilizado para comparar cadeias de caracteres
repetidos como, por exemplo, uma cadeia de DNA. Isto ocorre pelo motivo de que o algoritmo usa
um vetor auxiliar (next) para armazenar as posições dos novos alinhamentos.
Quanto ao algoritmo de Rabin-Karp, ele tenta diminuir a quantidade de comparações
utilizando valores hash da string procurada e da substring do texto. Isto faz com que ele se torne
probabilístico. Sua melhor aplicação está em buscas de palavras maiores em textos grandes.
O algoritmo Stochastic Model tem sua eficiência comprovada para aprender os custos de
edição de um corpo de exemplos. Ele é capaz de adaptar a forma como que aplica as penalidades,
de acordo com informações que este algoritmo recebe.
Do algoritmo Levenshtein conclui-se que não é muito eficiente, mas é um dos mais
flexíveis, pelo fato de poder ser adaptado para diferentes funções de distância.
O algoritmo Hamming Distance é eficiente, mas permite apenas substituições, não sendo
possível realizar inserções ou remoções. Isto dificulta as comparações de, por exemplo,
“data_nascimento” com “data-de-nascimento”.
Do algoritmo Soundex conclui-se que possui um bom desempenho, mas ele apenas pode ser
aplicado para verificar erros de fonética, pois provavelmente apresentará grandes erros ao ser usado
para outra aplicação. E, além disso, terá muitos problemas para analisar strings que não forem da
língua inglesa.
O algoritmo Convington’s Distance possui desempenho muito ruim, pelo fato de utilizar
técnicas de construir uma árvore para efetuar as comparações. O tempo gasto é muito grande,
devido ao número de possíveis alinhamentos testados. Sua única vantagem está no cálculo do grau
de similaridade quando ocorrem erros fonéticos no texto.
Quanto ao Boyer-Moore, realiza as comparações da direita para a esquerda, baseada em
duas heurísticas e com complexidade igual a O(m . n).
2.3 APLICAÇÕES COM ALGORITMOS DE SIMILARIDADE
Esta seção apresenta alguns estudos de caso que utilizam algoritmos para comparação
baseado em similaridade para recuperação de informação. Através deste tópico é possível ter uma
idéia da fartura ou carência de programas com a funcionalidade proposta neste trabalho.
35
2.3.1 Similarity Retrivel Engine
O Similarity Retrivel Engine (SIREN) foi desenvolvido para validar a adequação de uma
proposta de extensão da linguagem SQL padrão que permite a execução de consultas por
similaridade (BARIONI et al., 2005).
Basicamente o que ocorre é uma comunicação entre um SGBD e os programas de aplicação,
interceptando todo comando SQL enviado por uma aplicação. Caso a aplicação tenha submetido
apenas comandos em SQL padrão o mecanismo executa as instruções de maneira transparente e,
caso o comando possua alguma condição que envolva similaridade ou alguma referência a um
objeto complexo definido pela extensão da linguagem, o comando é alterado e as operações de
similaridade são executadas por este mecanismo, com auxílio do SGBD para executar as operações
sobre os dados tradicionais.
Para executar consultas por similaridade sobre objetos em um domínio complexo é preciso
definir como a similaridade será mensurada e um novo tipo de dados complexo. De uma maneira
geral foram considerados dois tipos de objetos complexos:
• objetos armazenados como um conjunto de atributos; e
• objetos armazenados como um único objeto binário
Estes objetos são contemplados respectivamente pelos domínios PARTICULATE e
MONOLITHIC. Para ser possível executar as medidas de similaridades foi necessário criar os
comandos CREATE METRIC, ALTER METRIC e DROP METRIC que seguiram o estilo dos
comandos da Data Definition Language (DDL).
O projeto SIREN foi desenvolvido em C++ para ambiente Windows e utiliza o protocolo
ODBC para conexão com o SGBD Oracle 9i. Foi implementada uma aplicação web (CGI) em C++
que fornece um ambiente para a submissão de comandos em SQL.
Barioni et al. (2005) citam dois exemplos. Para isto dois novos tipos de dados definidos,
foram utilizados dois conjuntos de dados. O primeiro conjunto, denominado Exame, é formado por
800 imagens de exames de tomografia computadorizada divididas em quatro classes: crânio axial,
crânio coronal, crânio sagital e espinha sagital.
36
Cada tupla é constituída por um identificador da imagem, a imagem, e um atributo que
especifica a classe da imagem. Essas imagens podem ser consultadas de várias maneiras. Elas
podem ser comparadas, por exemplo, pela similaridade da distribuição de suas cores ou de suas
texturas. Para tanto devem ser definidas duas métricas, uma utilizando o extrator HISTOGRAMEXT
e outra o extrator TEXTUREEXT (BARIONI et al., 2005). A Figura 25 apresenta um exemplo de
execução de consultas tendo por base a similaridade.
Figura 25. Exemplo de execução de consultas por similaridade sobre a tabela Exame, k-NN query usando a métrica textura
Fonte: Barioni et al. (2005)
O segundo conjunto de dados usado no exemplo feito por Barioni et al. (2005), denominado
automóveis, é formado pelos testes realizados pela revista Quatro Rodas, entre maio de 2001 e
junho de 2005, com 140 carros de vários fabricantes. Cada conjunto possui o nome do modelo e do
fabricante do carro testado além dos resultados dos seguintes itens avaliados: número de cilindros,
potência em cavalos, aceleração de 0 a 100 km/h em segundos, retomada de 40 a 80 km/h em
segundos, velocidade máxima em km/h, frenagem de 80 a 0 km/h em metros, ruído interno em dB,
volume do porta malas em litros e consumo urbano em km/l. Consultas por similaridade podem ser
37
empregadas para explorar esse conjunto de dados em diversas questões, por exemplo, a relação
custo/benefício considerando itens como potência, volume do porta malas e consumo urbano. A
Figura 26 ilustra tal exemplo onde o usuário deseja encontrar quais são os cinco carros que
apresentam as características mais próximas de 70 cavalos de potência, 250 litros de volume de
porta malas e 13 km/l de consumo urbano.
Figura 26. Exemplo da execução de consultas por similaridade sobre a tabela automóveis.
Fonte: Barioni et al. (2005)
2.3.2 XSimilarity
O XSimilarity é uma ferramenta para consultas por similaridade embutidas na linguagem
XQuery. Segundo Silva, Borges e Galante (2008), a XQuery foi criada devido a necessidade de
realizar consultas em documentos XML. A XML foi inventada em 1996 e possui como principal
característica a flexibilidade, permitindo a definição de tags e marcações pelo próprio usuário.
Silva, Borges e Galante (2008) ainda citam que o XQuery está para o XML assim como o
SQL está para os bancos de dados relacionais, pois mesmo que as sintaxes sejam diferentes, a
semântica é a mesma. Os autores explicam que a sintaxe XQuery possibilita a realização de
consultas mais complexas e de leitura mais fácil ao se comparar com a sintaxe do SQL.
Foram implementadas várias funções de similaridade que foram embutidas na linguagem
XQuery, podendo ser comparadas através de uma funcionalidade existente no sistema. O aplicativo
38
é capaz de realizar consultas em ambientes integrados na Web, como por exemplo o CiteSeer e
bibliotecas digitais.
O XSimilarity foi desenvolvido em Java, utilizando a biblioteca NUX como mecanismo de
execução XQuery e a biblioteca SimMetrics para fornecer as funções de similaridade. Para a
criação da interface foi utilizado o pacote Java Swing. Na Figura 27 pode ser verificado as
principais funcionalidades disponíveis pela ferramenta ao usuário.
Figura 27. Casos de uso apresentando as principais funcionalidades do sistema
Fonte: Silva, Borges e Galante (2008)
Na Figura 28 é ilustrada a interface do XSimilarity. Nela há botões com funções de “novo”,
“abrir” e “salvar”. Os arquivos utilizados possuem extensão “xq” para serem diferenciados dos
demais, tendo seu conteúdo armazenado em formato texto. Silva, Borges e Galante (2008) explicam
que o botão com um desenho de “S” é o responsável por inserir as funções de similaridade na
consulta, enquanto que o botão com uma figura de um funil é o que permite a execução da consulta
XQuery.
39
Figura 28. Interface do Xsimilarity
Fonte: Silva, Borges e Galante (2008)
O conjunto de funções de similaridade implementado nesta ferramenta envolve métricas
baseadas tanto em caracteres, palavras (tokens) ou híbridas. Ainda possuem diferentes custos
computacionais e aplicabilidade variada. Estas diferentes características fornecem maior
flexibilidade para experimentos dos mais diversos tipos, o que justifica a escolha destas funções
para a implementação da ferramenta. A ferramenta foi planejada de modo que possa ser facilmente
estendida para a inclusão de novas funções de similaridade (SILVA; BORGES & GALANTE,
2008). Na Figura 29 é apresentado um exemplo do conteúdo de um arquivo utilizado para validar o
software.
40
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE dblp SYSTEM "dblp.dtd"> <dblp> <incollection mdate="2002-01-03" key="books/acm/kim95/AnnevelinkACFHK95"> <author>Jurgen Annevelink</author> <author>Rafiul Ahad</author> <author>Amelia Carlson</author> <title>Object SQL - A Language for the Design and Implementation of Object Databases.</title>
<pages>42-68</pages> <year>1995</year> <booktitle>Modern Database Systems</booktitle> <url>db/books/collections/kim95.html#AnnevelinkACFHK95</url> </incollection> <incollection mdate="2002-01-03" key="books/acm/kim95/Blakeley95"> <author>José A. Blakeley</author> <title>OQL[C++]: Extending C++ with an Object Query Capability.</title> <pages>69-88</pages> <booktitle>Modern Database Systems</booktitle> <url>db/books/collections/kim95.html#Blakeley95</url> <year>1995</year> </incollection> ... </dblp>
Figura 29. Exemplo arquivo XML
Fonte: Silva, Borges e Galante (2008)
A Figura 30 ilustra um exemplo onde o usuário deseja pesquisar por algo semelhante a
string “Leonidas Kavvbos” no arquivo “dblp2.xml”, tendo seu resultado apresentado na parte
inferior da interface. Como pode ser analisado, o nome correto do autor é “Leonidas Koveos” e só
foi possível encontrar o registro com a utilização da função de similaridade.
41
Figura 30. Exemplo de uma consulta do XSimilarity
Fonte: Silva, Borges e Galante (2008)
Sobre o processo de consulta, Silva, Borges e Galante (2008) concluem que o resultado de
uma consulta por similaridade depende da função utilizada, do limiar adotado e da base de dados a
ser consultada. É possível recuperar resultados indesejados se a função utilizada não for adequada à
consulta, ou se o limiar de similaridade não estiver corretamente ajustado.
2.3.3 Sistema de Reconhecimento de Imagens Similares
O Sistema de Reconhecimento de Imagens Similares (SRIS) é um sistema para consultas em
bancos de dados de imagens. Segundo Rosa et al. (2002), o programa tem o objetivo de possibilitar
a recuperação de imagens semelhantes armazenadas no banco de dados do Hospital das Clínicas da
Faculdade de Medicina de Ribeirão Preto (HCFMRP).
Rosa et al. (2002) conta que a aplicação foi adaptada a partir de um sistema Picture
Archiving and Communication System (PACS), tendo como motivo principal a deficiência dos
PACS, em realizar consultas baseadas nos conteúdos das imagens. Os autores explicam que estes
tipos de sistema permitem capturar, armazenar, distribuir e exibir imagens médicas.
Segundo Rosa et al. (2002), o Centro de Ciências das Imagens e Física Médica (CCIFM) da
Faculdade de Medicina de Ribeirão Preto desenvolveu uma ferramenta de laudo eletrônico utilizado
pelo Serviço de Radiodiagnóstico do HCFMRP, que contém todas as informações dos pacientes
(dados do paciente, data do exame, região do corpo, descrições, observações) existentes em forma
42
de texto. Rosa, Traina e Traina Jr. (2002) cita que o SRIS foi desenvolvido como proposta para de
extensão deste produto de laudo eletrônico, permitindo desta forma armazenar as imagens destes
exames e possibilitar a comparação delas por similaridade.
O SRIS foi desenvolvido através do Cbuilder 5 com banco de dados Oracle 8i. Suas
comparações são baseadas principalmente em características de cor, brilho, formas e texturas
existentes nas fotos gravadas. Essas características podem ser extraídas das fontes no momento em
que as imagens são gravadas ou podem ser apenas salvas, deixando este processo para ser realizado
futuramente.
Sobre o processo de verificação das características das imagens, Rosa et al. (2002) comenta
que:
Duas técnicas de extração de características de imagens foram adotadas no SRIS: o histograma tradicional e o histograma métrico, uma nova e eficiente técnica para capturar características de brilho das imagens, permitindo um acesso rápido e eficiente às imagens, e demandando menos espaço de armazenamento.
Figura 31. Visualização das imagens médicas do SRIS
Fonte: Rosa et al. (2002)
Na Figura 32 pode ser verificada a tela de realizações de consultas por similaridade, onde os
resultados são mostrados na forma de miniaturas possibilitando a ampliação de qualquer imagem
conforme desejo do usuário.
43
Figura 32. Tela de resultados de consultas por similaridade do SRIS
Fonte: Rosa et al. (2002)
2.3.4 Considerações sobre os aplicativos similares
O SIREN é uma ferramenta interessante, pois se nota que ela é capaz de analisar um banco
de imagens e exibir semelhanças conforme imagem passada como referência pelo usuário. Além
disso, o programa verifica uma característica similar em base de dados em formato de texto. Isto
pode ser visto no exemplo dos carros, cuja função é semelhante com a proposta no presente TCC.
O XSimilarity também realiza consultas em textos e possui um diferencial ao analisar bases
de arquivos do tipo XML, e permite ao usuário escolher qual a função que será utilizada pra efetuar
a busca.
O SRIS possui funcionalidade parcial ao comparada com o SIREN. Utilizado para análise de
imagens, baseia-se nas tonalidades das cores e brilhos das fotos armazenadas.
Foi construída a Tabela 6 para fins de comparação dos aplicativos similares, onde foram
consideradas as características tipo de dados aceito pelo programa, se o algoritmo de comparação
utilizado pelo programa é sempre o mesmo ou pode ser selecionado, se permite alteração do código
de busca por parte do programador e a linguagem utilizada pela aplicação.
44
Tabela 6. Tabela comparativa entre aplicativos similares
Aplicativo Tipo Dado Algoritmo Flexível Linguagem SIREN Imagem e texto Fixo Sim PHP XSIMILARITY XML Opcional Sim Java SRIS Imagem Fixo Não C++
Através da Tabela 6 pode-se verificar que cada um dos programas foi desenvolvido em uma
linguagem diferente, apenas o XSimilarity permite ao usuário escolher qual o algoritmo será
utilizado na operação e apenas o SRIS não permite ao usuário agir como programador para alterar a
forma de busca do aplicativo. Quanto ao tipo de dado permitido, o SRIS trata apenas imagens, o
XSimilarity apenas arquivos XML enquanto que o SIREN faz análise de imagem e texto.
2.4 Sistema de Avaliação da Pesquisa Institucional
O Sistema de Avaliação da Pesquisa Institucional (SAPI) é um sistema que avalia as
produções dos docentes da UNIVALI. Os resultados obtidos a partir das avaliações culminam na
forma de distribuição de bolsas de pesquisa, horas de pesquisa aos docentes, avaliação dos cursos,
etc. O acesso ao sistema deve ser possível para os docentes (que remetem seus currículos),
funcionários da Pró-Reitoria de Ensino - PROPPEC (que gerenciam as informações, principalmente
controlando a validação das produções) e demais funcionários da instituição que necessitam de
relatórios gerenciais conforme sua atuação (pró-reitores, diretores de centro, coordenadores de
curso).
Desta forma, as funcionalidades do SAPI são apresentadas conforme o perfil do usuário:
1. Funcionário da PROPPEC:
a) Envio de Currículos: o funcionário poderá realizar a submissão de currículos Lattes
(XML) em nome de algum docente. A identificação do currículo será realizada pelo
CPF encontrado no arquivo submetido.
b) Buscas: o funcionário poderá localizar produções ou currículos utilizando palavras-
chave, nome do docente ou código do docente.
c) Aguardando Verificação: exibir as produções por docente que aguardam verificação
por parte dos funcionários da PROPPEC. A verificação consiste em checar se as
45
produções já não foram validadas previamente (pelo sistema antigo) ou se os
docentes deverão validá-las.
d) Relatórios: o funcionário poderá confeccionar relatórios customizados a partir de
parâmetros selecionados, tais como: especificar cursos, centros, grupos de pesquisa,
docentes, etc. Além disso, pode visualizar todos os relatórios confeccionados.
e) Cadastros: é possível gerenciar as informações sobre áreas, grupos, cenários de
pontuação, perfis de usuário – PROPPEC e Pró-reitores -, currículos.
2. Pró-Reitor:
a) Envio de currículos (caso o pró-reitor também atuar como docente na instituição).
b) Minhas produções (caso o pró-reitor também atuar como docente na instituição).
c) Relatórios: de forma semelhante ao funcionário da PROPPEC, o pró-reitor poderá
confeccionar relatórios com informações referentes a toda instituição. Além disso,
pode visualizar todos os relatórios confeccionados.
3. Diretor de Centro:
a) Envio de currículos (caso o diretor também atuar como docente na instituição).
b) Minhas produções (caso o diretor também atuar como docente na instituição).
c) Relatórios: de forma semelhante aos perfis anteriores, o diretor poderá confeccionar
relatórios, porém com informações apenas referentes ao centro em que atua. Além
disso, pode visualizar os relatórios a ele disponibilizados.
4. Coordenador de Curso:
a) Envio de currículos (caso o coordenador também atuar como docente na instituição).
b) Minhas produções (caso o coordenador também atuar como docente na instituição).
c) Relatórios: de forma semelhante aos perfis anteriores, o coordenador poderá
confeccionar relatórios, porém com informações apenas referentes ao curso em que
atua. Além disso, pode visualizar os relatórios a ele disponibilizados.
5. Docente:
a) Envio de currículos (caso o coordenador também atuar como docente na instituição).
b) Minhas produções (caso o coordenador também atuar como docente na instituição).
46
c) Relatórios: pode visualizar os relatórios a ele disponibilizados.
Na Figura 33 pode ser verificada a tela de menu de opções do SAPI, onde o usuário pode
solicitar uma atualização, verificar suas produções e gerar relatórios, entre outros.
Figura 33. Tela do SAPI
A Figura 34 exibe as produções cadastradas para o usuário Júlia Marques Carvalho da Silva,
cada uma com uma situação (produção validada, falta entregar produção na PROPPEC, produção
válida para a UNIVALI, entre outras) que é identificada por uma imagem ao lado.
47
Figura 34. Referências das produções
O usuário pode clicar em uma das produções para verificar todos os atributos referentes a
produção selecionada, conforme pode ser visto na Figura 35.
48
Figura 35. Detalhes das produções
Na Figura 36 pode ser visualizado o diagrama ER do sistema SAPI. Para este projeto, as
entidades importantes são a PRODUCAO e DOCENTE_PRODUCAO.
49
AREA
ARE_COD
ARE_NOMEARE_PES_CADASTROUARE_PES_DELETAARE_INICIOARE_FIMARE_COD_CNPQ
AREA_PRODUCAO
ARE_COD (FK)PRO_COD (FK)ARP_INICIO
ARP_PES_CADASTROUARP_PES_DELETAARP_FIM
ARQUIVO
PES_COD
SUB_COD (FK)ARQ_XML
CENARIO
CEN_COD
CEN_NOMECEN_PES_CADASTROUCEN_INICIOCEN_PES_DELETACEN_FIM
CENARIO_PRODUCAO
TIP_COD (FK)CEN_COD (FK)
CEP_PESOCEP_INICIOCEP_FIMCEP_PES_CADASTROUCEP_PES_DELETA
DOCENTE_PRODUCAO
PES_CODPRO_COD (FK)DOP_INICIO
PRO_REFERENCIADOP_FIMDOP_PES_CADASTROUDOP_PES_DELETA
GRUPO
GRU_COD
GRU_NOMEPES_CODUNICODGRU_PES_CADASTROUGRU_PES_DELETAGRU_INICIOGRU_FIMGRU_PARTICIPANTES
PRODUCAO
PRO_COD
PRO_PES_DELETAPRO_PES_CADASTROUTIP_COD (FK)PRO_INICIOPRO_FIMSUB_COD (FK)PRO_VALIDAPRO_VALIDA_DOCENTEPRO_VALIDA_PROPPECPRO_VALIDA_DATATIP_COD_PAIPRO_VALIDA_ANTIGO
PRODUCAO_CURSO
PRO_COD (FK)CURCODPRC_INICIO
PRC_PES_CADASTROUPRC_PES_DELETAPRC_FIM
PRODUCAO_GRUPO
PRO_COD (FK)GRU_COD (FK)PRG_INICIO
PRG_PES_CADASTROUPRG_FIMPRG_PES_DELETA
RELATORIO
REL_COD
REL_NOMECEN_COD (FK)REL_PES_CADASTROUREL_INICIOREL_FIMREL_PES_DELETAREL_ANO_INICIOREL_ANO_FIMREL_UNIVALI
RELATORIO_AGRUPA
REL_COD (FK)AGR_ORDEM
AGR_DESCRICAO
RELATORIO_AREA
REL_COD (FK)ARE_COD (FK)
RELATORIO_CAMPUS
REL_COD (FK)CAMCOD
RELATORIO_CENTRO
REL_COD (FK)CENCOD
RELATORIO_CURSO
REL_COD (FK)CURCOD
RELATORIO_DOCENTE
PES_CODREL_COD (FK)
RELATORIO_GRUPO
REL_COD (FK)GRU_COD (FK)
RELATORIO_PERFIL
REL_COD (FK)PES_CODREP_INICIO
REP_PES_CADASTROUREP_PES_DELETAREP_FIM
RELATORIO_TIPO
REL_COD (FK)TIP_COD (FK)
RELATORIO_TITULACAO
REL_COD (FK)TIT_COD
SUBMISSAO
SUB_COD
SUB_INICIOSUB_FIMPES_CODSUB_PES_CADASTROU
TIPO_PRODUCAO
TIP_COD
TIP_COD_PAI (FK)TIP_NOMETIP_PES_CADASTROUTIP_INICIOTIP_FIMTIP_PES_DELETATIP_COD_ANTIGO
VALOR_ATRIBUTO
PRO_COD (FK)VAL_ORDEMVAL_ATRIBUTO
VAL_CONTEUDOPES_COD
Figura 36. Diagrama entidade-relacionamento do SAPI
Quanto ao processo de submissão de um currículo, o usuário gera um arquivo XML que irá
conter o número do seu CPF com identificador. Os dados deste arquivo serão comparados com as
informações presentes na base de dados de docentes do sistema de carga-horária. Caso seja um
docente que esteja submetendo, é verificado se o currículo realmente pertence a ele, se não for, será
solicitado que o docente verifique se ele não submeteu o arquivo errado, ou então que corrija seus
dados no currículo ou departamento de controle docente, pois há inconsistência das informações.
Caso o currículo seja submetido por um funcionário da PROPPEC, será identificada a qual docente
pertence através do número de CPF.
50
A similaridade é realizada a partir da referência e dos atributos que compõe a produção (ex:
título, local do evento, ano, etc.). No método semi-automático as referências que tiverem mais de
90% de similaridade e as referências que ainda não tiverem sido confirmadas pela PROPPEC são
substituídas pela existente na base, ao contrário, se a referência já tiver sido confirmada ela não é
substituída.
Caso o grau de semelhança da produção existente no arquivo XML esteja entre 60% e 90%
com alguma já existente no banco de dados, é necessário a validação por um usuário específico do
sistema para decidir se a produção é nova ou não. Para os casos onde a similaridade é menor do que
60%, o sistema considera a produção automaticamente como sendo nova.
O problema que o presente TCC visa apoiar se refere a análise comparativa de algoritmos
utilizados para pesquisas de strings por similaridade, utilizando o SAPI como estudo de caso. O
SAPI possui alguns problemas onde o procedimento que compara se uma produção é nova não
funciona eficientemente. Também foi relatado que as comparações demandam muito tempo, fatores
estes que incentivaram a motivação para o desenvolvimento deste projeto.
Atualmente o SAPI utiliza uma função PHP chamada similar_text para realizar as
comparações. Está função utiliza chamadas recursivas que podem melhorar o desempenho do
processo. Sua sintaxe é composta por três parâmetros, sendo os dois primeiros as duas strings que
se deseja comparar e o terceiro parâmetro serve para indicar se a resposta será retornada em
porcentagem ou não. Parte do código está descrito na Figura 37.
A utilização de comparação via linguagem de alto nível demanda um alto processamento do
servidor, e acarreta no carregamento de todas as produções para então realizar a comparação.
Utilizando uma função do próprio SGBD, acredita-se diminuir o tempo de comparação e o
processamento da máquina.
51
while (list($i) = each($xmlProducao)){ if (is_array($producoesN)){ $porcent = 0; $posicao = 0; $flag = true; # Se o próximo registro do vetor, for o desejado, então nem passa pelo laço $xmlProducao[$i][90] = htmlspecialchars($xmlProducao[$i][90], ENT_QUOTES); if (trim($xmlProducao[$i][90])==trim($producoesN[$cont][referencia])){ $porcent = 100; $posicao = $cont; $flag = false; $producoesN[$posicao][associado] = $i; $cont++; } else{ # Localiza no vetor por completo, abortando ao encontrar exato $cont=0; reset($producoesN); while ((list($j) = each($producoesN)) && $flag){ $cont++; if ($producoesN[$j][base]=='1' && !$producoesN[$j][associado]){ $porcent2 = 0; if (trim($xmlProducao[$i][90])==trim($producoesN[$j][referencia])){ $porcent = 100; $posicao = $j; $flag = false; $producoesN[$j][associado] = $i; } else{ similar_text ( trim($xmlProducao[$i][90]), trim($producoesN[$j][referencia]) , $porcent2); if ($porcent2 > $porcent){ $porcent = $porcent2; $posicao = $j; } } } } } $producoesN[$j][escolhido_cod] = $posicao; $producoesN[$j][escolhido_por] = $porcent; }
Figura 37. Código PHP do SAPI utilizado para efetuar a comparação
3 PROJETO
A idéia principal do projeto é implementar os algoritmos utilizando a linguagem de
programação PL/SQL para a codificação.
As lógicas dos algoritmos documentados anteriormente foram estudadas e, após isso, foram
escolhidos os cinco algoritmos que mais se aproximaram a necessidade atual, sendo estes listados
abaixo:
• KMP;
• Rabin Karp;
• Levenshtein;
• Hamming Distance;
• Jaro.
Para cada algoritmo analisado foi desenvolvida uma função, sendo que todos terão a sintaxe
apresentada na Figura 38.
FUNCAO( TEXTO,
STRING,
RESULTADO )
Figura 38. Sintaxe das funções de similaridade produzidas
Conforme a sintaxe, a FUNCAO é o nome do algoritmo codificado, TEXTO é o texto onde
se deseja localizar a string, STRING é a palavra que se deseja encontrar no texto e RESULTADO é
o resultado retornado pela função (pode ser a porcentagem da similaridade, quantidade de
diferenças entre as strings, posição em que foi encontrada a string, dependendo da disponibilidade
de cada algoritmo).
Foi obtida uma base de dados real do SAPI para os testes, onde foram selecionados registros
para serem aplicados aos algoritmos. Após isso, cada registro foi copiado e modificado para ser
53
executado nas funções. Cada dupla de registros (original e modificado) teve sua similaridade
calculada pelos algoritmos implementados e também por uma função do PHP chamada similar_text
para haver um ponto de referência ao avaliar os resultados gerados em cada teste.
Após o fim de cada teste, foi armazenado o tempo levado pela rotina, qual o algoritmo
utilizado, quais os parâmetros de referência foram passados para a função, quais as informações que
foram obtidas como resposta e qual o grau de eficiência exibidos ao usuário, trazendo apenas as
informações realmente similares ao que foi informado por parâmetro.
Após o fim dos testes, todos os dados obtidos foram comparados entre si para que seja
possível construir uma documentação com os pontos fortes e fracos de cada algoritmo. Na Figura
39 é apresentado um exemplo básico que será realizado com os algoritmos para avaliar o
funcionamento dos mesmos.
Figura 39. Comparação entre as strings “ABACATE” e “ABATE”.
3.1.1 Hamming Distance
A função Hamming Distance possui como parâmetro duas strings que se deseja comparar. É
retornada a quantidade de diferenças entre as palavras. O código fonte é exibido na Figura 40.
54
FUNCTION Hamming (value1 IN VARCHAR2, value2 IN VARCHAR2) RETURN NUMBER IS distance NUMBER; i NUMBER; len NUMBER; BEGIN distance := 0; i := 1; IF(LENGTH(VALUE1) > LENGTH(VALUE2))THEN LEN := LENGTH(VALUE1); ELSE LEN := LENGTH(VALUE2); END IF; IF (value1 is null) or (value2 is null) THEN return null; ELSE WHILE (i <= len) LOOP IF(SUBSTR(VALUE1,i,1) <> SUBSTR(VALUE2,i,1))THEN distance := distance + 1; ELSE distance := distance + 0; END IF; i := i + 1; END LOOP; END IF; return distance; END Hamming;
Figura 40. Implementação da função Hamming Distance.
Para exemplificar o funcionamento da função Hamming Distance, foi executada uma
comparação entre as palavras “ABACATE” e “ABATE”. Na Figura 41 pode-se verificar que a
diferença retornada é igual a 2.
Figura 41. Resultado da comparação entre as palavras ABACATE e ABATE utilizando a função
Hamming Distance.
A função Hamming Distance faz uma comparação conforme observado na Figura 42, onde
as duas strings são alinhadas e é somado ao resultado o valor 1 caso as letras sejam diferentes ou
somado o valor zero caso as letras sejam iguais. A função desconsidera os caracteres que sobram
devido a diferença de tamanho entre as palavras, sendo que neste exemplo utilizado, as duas últimas
letras “T” e “E” recebem zero por este motivo.
55
Figura 42. Tabela gerada na comparação entre as palavras “ABACATE” e “ABATE” utilizando a
função Hamming Distance.
3.1.2 Levenshtein
A função Levenshtein possui como parâmetro duas strings que se deseja comparar. É
retornada a quantidade de diferenças entre as palavras. O código fonte é exibido na Figura 43.
FOR j IN 0 .. QT_TAM_STRING LOOP COLUNA_ESQ(j) := j; END LOOP; FOR i IN 1.. QT_TAM_TEXTO LOOP COLUNA_ATUAL(0) := i; FOR j IN 1 .. QT_TAM_STRING LOOP IF SUBSTR (PDS_TEXTO, i, 1) = SUBSTR (PDS_STRING, j, 1) THEN CUSTO := 0; ELSE CUSTO := 1; END IF; COLUNA_ATUAL(j) := LEAST (COLUNA_ATUAL(j-1) + 1, COLUNA_ESQ(j) + 1, COLUNA_ESQ(j-1) + CUSTO); END LOOP; FOR j IN 0 .. QT_TAM_STRING LOOP COLUNA_ESQ(j) := COLUNA_ATUAL(j); END LOOP; END LOOP;
Figura 43. Trecho principal do código da função Levenshtein.
Para demonstrar o funcionamento deste algoritmo, que foi explicado na seção 2.2.5 deste
trabalho, foi executada uma comparação entre as palavras ABACATE e ABATE. Na Figura 44
pode-se verificar que a diferença retornada é igual a 2.
56
Figura 44. Resultado da comparação entre as palavras “ABACATE” e “ABATE” utilizando a
função Levenshtein.
O primeiro passo, apresentado na Figura 45, é verificar se a primeira letra de cada string é
igual ou não. Se for é atribuído valor 0 (zero) para o primeiro campo da tabela, caso contrário é
atribuído o valor 1. Este cálculo é chamado de custo. Os demais campos da mesma coluna recebem
o valor do campo superior acrescido de um.
Figura 45. Primeiro passo do exemplo do algoritmo de Levenshtein.
Na segunda iteração é feita uma comparação entre o valor campo da esquerda acrescido de
um, o campo de cima acrescido de um e o campo da diagonal superior à esquerda acrescido do
valor do custo. No caso da Figura 46, como existe apenas valor à esquerda (0 + 1) este será
selecionado.
57
Figura 46. Primeira comparação da segunda iteração do exemplo do algoritmo de Levenshtein.
Em seguida é feita a mesma ação com os demais campos da mesma coluna. O resultado
escolhido sempre será o menor valor entre os três possíveis, sendo que nesta comparação foi o valor
da diagonal.
A segunda comparação da segunda iteração do algoritmo é mostrada na Figura 47, onde é
feita a comparação entre as letras ‘B’ e ‘B’. Devido ao fato de as letras serem iguais o custo recebe
valor igual a 0. Conforme pode ser observado na tabela auxiliar da mesma figura, o valor sugerido a
partir do campo superior é igual a 1 (valor do campo) mais o valor 1 (seguindo a regra), resultando
o valor 2. Partindo do campo à esquerda, o valor sugerido é igual a 1 (valor do campo) mais o valor
1 (seguindo a regra), resultando o valor 2. E, a partir do campo da diagonal superior esquerda, o
valor sugerido é igual a zero (valor do campo) mais o valor do custo (igual a zero pois os caracteres
comparados são iguais), resultando o valor 0.
Após o cálculo das possibilidades o valor escolhido é o menor entre os três possíveis, sendo
que neste caso é igual a 0 (proveniente do campo da diagonal).
58
Figura 47. Segunda comparação da segunda iteração do exemplo do algoritmo de Levenshtein.
A terceira comparação da segunda iteração do algoritmo é mostrada na Figura 48, onde é
feita a comparação entre as letras ‘B’ e ‘T’. Devido ao fato de as letras serem diferentes o custo
recebe valor igual a 1. Conforme pode ser observado na tabela auxiliar da mesma figura, o valor
sugerido a partir do campo superior é igual a zero (valor do campo) mais o valor 1 (seguindo a
regra), resultando o valor 1. Partindo do campo à esquerda, o valor sugerido é igual a 2 (valor do
campo) mais o valor 1 (seguindo a regra), resultando o valor 3. E, a partir do campo da diagonal
superior esquerda, o valor sugerido é igual a 1 (valor do campo) mais o valor do custo (igual a 1
pois os caracteres comparados são diferentes), resultando o valor 2.
Após o cálculo das possibilidades o valor escolhido é o menor entre os três possíveis, sendo
que neste caso é igual a 1 (proveniente do campo superior).
Figura 48. Terceira comparação da segunda iteração do exemplo do algoritmo de Levenshtein.
A quarta comparação da segunda iteração do algoritmo é mostrada na Figura 49, onde é feita
a comparação entre as letras ‘B’ e ‘E’. Devido ao fato de as letras serem diferentes o custo recebe
valor igual a 1. Conforme pode ser observado na tabela auxiliar da mesma figura, o valor sugerido a
59
partir do campo superior é igual a 1 (valor do campo) mais o valor 1 (seguindo a regra), resultando
o valor 2. Partindo do campo à esquerda, o valor sugerido é igual a 3 (valor do campo) mais o valor
1 (seguindo a regra), resultando o valor 4. E, a partir do campo da diagonal superior esquerda, o
valor sugerido é igual a 2 (valor do campo) mais o valor do custo (igual a 1 pois os caracteres
comparados são diferentes), resultando o valor 3.
Após o cálculo das possibilidades o valor escolhido é o menor entre os três possíveis, sendo
que neste caso é igual a 2 (proveniente do campo superior).
Figura 49. Quarta comparação da segunda iteração do exemplo do algoritmo de Levenshtein.
A quinta comparação da segunda iteração do algoritmo é mostrada na Figura 49, onde é feita
a comparação entre as letras ‘B’ e ‘A’. Devido ao fato de as letras serem diferentes o custo recebe
valor igual a 1. Conforme pode ser observado na tabela auxiliar da mesma figura, o valor sugerido a
partir do campo superior é igual a 2 (valor do campo) mais o valor 1 (seguindo a regra), resultando
o valor 3. Partindo do campo à esquerda, o valor sugerido é igual a 4 (valor do campo) mais o valor
1 (seguindo a regra), resultando o valor 5. E, a partir do campo da diagonal superior esquerda, o
valor sugerido é igual a 3 (valor do campo) mais o valor do custo (igual a 1 pois os caracteres
comparados são diferentes), resultando o valor 4.
Após o cálculo das possibilidades o valor escolhido é o menor entre os três possíveis, sendo
que neste caso é igual a 3 (proveniente do campo superior).
60
Figura 50. Quinta comparação da segunda iteração do exemplo do algoritmo de Levenshtein.
Após o cálculo de todas as posições da tabela o valor resultante da função será o da última
linha e última coluna da tabela conforme apresentado na Figura 51.
Figura 51. Resultado final da tabela de comparações do exemplo do algoritmo de Levenshtein
3.1.3 KMP
A função Hamming Distance possui como parâmetro duas strings que se deseja comparar.
São exibidas em quais posições a string que se deseja localizar é igual na string original. Caso não
seja igual em nenhuma posição será exibido zero. O código-fonte é exibido na Figura 52.
61
BEGIN a := AUX_genprefix(p); for i IN 0 .. n LOOP while(q > 0 AND SUBSTR(p,q+1,1) <> SUBSTR(t,i+1,1)) loop q := a(q-1); end loop; if (SUBSTR(p,q+1,1) = SUBSTR(t,i+1,1)) then q := q + 1; sim := sim + 1; else show(sim); sim := 0; end if; if (q = m) then show ('String igual na posicao: ' || to_char(i - m + 1)); q := a(q-1); end if; end loop; END;
Figura 52. Implementação da função KMP.
O resultado da comparação entre as palavras “ABACATE” e “ABATE” utilizando o
algoritmo KMP é igual a zero conforme pode ser visto na Figura 53.
Figura 53. Resultado da comparação entre as strings “ABACATE” e “ABATE” utilizando o algoritmo KMP.
Conforme explicado na seção 2.2.2 , o primeiro passo deste algoritmo é alinhar as duas
strings à esquerda, para então iniciar a comparação de cada letra. Conforme exibido na Figura 59,
as três primeiras letras de cada palavra são iguais, porém há uma diferença ao chegar ao quarto
caractere.
Figura 54. Primeira comparação do exemplo do algoritmo KMP.
Ao ocorrer uma diferença o algoritmo deve fazer um novo alinhamento das palavras para
continuar a análise. A string que se deseja localizar é deslocada para a direita, mas como as quatro
62
primeiras letras já foram analisadas o algoritmo sabe que não adianta deslocar apenas uma posição à
direita pois iria fazer uma comparação desnecessária, já sabendo que os caracteres não são iguais.
Figura 55. Segunda comparação do exemplo do algoritmo KMP.
A Figura 55 mostra o alinhamento das strings no segundo passo da comparação, sendo que a
primeira letra de cada palavra é igual, mas a segunda não. Por não haver mais espaço para realizar
um outro deslocamento para a direita, o algoritmo termina a análise das duas palavras retornando
zero.
3.1.4 Jaro
A função Jaro possui como parâmetro duas strings que se deseja comparar. É calculado o
grau de similaridade entre as duas palavras em porcentagem. O código fonte é exibido na Figura 57.
O resultado da comparação entre as palavras “ABACATE” e “ABATE” utilizando o algoritmo Jaro
pode ser visto na Figura 56.
Figura 56. Resultado da comparação entre “ABACATE” e “ABATE” utilizando o algoritmo Jaro.
Conforme explicado na seção 2.2.8 o algoritmo executa o seguinte cálculo: ((LI / T1) +
(LI/T2) + ((LI-TR)/LI)) * 1/3, onde LI é o número de letras iguais ao comparar as duas palavras, T1
é o tamanho da primeira string, T2 é o tamanho da segunda string e TR é o número de
transposições. No exemplo, T1 é igual a sete, T2 é igual a cinco, LI é igual a cinco e TR é igual a
zero. Substituir estes valores na fórmula: ((5/7) + (5/5) + ((5-0)/5)) * 1/3 = 0,9047 = 90,47%.
63
FOR i IN 1 .. tam_str1 LOOP a1 := SUBSTR(str1, i, 1); IF m >= i THEN f := 1; l := i + m; ELSE f := i - m; l := i + m; END IF; IF l > tam_max THEN l := tam_max; END IF; FOR j IN f .. l LOOP a2 := SUBSTR(str2, j, 1); IF (a2 = a1) AND (f2(j) = FALSE) THEN comum := comum + 1; f1(i) := TRUE; f2(j) := TRUE; GOTO saida; END IF; END LOOP; <<saida>> NULL; END LOOP; l := 1; FOR i IN 1 .. tam_str1 LOOP IF f1(i) THEN FOR j IN l .. tam_str2 LOOP IF f2(j) THEN l := j + 1; a1 := SUBSTR(str1, i, 1); a2 := SUBSTR(str2, j, 1); IF a1 <> a2 THEN tr := tr + 0.5; END IF; GOTO j_loop; END IF; END LOOP; <<j_loop>> NULL; END IF; END LOOP;
Figura 57. Implementação da função KMP.
3.1.5 Rabin-Karp
A função Rabin-Karp possui como parâmetro duas strings que se deseja comparar. Caso a
string for encontrada a função retorna o número de caracteres iguais, caso contrário retorna zero. O
código-fonte é exibido na Figura 58.
64
M := LENGTH(STR1_IN); N := LENGTH(STR2_IN); LOOP EXIT WHEN I < M; p := trunc((d*p + tonum(substr(str1_in,i,1))) / q); h := trunc((d*h + tonum(substr(str2_in,i,1))) / q); FOR W IN 0..N-M LOOP IF (p = h) then id_found := true; FOR j IN 0..M-1 LOOP IF (substr(str1_in,j,1) <> substr(str2_in,i+j,1))THEN id_found := false; exit; ELSE qt_cnt := nvl(qt_cnt,0) + 1; END IF; END LOOP; IF (id_found) THEN return qt_cnt; END IF; END IF; IF (i<n-m) THEN h := (d*(q+h-trunc((tonum(substr(STR1_IN,i,1))) / q)) + trunc(tonum(substr(STR1_IN,i+m,1))) / q); END IF; RETURN qt_cnt; END LOOP; I := I + 1; END LOOP;
Figura 58. Implementação da função Rabin-Karp.
Para exemplificar este algoritmo que foi explicado na seção 2.2.4 , foram comparadas as
palavras “ABACATE” e “ABATE”. O resultado retornado é igual a zero conforme pode ser visto
na Figura 59.
Figura 59. Resultado da comparação entre as strings “ABACATE” e “ABATE” utilizando o algoritmo Rabin-Karp.
O primeiro passo é alinhar as duas palavras e calcular o valor numérico que cada letra se
refere. A Figura 60 mostra a primeira iteração, onde são comparadas as cinco primeiras letras da
string maior (“ABACA”) com a string que se deseja localizar (“ABATE”).
65
Figura 60. Primeira comparação do exemplo do algoritmo de Rabin-Karp.
A comparação é feita somando-se os valores numéricos que cada letra representa. A string
“ABACA” possui um valor igual a 3, enquanto que a string “ABATE” possui um valor numérico
igual a 24. Se os valores fossem iguais então a função iniciaria a comparação posição por posição,
mas neste caso a comparação segue em frente alinhando as strings em uma nova posição, conforme
exibido na Figura 61.
Figura 61. Segunda comparação do exemplo do algoritmo de Rabin-Karp.
A próxima comparação executada é entre a string (“BACAT”) com a string que se deseja
localizar (“ABATE”). São somados os valores numéricos que cada letra representa. A string
“BACAT” possui um valor igual a 22, enquanto que a string “ABATE” possui um valor numérico
igual a 24. Se os valores fossem iguais então a função iniciaria a comparação posição por posição,
mas neste caso a comparação segue em frente alinhando as strings em uma nova posição, conforme
exibido na Figura 62.
66
Figura 62. Terceira comparação do exemplo do algoritmo de Rabin-Karp.
Uma nova comparação é executada pelo motivo de a string ainda não ter sido encontrada. A
string menor (“ABATE”) é deslocada mais uma posição para a direita e uma nova iteração é
realizada. São somados os valores numéricos que cada letra representa. A string “ACATE” possui
um valor igual a 25, enquanto que a string “ABATE” possui um valor numérico igual a 24. Se os
valores fossem iguais então a função iniciaria uma comparação posição por posição, mas neste caso
a função finaliza sua execução pois não há mais posições para realizar um outro alinhamento das
duas strings.
3.1.6 Algoritmo Proposto
O primeiro passo do algoritmo proposto é inserir a produção original e a alterada em uma
tabela temporária, gravando cada palavra separadamente. O segundo passo consiste em remover
todas as acentuações, substituir as cedilhas das palavras pela letra ‘c’ e apagar as palavras que
possuam menos do que três caracteres. Em seguida, para cada palavra da produção alterada procura-
se uma palavra igual na tabela das palavras da produção original. Se a palavra for encontrada,
incrementa o valor um (1) em uma variável de controle de acertos. Caso ela não seja idêntica a
nenhuma das palavras da produção original, reinicia-se uma nova varredura na tabela de palavras da
produção original calculando qual o grau de similaridade de cada palavra, considerando a palavra
de deseja-se comparar.
Nesta etapa de cálculo da porcentagem para as palavras que não são idênticas foi utilizado
como base o algoritmo Levenshtein. Foi utilizado o mesmo cálculo, explicado anteriormente, que é
usado por esta função para verificar a quantidade de diferenças. O valor de diferenças resultante é
dividido pelo número de caracteres composto pela palavra que se deseja localizar, gerando o grau
de similaridade da palavra que será somado com a variável de controle de acertos.
67
Por exemplo, no caso de a string original possuir as palavra “ABACATE VERDE” e a
string alterada possuir “ABATE VERDE”, serão gravadas as palavras “ABACATE” e “VERDE”
separadamente na tabela auxiliar um, enquanto que na tabela auxiliar dois serão gravadas as
palavras “ABATE” e “VERDE” da string modificada.
Figura 63. Terceira comparação do exemplo do algoritmo de Rabin-Karp.
Na Figura 63 é mostrado as duas iterações possíveis no processo de comparação das
palavras. Inicia-se o processo comparativo comparando a palavra “ABACATE” com todas as
palavras gravadas na tabela auxiliar dois. Neste caso a string “ABACATE” não é totalmente
idêntica a nenhuma das armazenadas. Então o próximo passo é calcular o grau de similaridade todas
as palavras da tabela auxiliar dois, sendo a comparação um entre “ABACATE” e “ABATE” e a
comparação dois entre “ABACATE” e “VERDE”. O resultado da primeira comparação é igual a
71% (resultado da função Levenshtein dividido pela quantidade de letras da palavra) e o resultado
da segunda comparação é igual a 6%. A variável de controle de acertos recebe o valor 0,71, pois foi
o maior grau encontrado. O algoritmo segue para a segunda iteração, formando as novas
comparações entre “VERDE” e “ABATE”, e as palavras “VERDE” e “VERDE”. Neste caso a
palavra “VERDE” é 100% idêntica a uma das palavras da outra tabela auxiliar, somando um (1) ao
valor da variável de controle de acertos. O resultado final da função é igual a média das
similaridades, sendo igual a 85,5% ((1 + 0,71) / 2).
3.2 TESTES
Após a implantação das funções foi constatado, através de pequenos testes, que dos
algoritmos escolhidos apenas o Jaro é capaz de retornar o grau de similaridade em porcentagem, por
isso os demais foram descartados nos cenários de testes. Para haver como comparar os resultados,
68
foram incluídos nos cenários de testes os algoritmos similar_text (do php) e um novo algoritmo
proposto.
Para a realização dos testes foi obtida a base de dados do SAPI contendo as produções dos
docentes da UNIVALI. Foram, aleatoriamente, selecionados registros da base de dados obtida e
cada registro foi copiado e modificado para ser executado nas funções. Cada dupla de registros
(original e modificado) teve sua similaridade calculada pelo algoritmo Jaro, o algoritmo proposto e
também por uma função do PHP chamada similar_text para haver um ponto de referência ao avaliar
os resultados gerados em cada teste. Os demais algoritmos implementados não foram incluídos nos
testes por não retornarem o resultado em porcentagem de similaridade, e sim por posição em que a
string foi encontrada ou quantidade de caracteres diferentes.
Atualmente há 2161 professores cadastrados no SAPI e com a média de 84 produções por
currículo. A Figura 64 exibe a relação entre o número de docentes e a quantidade de produções de
cada um. O gráfico mostra que a maioria dos docentes (909 funcionários) possuem de zero a dez
produções cadastradas, 377 possuem entre dez e cinqüenta, 258 entre cinqüenta e cem produções,
469 docentes têm entre cem e trezentas produções, 109 têm entre trezentos e quinhentos registros e
apenas 44 docentes atingem a marca de quinhentas produções ou mais .
Figura 64. Gráfico do número de docentes por faixa de quantidade de produções.
69
Buscou-se apresentar dois cenários para os testes. O primeiro apresenta os resultados da
comparação das produções de um professor com aproximadamente 100 produções, isto é, a média
atual de produções por professor. O segundo cenário apresenta um caso de docentes com um valor
expressivo de produções, em torno de 1000 produções. Tais professores fazem parte de um grupo
pequeno, atualmente apenas 5 professores têm mais de 950 produções cadastradas. Entretanto,
devido ao elevado número de itens a comparar, há uma grande chance de demora no processamento
e qualidade nos resultados da comparação.
Os cenários de testes criados podem ser encontrados no apêndice A deste trabalho.
3.3 RESULTADOS OBTIDOS
Após a execução dos dez cenários de testes pode-se concluir que o novo algoritmo proposto
acabou tendo um melhor grau de similaridade em relação aos outros dois. Com base nos dados da
Tabela 7, verifica-se que o algoritmo similar_text obteve o melhor grau de similaridade três vezes,
cinco vezes o pior grau e na maioria dos cenários ficou com o segundo melhor resultado. O
algoritmo Jaro conseguiu melhor grau de similaridade em três cenários, porém foi o que teve pior
posição, ficando em doze vezes como o que teve o pior grau de similaridade. O algoritmo proposto
teve o melhor desempenho quanto ao grau de similaridade em treze vezes, mantendo seu resultado
próximo aos demais nos dois cenários em que não ganhou. Quanto ao tempo de execução, a
similar_text foi a melhor em todos os testes, enquanto que o algoritmo proposto foi o mais
demorado.
Tabela 7. Tabela de resultados geral dos testes quanto ao grau de similaridade
Algoritmo Melhor Grau Intermediário Pior Grau Similar_Text (PHP) 3 vezes 11 vezes 5 vezes Jaro 3 vezes 4 vezes 12 vezes Algoritmo Proposto 13 vezes 5 vez 1 vez
A Figura 65 é uma média do grau de similaridade, em porcentagem, obtido nos testes do
cenário um e dois, onde foram executadas as três funções escolhidas. O novo algoritmo proposto foi
o melhor entre os três, mantendo uma média de 88,20% de similaridade, enquanto que o Jaro e o
Similar Text tiveram média igual a 80,03 e 80,29 respectivamente.
70
Figura 65. Gráfico da média do grau de similaridade resultante dos dois cenários de testes.
O mesmo foi feito com as médias do tempo (em segundos) de execução das rotinas, que são
exibidas na Figura 66. A média resultante de todos os testes do algoritmo proposto foi de 52,52
segundos, sendo seguido pelo algoritmo Jaro que precisou de uma média de 24,39 segundos para
cada teste, enquanto que o algoritmo Similar Text rodou em média 0,48 segundos em cada teste.
71
Figura 66. Gráfico da média do tempo de execução em segundos resultante dos dois cenários de
testes.
3.4 ANÁLISE DA HIPÓTESE
Para a análise dos resultados obtidos com os algoritmos, foram propostas seis hipóteses.
Para cada hipótese foi feita a aplicação de testes estatísticos que indiquem a sua aceitação ou
rejeição. Foi selecionado o Teste Z, que é aplicado em situações onde, dadas duas amostras verificar
qual delas obteve melhor resultado.
O cálculo pode ser aplicado para comparação de duas médias. O seguinte roteiro foi
aplicado para cálculo do valor Z com relação a comparação de médias:
1. Foram definidas as hipóteses nula e alternativa. De modo geral a hipótese nula é de que a
variável analisada não é maior na segunda amostra (H0: µ1 ≥ µ2) e a hipótese alternativa
de que a segunda amostra é significativamente maior (Hα: µ1 < µ2 );
Para cada variável analisada, obteve-se a o η (tamanho da amostra), χ (média) e σ (desvio
padrão) da totalidade das produções da amostra;
Após foi calculado o erro padrão utilizando a equação 1 da Figura 67. Já o valor de Z
calculado foi obtido através da equação 2 da Figura 67. Comparou-se o valor de Z calculado com o
valor de Z crítico relacionado ao nível de confiança definido (95%). Por tratar-se de um teste
72
monocaudal esquerda 1, neste nível confiança, o valor crítico de Z é -1,96, e conseqüentemente, a
região de rejeição da hipótese nula exige valor de Z < -1,96 (LARSON & FARBER, 2004).
(1) Erro padrão: nnxx
2
2
2
1
2
1
21
σσσ +=
−
(2) Teste Z: σ xx
zxx
21
)(21
−
−=
Figura 67. Teste Z para comparação entre médias
3.4.1 Hipótese 1
A hipótese 1 verifica se o algoritmo Jaro é melhor que o similar_text quanto ao cálculo da
similaridade dos textos, isto é, dentre os dois algoritmos qual produziu o melhor resultado. A fim de
examinar esta afirmação, as hipóteses nula e a alternativa foram assim estabelecidas:
H0: µ1 ≥ µ2 (o algoritmo similar_text é melhor ou igual ao Jaro)
Hα: µ1 < µ2 (o algoritmo similar_text é pior que o Jaro)
Aplicando o Teste Z, com nível de significância de α = 0,05, cujo valor crítico é de -1,96,
tem-se o resultado z = 0,29. Conclui-se que não é possível rejeitar a hipótese nula, pois Z não está
na região de rejeição.
3.4.2 Hipótese 2
A hipótese 2 verifica se o algoritmo proposto é melhor que o similar_text quanto ao cálculo
da similaridade dos textos, isto é, dentre os dois algoritmos qual produziu o melhor resultado. A fim
de examinar esta afirmação, as hipóteses nula e a alternativa foram assim estabelecidas:
H0: µ1 ≥ µ2 (o algoritmo similar_text é melhor ou igual ao proposto)
Hα: µ1 < µ2 (o algoritmo similar_text é pior que o proposto)
1 Segundo Larson e Farber (2004): “Se a hipótese alternativa Há contiver o símbolo de menor do que (<), o teste de hipótese será um teste monocudal esquerda”.
73
Aplicando o Teste Z, com nível de significância de α = 0,05, cujo valor crítico é de -1,96,
tem-se o resultado z = -8,24. Conclui-se que é possível rejeitar a hipótese nula, pois Z está na região
de rejeição. Logo, o algoritmo proposto apresentou melhores resultados que o similar_text.
3.4.3 Hipótese 3
A hipótese 3 verifica se o algoritmo proposto é melhor que o Jaro quanto ao cálculo da
similaridade dos textos, isto é, dentre os dois algoritmos qual produziu o melhor resultado. A fim de
examinar esta afirmação, as hipóteses nula e a alternativa foram assim estabelecidas:
H0: µ1 ≥ µ2 (o algoritmo Jaro é melhor ou igual ao proposto)
Hα: µ1 < µ2 (o algoritmo Jaro é pior que o proposto)
Aplicando o Teste Z, com nível de significância de α = 0,05, cujo valor crítico é de -1,96,
tem-se o resultado z = -10,59. Conclui-se que é possível rejeitar a hipótese nula, pois Z está na
região de rejeição. Logo, o algoritmo proposto apresentou melhores resultados que o Jaro.
3.4.4 Hipótese 4
A hipótese 4 verifica se o algoritmo Jaro é melhor que o similar_text quanto ao tempo de
processamento da similaridade dos textos, isto é, dentre os dois algoritmos qual produziu o melhor
resultado. A fim de examinar esta afirmação, as hipóteses nula e a alternativa foram assim
estabelecidas:
H0: µ1 ≥ µ2 (o algoritmo similar_text é melhor ou igual ao Jaro)
Hα: µ1 < µ2 (o algoritmo similar_text é pior que o Jaro)
Aplicando o Teste Z, com nível de significância de α = 0,05, cujo valor crítico é de -1,96,
tem-se o resultado z = 13,35. Conclui-se que não é possível rejeitar a hipótese nula, pois Z não está
na região de rejeição.
3.4.5 Hipótese 5
A hipótese 5 verifica se o algoritmo proposto é melhor que o similar_text quanto ao tempo
de processamento da similaridade dos textos, isto é, dentre os dois algoritmos qual produziu o
74
melhor resultado. A fim de examinar esta afirmação, as hipóteses nula e a alternativa foram assim
estabelecidas:
H0: µ1 ≥ µ2 (o algoritmo similar_text é melhor ou igual ao proposto)
Hα: µ1 < µ2 (o algoritmo similar_text é pior que o proposto)
Aplicando o Teste Z, com nível de significância de α = 0,05, cujo valor crítico é de -1,96,
tem-se o resultado z = 22,68. Conclui-se que não é possível rejeitar a hipótese nula, pois Z não está
na região de rejeição.
3.4.6 Hipótese 6
A hipótese 6 verifica se o algoritmo proposto é melhor que o Jaro quanto ao tempo de
processamento da similaridade dos textos, isto é, dentre os dois algoritmos qual produziu o melhor
resultado. A fim de examinar esta afirmação, as hipóteses nula e a alternativa foram assim
estabelecidas:
H0: µ1 ≥ µ2 (o algoritmo Jaro é melhor ou igual ao proposto)
Hα: µ1 < µ2 (o algoritmo Jaro é pior que o proposto)
Aplicando o Teste Z, com nível de significância de α = 0,05, cujo valor crítico é de -1,96,
tem-se o resultado z = 11,18. Conclui-se que não é possível rejeitar a hipótese nula, pois Z não está
na região de rejeição.
3.4.7 Conclusões
Estatisticamente é possível provar que quanto a similaridade, o algoritmo proposto é melhor
que o Similar_Text e que o Jaro, mas o mesmo não pode ser dito quanto ao tempo de
processamento, resultado este que ficou favorável ao algoritmo utilizado pelo PHP.
75
4 CONCLUSÃO
Os sistemas gerenciadores de banco de dados atuais possuem diversas funções importantes,
que auxiliam na manutenção, segurança e armazenamento de informações. Porém, mesmo estando
no mercado desde a década de 60, o processo de consultas é muito restrito, permitindo apenas
consultas exatas.
Existem poucos aplicativos com esta função de efetuar consultas retornando objetos
semelhantes aos solicitados pelo usuário. Os principais são utilizados na área da medicina para
consultar imagens de exames, permitindo aos médicos buscar no banco de imagens casos de outros
pacientes que tiveram o mesmo problema de saúde, possibilitando que o especialista utilize o
mesmo tratamento usado anteriormente, ou tentar outra saída caso o mesmo não tenha funcionado
com sucesso.
O que motivou a execução deste trabalho foi a necessidade do SAPI em efetuar
comparações para verificar a similaridade entre a base de dados do Lattes e da UNIVALI. Após
definido o problema, iniciou-se uma pesquisa por temas relacionados a esta área e por algoritmos
existentes para realização de consultas por similaridade de textos. Cada algoritmo encontrado foi
documentado e explicado, através de figuras e de exemplos para um melhor entendimento.
Foram selecionados alguns dos algoritmos para serem implementados em formato de
funções, que foram avaliadas para saber quais delas poderiam se encaixar na necessidade do SAPI.
Após análise, foi escolhida a função Jaro para fazer parte dos testes. Além desta, um novo algoritmo
foi desenvolvido, implementado e documentado para mesma finalidade.
Para a realização dos testes foi requisitada uma base de dados real do SAPI, contendo as
produções cadastradas dos docentes da UNIVALI. Os cenários de testes foram compostos pelas
funções Jaro, o algoritmo proposto e mais a função Similar Text do PHP, atualmente utilizada pelo
SAPI.
Foram escolhidas algumas produções da base de dados, que foram alteradas para serem
utilizadas nos testes. Cada produção alterada foi aplicada nos três algoritmos, gerando como
resposta para cada um deles o grau de similaridade e tempo de execução. Estas informações foram
documentadas e, posteriormente, utilizadas na conclusão dos cenários de testes.
76
Os resultados comprovaram que o novo algoritmo proposto é o melhor ao se tratar da
similaridade das strings, se mantendo em aproximadamente 70% das vezes como sendo o que
obteve o melhor grau de similaridade. Porém, ao analisar o tempo necessário para efetuar todas as
comparações o Similar Text obteve um desempenho de tempo de execução muito melhor que os
demais em todos os testes. Como a maioria dos docentes que utilizam o SAPI possui poucas
produções cadastradas, o impacto de performance ao adaptar o novo algoritmo no sistema não seria
muito grande e poderia trazer benefícios consideráveis quanto ao problema de erros na busca por
produções iguais já cadastradas.
77
REFERÊNCIAS BIBLIOGRÁFICAS
BATTISTI, Júlio César Fabris. Noções da linguagem SQL para consultas. 2006. Disponível em: <http://www.linhadecodigo.com.br/Artigo.aspx?id=165>. Acesso em 05 abr. 2008.
BARIONI, Maria Camila N.; RAZENTE, Humberto L.; TRAINA, Agma J. M.; TRAINA JR, Caetano. Incluindo Consultas por Similaridade em SQL. 2005. Disponível em: <http://www.sbbd-sbes2005.ufu.br/arquivos/SimSQL.pdf>. Acesso em 09 mar. 2008.
BORGES, Eduardo N.; CONY, Carlos A.; FREITAS, André L. C. Utilização de Algoritmos de Busca por Similaridade em SGBD’s Comerciais. 2005. Disponível em: <http://www.inf.ufrgs.br/~enborges/files/Sirc_2005.pdf>. Acesso em 11 mar. 2008.
BÜHLER, Dieter. Animation of the Boyer/Moore Algorithm. 2004. Disponível em: <http://www-sr.informatik.uni-tuebingen.de/~buehler/BM/BM.html>.
CARVALHO, Paulo Sérgio R.; OLIVEIRA, Deive de.; GUARACY, Alessandra; GOMES, Alisson; CONCEIÇÃO, Fernando César da; FREIRE, Joseane; OLIVEIRA, Jones Albuquerque. Um Estudo Teórico e Experimental em Algoritmos Clássicos de Busca em Texto. 2005. Disponível em: <http://www.dcc.ufla.br/infocomp/artigos/v2.1/stringMat.pdf>. Acesso em 10 mar. 2008.
CHARRAS, Christian; LECROQ, Thierry. Levenshtein Distance. 1998. Disponível em: <http://www-igm.univ-mlv.fr/~lecroq/seqcomp/node2.html>. Acesso em 11 jun. 2008.
DATE, C. J. Introdução a Sistemas de Banco de Dados. 8. ed. São Paulo: Campus, 2007.
DORNELES, Carina F.; CERVI, Cristiano R.; LIMA, Andrei E. N. Indexação para busca por similaridade textual. 2006. Disponível em: <http://www.inf.ufrgs.br/~galante/wdl/anais/10-Carina%20Dorneles%20-%20Indexacao%20para%20busca.pdf>. Acesso em: 12 mar. 2008.
ELMASRI, Ramez; NAVATHE, Shamkant, B. Sistemas de Banco de Dados. 4. ed. São Paulo: Pearson, 2006.
GOMES JR., Manuel F. Algoritmos e Estruturas de Dados 2, Processamento de Texto. 2008. Disponível em: <http://www.dimap.ufrn.br/~manuel/arquivos/AEDII/AEDII-ProcTextosKnuthMorrisPratt.pdf>. Acesso em: 20 abr. 2008.
GONDIM, Flávio Melo. Algoritmo de Comparação de Strings para Integração de Esquemas de Dados. 2006. Disponível em: <http://www.cin.ufpe.br/~tg/2005-2/fmg.pdf>. Acesso em: 25 maio 2008.
LARSON, Ron; FARBER, Betsy. Estatística Aplicada. 2 ed. São Paulo: Prentice Hall, 2004. ISBN: 8587918591.
LEME, Ricardo. Diferença entre comandos SQL. 2008. Disponível em: <http://ricardoleme.blogspot.com/2008/06/qual-diferena-entre-comandos-dcl-dml-e.html>. Acesso em: 29 maio 2008.
78
MATTOSO, Marta. Introdução a banco de dados. 2005. Disponível em: <http://www.cos.ufrj.br/~marta/BdRel.pdf>. Acesso em: 01 jun. 2008.
MOURA, Eduardo S.; DANTAS FILHO, Emanuel; PORTO, Vinícius de Araújo. Casamento de Padrões em Strings. 2002. Disponível em: <http://dalton.dsc.ufcg.edu.br/edados/index.php/Casamento_de_Padr%C3%B5es_em_Strings>. Acesso em: 26 abr. 2008.
NOVELLI, Márcio. Abordagem geral do pl/sql. 2004. Disponível em: <http://imasters.uol.com.br/artigo/2164/abordagem_geral_do_o_plsql>. Acesso em: 01 jun. 2008.
REGO, Rodrigo Soares de Lima Sá. Projeto e Implementação de uma Plataforma MP-SoC usando SystemC. Disponível em: <http://www.ppgsc.ufrn.br/html/Producao/Dissertacoes/RodrigoSoaresDeLimaSaRego.pdf>. Acesso em: 01 jun. 2008.
ROSA, Natália Abdala; TRAINA, Agma J.; TRAINA JR., Caetano. Recuperação de Imagens Médicas por Similaridade em um Hospital Universitário. 2002. Disponível em: <http://gbdi.icmc.usp.br/publicacoes.php?pubfile=Rosa2002_WIM_ImagensPorSimilaridadeEmHU.PDF>. Acesso em: 01 jun. 2008.
SILVA, Maria Estela Vieira da; BORGES, Eduardo Nunes; GALANTE, Renata de Matos. XSimilarity: Uma Ferramenta para Consultas por Similaridade embutidas na Linguagem XQuery. 2008. Disponível em: <http://www.inf.ufsc.br/erbd2008/artigos/20.pdf>. Acesso em: 20 mai. 2008.
SOUZA, Osvaldo. Algoritmos genéticos e estrutura de dados para a pesquisa biomolecular. 2004. Disponível em: <http://www.dnocs.gov.br/php/util/downloads_file.php?&dir=&file=/home/util/livres/ebooks/monografias/algoritmos_geneticos_e_estruturas_de_dados_para_a_pesquisa_biomolecular.pdf>. Acesso em: 16 mar. 2008.
SPARKNOTE. SparkNotes Hash Tables. Disponível em: <http://www.sparknotes.com/cs/searching/hashtables/section4.rhtml>. Acesso em: 15 jun. 2008.
SPIDO, Nadia Roberta Traldi. String Matching. 2007. Disponível em: <http://scs.carleton.ca/~maheshwa/courses/5703COMP/StringMatching.pdf>. Acesso em: 10 maio 2008.
A CENÁRIOS DE TESTES
A.1 CENÁRIO 1: USUÁRIO COM POUCAS PRODUÇÕES
O cenário um é baseado em usuários que possuem aproximadamente cem produções
cadastradas. Este é o cenário típico dos professores que possuem currículos cadastrados no SAPI.
Foram realizados testes para diferentes tipos de produções: participação em bancas de comissões
julgadoras, projeto de pesquisa, artigos em eventos nacionais, orientação de TCC, artigo em evento
internacional, curso de curta duração, participação em banca de mestrado, resumo publicado em
anais de congressos e comissões de avaliação de cursos de graduação e pós-graduação.
A.1.1 Cenário 1a: Participação em Bancas
O teste a do cenário um é baseado em uma produção de participação em banca julgadora,
que foi selecionada da base de dados do SAPI e é apresentada na Figura 68, juntamente com uma
cópia alterada deste mesmo registro, gerado para ser comparado com o original através das funções
de cálculo de similaridade.
Produção original: RAABE, André Luís Alice; SILVA, Júlia Marques Carvalho da; DAZZI, Rudimar Luís Scaranto; MOREIRA, Benjamin Grando; VALLE FILHO, Adhemar Maria do. Participação em banca de Diogo Altoé Lopes. Raciocínio Probabilístico Aplicado a Sistemas Tutores Inteligentes. 2007. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção alterada: SILVA, Júlia Marques Carvalho; RAABE, André Luis Alice; DAZZI, Rudimar Luis Scaranto; MOREIRA, Benjamin Grando; VALLE FILHO, Adhemar Maria do. Participação em banca de Diogo Altoé Lopes. Raciocínio Probab. Aplicado a Sistemas Tutores de Inteligência Avançada. 2008. (Ciências da Computação) - UNIVALI.
Figura 68. Produção original e alterada do cenário 1a.
A produção alterada teve as seguintes modificações: troca na ordem dos autores, abreviação
da palavra “Probabilístico”, alteração da palavra “Inteligentes” por “de Inteligência Avançada”, o
ano da produção, alteração da palavra “Ciência” para o plural e abreviação do nome da instituição.
Após executar as duas produções (original e alterada) nas três funções escolhidas, a comparação
gerou o seguinte resultado apresentado na Tabela 8.
81
Tabela 8. Tabela de resultados do cenário 1a.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 81,99 0,027 Jaro 80,02 0,045 Algoritmo Proposto 89,18 0,178
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 81,99% e tempo de execução igual a 0,027 segundos, a função Jaro obteve grau
de similaridade igual a 80,02% e tempo igual a 0,045 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 89,18% e tempo de execução igual a 0,178 segundos.
A.1.2 Cenário 1b: Projeto de Pesquisa
O teste b do cenário um é baseado em uma produção de projeto de pesquisa, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 69, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
Produção Original: Júlia Marques Carvalho da Silva. O Desenvolvimento de um Assistente Inteligente para o Ensino-Aprendizagem de Algoritmos. 2005. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: Julia Carvalho da Silva. O Desenvolvimento de um Assistente interativo para o Ensino e Aprendizagem de Algoritmos. 2005. (Ciências da Computação) - UNIVALI.
Figura 69. Produção original e alterada do cenário 1b.
A produção alterada teve as seguintes modificações: alteração no nome do autor, alteração
da palavra “Inteligente” por “interativo”, alteração da palavra “Ciência” para o plural e abreviação
do nome da instituição. Após executar as duas produções (original e alterada) nas três funções
escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 9.
Tabela 9. Tabela de resultados do cenário 1b.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 55,11 0,032 Jaro 77,79 0,58 Algoritmo Proposto 87,5 1,15
82
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 55,11% e tempo de execução igual a 0,032 segundos, a função Jaro obteve grau
de similaridade igual a 77,79% e tempo igual a 0,58 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 87,5% e tempo de execução igual a 1,15 segundos.
A.1.3 Cenário 1c: Artigo em Evento Nacional
O teste c do cenário um é baseado em uma produção de artigo em evento nacional, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 70, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
Produção Original: SILVA, Júlia Marques Carvalho da. Proposta de um Sistema Multi-agentes para a aplicação de Objetos Inteligentes de Aprendizagem seguindo o padrão SCORM. In: Simpósio Brasileiro de Informática na Educação. São Paulo: 2007 Produção Alterada: SILVA, Julia Marques da. Proposta de um Sistema Multiagentes para a construção de Objetos Inteligentes de Aprendizagem baseando-se no padrão ESCOM. In: Simpósio de Informatica na Educ do Brasil. Sao Paulo: 2004.
Figura 70. Produção original e alterada do cenário 1c.
A produção alterada teve as seguintes modificações: alteração no nome do autor, alteração
da palavra “Multi-agentes” por “Multiagentes”, alteração da palavra “seguindo” por “baseando-se”
da sigla “SCORM” para “ESCOM”, do nome do simpósio para “de Informatica na Educ. do
Brasil”, acentuação da palavra “São Paulo” e ano da produção. Após executar as duas produções
(original e alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado
apresentado na Tabela 10.
Tabela 10. Tabela de resultados do cenário 1c.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 69,56 0,035 Jaro 82,13 0,031 Algoritmo Proposto 77,27 0,078
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 69,56% e tempo de execução igual a 0,035 segundos, a função Jaro obteve grau
83
de similaridade igual a 82,13% e tempo igual a 0,031 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 77,27% e tempo de execução igual a 0,078 segundos.
A.1.4 Cenário 1d: Orientação de TCC
O teste d do cenário um é baseado em uma produção de orientação de TCC, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 71, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
Produção Original: Júlia Marques Carvalho da Silva. Análise da Influência de Parâmetros Afetivos em um Sistema Computacional de Apoio a Aprendizagem de Algoritmos. 2005. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: Silva, Júlia Marques Carvalho da. Análise da importância de parâmetros afetivos em uma aplicação de Apoio a Aprendizagem de Algoritmos. 2008. (Ciências da Computação) - UNIVALI.
Figura 71. Produção original e alterada do cenário 1d.
A produção alterada teve as seguintes modificações: nome do autor, palavra “Influência”
para “importância”, alteração das iniciais das palavras “parâmetros afetivos”, da palavra “Sistema
Computacional” para “aplicação”, do ano da produção, da palavra “Ciência” para o plural e da
abreviação do nome da instituição. Após executar as duas produções (original e alterada) nas três
funções escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 11.
Tabela 11. Tabela de resultados do cenário 1d.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 76,36 0,06 Jaro 77,67 0,15 Algoritmo Proposto 73,68 0,03
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 76,36% e tempo de execução igual a 0,06 segundos, a função Jaro obteve grau
de similaridade igual a 77,67% e tempo igual a 0,15 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 73,68% e tempo de execução igual a 0,03 segundos.
84
A.1.5 Cenário 1e: Projeto de Pesquisa
O teste e do cenário um é baseado em uma produção de projeto de pesquisa, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 72, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
Produção Original: Júlia Marques Carvalho da Silva. Construção de Ferramentas Interativas para Apoio à Aprendizagem Via Internet. 2004. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: Silva, Júlia Marques Carvalho da. Construção de Ferramentas para Apoio à Aprendizagem pela Internet. 2007. (Ciência da Computação) - UNIVALI.
Figura 72. Produção original e alterada do cenário 1e.
A produção alterada teve as seguintes modificações: nome do autor, da palavra “Via” por
“pela”, do ano da produção e abreviação do nome da instituição. Após executar as duas produções
(original e alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado
apresentado na Tabela 12.
Tabela 12. Tabela de resultados do cenário 1e.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 80,01 0,05 Jaro 78,72 0,015 Algoritmo Proposto 88,23 0,109
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 80,01% e tempo de execução igual a 0,05 segundos, a função Jaro obteve grau
de similaridade igual a 78,72% e tempo igual a 0,015 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 88,23% e tempo de execução igual a 0,109 segundos.
A.1.6 Cenário 1f: Projeto de Pesquisa
O teste f do cenário um é baseado em uma produção de projeto de pesquisa, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 73, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
85
Produção Original: Júlia Marques Carvalho da Silva. Nelle Virtual - Ambiente de Apoio a Certificação de Idiomas através da Internet. 2002. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: Silva, Júlia Marques Carvalho da. Nelle Virtual - Ambiente para Apoio de certificação de língua extrangeira através da Internet. 2004. (Ciência da Computação) - UNIVALI.
Figura 73. Produção original e alterada do cenário 1f.
A produção alterada teve as seguintes modificações: nome do autor, alteração do trecho “de
Apoio a Certificação de Idiomas” para “para Apoio de certificação de língua extrangeira”, do ano
da produção e abreviação do nome da instituição. Após executar as duas produções (original e
alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado apresentado na
Tabela 13.
Tabela 13. Tabela de resultados do cenário 1f.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 77,45 0,09 Jaro 80,70 0,016 Algoritmo Proposto 81,05 0,16
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 77,45% e tempo de execução igual a 0,09 segundos, a função Jaro obteve grau
de similaridade igual a 80,70% e tempo igual a 0,016 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 81,05% e tempo de execução igual a 0,16 segundos.
A.1.7 Cenário 1g: Participação em Banca
O teste g do cenário um é baseado em uma produção de participação em banca julgadora,
que foi selecionada da base de dados do SAPI e é apresentada na Figura 74, juntamente com uma
cópia alterada deste mesmo registro, gerado para ser comparado com o original através das funções
de cálculo de similaridade.
86
Produção Original: DAZZI, R. L. S.; RAABE, André Luís Alice; BENITTI, Fabiane Barreto Vavassori; DETERS, Janice Inês. Participação em banca de Júlia Marques Carvalho da Silva. Análise da Influência de Parâmetros Afetivos em um Sistema Comutacional de Apoio a Aprendizagem de Algoritmos. 2005. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: DETERS, Janice Inês; RAABE, André Luís Alice; DAZZI, R. L. S.; BENITTI, Fabiane Barreto Vavassori; Participação em banca de Silva, Júlia Marques Carvalho da. Análise da importância de Parâmetros Afetivos em um Sistema Comutacional de Aprendizagem de Algoritmos. 2007. (Ciências da Computação) - Universidade do Vale do Itajaí.
Figura 74. Produção original e alterada do cenário 1g.
A produção alterada teve as seguintes modificações: ordem e nomes dos autores, alteração
do ano da produção e da palavra “Ciência” para o plural. Após executar as duas produções (original
e alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado apresentado na
Tabela 14.
Tabela 14. Tabela de resultados do cenário 1g.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 84,62 0,84 Jaro 84,56 0,06 Algoritmo Proposto 90,62 0,04
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 84,62% e tempo de execução igual a 0,84 segundos, a função Jaro obteve grau
de similaridade igual a 84,56% e tempo igual a 0,06 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 90,62% e tempo de execução igual a 0,04 segundos.
A.1.8 Cenário 1h: Participação em Banca
O teste h do cenário um é baseado em uma produção de participação em banca julgadora,
que foi selecionada da base de dados do SAPI e é apresentada na Figura 75, juntamente com uma
cópia alterada deste mesmo registro, gerado para ser comparado com o original através das funções
de cálculo de similaridade.
87
Produção Original: RAABE, André Luís Alice; ALVES, Adriana Gomes; DAZZI, Rudimar Luis Scaranto; VAHLDICK, A.; SILVA, Júlia Marques Carvalho da. Participação em banca de Pedro Henrique Bandeira dos Santos. Um repositório de objetos de aprendizagem para os cursos de ciência da computação e desenvolvimento web com software livre. 2007. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: SILVA, Júlia Marques C. da; RAABE, André Luís Alice; ALVES, Adriana Gomes; DAZZI, Rudimar Luis Scaranto; VAHLDICK, A. Participação em banca de Pedro Henrique Bandeira dos Santos. Um repositório para aprendizagem para os cursos de ciência da computação e tecweb com software livre. 2008. (Ciência da Computação) - UNIVALI.
Figura 75. Produção original e alterada do cenário 1h.
A produção alterada teve as seguintes modificações: ordem e nomes dos autores, alteração
das palavras “de objetos de”, das palavras “desenvolvimento web” para “tecweb”, do ano da
produção e abreviação do nome da instituição. Após executar as duas produções (original e
alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado apresentado na
Tabela 15.
Tabela 15. Tabela de resultados do cenário 1h.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 81,26 0,19 Jaro 78,37 0,31 Algoritmo Proposto 94,87 0,109
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 81,26% e tempo de execução igual a 0,19 segundos, a função Jaro obteve grau
de similaridade igual a 78,37% e tempo igual a 0,31 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 94,87% e tempo de execução igual a 0,109 segundos.
A.1.9 Cenário 1i: Participação em banca
O teste i do cenário um é baseado em uma produção de participação em banca julgadora,
que foi selecionada da base de dados do SAPI e é apresentada na Figura 76, juntamente com uma
cópia alterada deste mesmo registro, gerado para ser comparado com o original através das funções
de cálculo de similaridade.
88
Produção Original: MOREIRA, Benjamin Grando; SILVA, Júlia Marques Carvalho da; DAZZI, Rudimar Luís Scaranto. Participação em banca de Marlon Kleinschmidt. Mineração de Dados para Avaliação do Perfil de Usuários do Sistema de Informação da Academia da UNIVALI. 2007. (Ciência da Computação) - Universidade do Vale do Itajaí. Produção Alterada: SILVA, Júlia Marques C. da; MOREIRA, Benjamin Grando; DAZZI, Rudimar Luís Scaranto. Participação em banca de Marlon Kleinschmidt. Mineração de Dados para Avaliação de Perfil de Usuários do curso de Sistemas de Informação da UNIVALI. 2006. (Ciência da Computação) - Universidade do Vale do Itajaí.
Figura 76. Produção original e alterada do cenário 1i.
A produção alterada teve as seguintes modificações: ordem e nomes dos autores, alteração
das palavras “Sistema de Informação da Academia” para “curso de Sistemas de Informação” e do
ano da produção. Após executar as duas produções (original e alterada) nas três funções escolhidas,
a comparação gerou o seguinte resultado apresentado na Tabela 16.
Tabela 16. Tabela de resultados do cenário 1i.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 85,33 0,016 Jaro 81,98 0,04 Algoritmo Proposto 90,62 0,106
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 85,33% e tempo de execução igual a 0,016 segundos, a função Jaro obteve grau
de similaridade igual a 81,98% e tempo igual a 0,04 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 90,62% e tempo de execução igual a 0,106 segundos.
A.2 CENÁRIO 2 – USUÁRIO COM MAIS DE 1000 PRODUÇÕES
O cenário dois é baseado em usuários que possuem mais que mil produções cadastradas.
Foram realizados testes para diferentes tipos de produções: participação em bancas de comissões
julgadoras, projeto de pesquisa, artigos em eventos nacionais, orientação de TCC, artigo em evento
internacional, curso de curta duração, participação em banca de mestrado, resumo publicado em
anais de congressos e comissões de avaliação de cursos de graduação e pós-graduação.
A.2.1 Cenário 2a: Participação em Banca
O teste a do cenário dois é baseado em uma produção de participação em banca julgadora,
que foi selecionada da base de dados do SAPI e é apresentada na Figura 77, juntamente com uma
89
cópia alterada deste mesmo registro, gerado para ser comparado com o original através das funções
de cálculo de similaridade.
Produção original: RAABE, André Luís Alice. Comissão Científica do Workshop de Informática na Escola - WIE (CSBC 2008). 2008. Sociedade Brasileira de Computação - Porto Alegre. Produção alterada: RAABE, A. L. A. Comissão Científica do Workshop de Informática na Escola. 2008. Sociedade Brasileira de Computação - Porto Alegre.
Figura 77. Produção original e alterada do cenário 2a.
A produção alterada teve as seguintes modificações: alteração no nome do autor e retirada
siglas “WIE (CSBC 2008)”. Após executar as duas produções (original e alterada) nas três funções
escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 17.
Tabela 17. Tabela de resultados do cenário 2a.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 89,19 0,56 Jaro 79,02 8,02 Algoritmo Proposto 83,33 78,21
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 89,19% e tempo de execução igual a 0,56 segundos, a função Jaro obteve grau
de similaridade igual a 79,02% e tempo igual a 8,02 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 83,33% e tempo de execução igual a 78,21 segundos.
A.2.2 Cenário 2b: Artigo em Evento Internacional
O teste b do cenário dois é baseado em uma produção de artigo em evento internacional, que
foi selecionada da base de dados do SAPI e é apresentada na Figura 78, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
90
Produção original: FERNANDES, Anita Maria da Rocha. Congresso internacional sobre lógica aplicada. In: LAPTEC 2002 - Advanced in logic, artificial intelligence and robotics. São Paulo: Universidade SENAC - São Paulo, 2002. Produção alterada: FERNANDES, A. M. R. Congresso Internacional de Lógica Aplicada. In: Advanced in Logic, Artificial Intelligence and Robotics. São Paulo: Universidade SENAC - São Paulo, SP, 2002.
Figura 78. Produção original e alterada do cenário 2b.
A produção alterada teve as seguintes modificações: alteração no nome do altor, alteração da
palavra “sobre lógica aplicada” por “de Lógica Aplicada”, retirada sigla “LAPTEC”, alteração das
palavras “artificial intelligence and robotics” para inicias em maiúsculo e retirada sigla “SP”. Após
executar as duas produções (original e alterada) nas três funções escolhidas, a comparação gerou o
seguinte resultado apresentado na Tabela 18.
Tabela 18. Tabela de resultados do cenário 2b.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 85,78 0,04 Jaro 78,73 14,01 Algoritmo Proposto 95,14 40,26
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 85,78% e tempo de execução igual a 0,04 segundos, a função Jaro obteve grau
de similaridade igual a 78,73% e tempo igual a 14,01 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 95,14% e tempo de execução igual a 40,26 segundos.
A.2.3 Cenário 2c: Artigo em Evento Nacional
O teste c do cenário dois é baseado em uma produção artigo em evento nacional, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 79 , juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
91
Produção original: OLDONI, Alisson; FERNANDES, Anita Maria da Rocha; MOREIRA, Benjamin Grando; DETERS, Janice Ines. Desenvolvimento de um agente pedagógico inteligente para um sistema tutor n área da saúde. In: X Congresso Brasileiro de Informática em Saúde, 2006, Florianópolis, SC. Anais do X Congresso Brasileiro de Informática em Saúde. 2006. v.1, 8560391002. Produção alterada: MOREIRA, B. G.; FERNANDES, A. M. R.; OLDONI, A.; DETERS, Janice Ines. Desenvolvimento de um agente pedagógico inteligente para um sistema tutor na área da saúde. In: X Congresso Brasileiro de Informática em Saúde, 2006, Florianópolis, SC. Anais do X Congresso Brasileiro de Informática em Saúde. 2006.
Figura 79. Produção original e alterada do cenário 2c.
A produção alterada teve as seguintes modificações: troca na ordem e alteração dos nomes
dos autores e retirada das palavras “v.1, 8560391002”. Após executar as duas produções (original e
alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado apresentado na
Tabela 19.
Tabela 19. Tabela de resultados do cenário 2c.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 86,72 0,38 Jaro 79,69 27,35 Algoritmo Proposto 94,16 49,20
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 86,72% e tempo de execução igual a 0,38 segundos, a função Jaro obteve grau
de similaridade igual a 76,69% e tempo igual a 27,35 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 94,16% e tempo de execução igual a 49,20 segundos.
A.2.4 Cenário 2d: Curso de Curta Duração
O teste d do cenário dois é baseado em uma produção de curso de curta duração, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 80, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
92
Produção original: Processamento de Imagens de Satélite. 2002-2002. 4h. Instituição: Comgresso Brasileiro de Computação. CONCLUIDO. Produção alterada: Processamento de Imagens de Satélite. 2002-2002. 4h. Instituição: CBComp. CONCLUIDO.
Figura 80. Produção original e alterada do cenário 2d.
A produção alterada teve as seguintes modificações: alteração das palavras “Congresso
Brasileiro de Computação” para “CBComp”. Após executar as duas produções (original e alterada)
nas três funções escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 20.
Tabela 20. Tabela de resultados do cenário 2d.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 85,71 0,37 Jaro 89,81 28,21 Algoritmo Proposto 85,71 39,47
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 85,71% e tempo de execução igual a 0,37 segundos, a função Jaro obteve grau
de similaridade igual a 89,81% e tempo igual a 28,21 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 85,71% e tempo de execução igual a 39,47 segundos.
A.2.5 Cenário 2e: Participação em Banca
O teste e do cenário dois é baseado em uma produção de participação em banca de mestrado,
que foi selecionada da base de dados do SAPI e é apresentada na Figura 81, juntamente com uma
cópia alterada deste mesmo registro, gerado para ser comparado com o original através das funções
de cálculo de similaridade.
93
Produção original: AZEVEDO, Fernando Mendes de; ARGOUD, Fernanda Isabel Marques; MARINO NETO, José; FERNANDES, Ana Paula Soares; FERNANDES, Anita Maria da Rocha; Hahne, M.N.M.A.. Participação em banca de George Araújo Mendonça. Estudo comparativo de técnicas de redes neurais e análise de variáveis canônicas para detecção automática de complexos K e fusos de sono em EEG. 2007. (Engenharia Elétrica) - Universidade Federal de Santa Catarina. Produção alterada: AZEVEDO, Fernando Mendes de; ARGOUD, Fernanda Isabel Marques; MARINO NETO, José; FERNANDES, Ana Paula Soares; FERNANDES, Anita Maria da Rocha; Hahne, Maria Nazareth M. Angeloni. Participação em banca de George Araújo Mendonça. Estudo comparativo de técnicas de redes neurais e análise de variáveis canônicas para detecção automática de complexos K e fusos de sono em EEG. 2007. (Engenharia Elétrica) - Universidade Federal de Santa Catarina.
Figura 81. Produção original e alterada do cenário 2e.
A produção alterada teve as seguintes modificações: alteração dos nomes dos autores. Após
executar as duas produções (original e alterada) nas três funções escolhidas, a comparação gerou o
seguinte resultado apresentado na Tabela 21.
Tabela 21. Tabela de resultados do cenário 2e.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 97,22 0,61 Jaro 88,14 44,02 Algoritmo Proposto 95,91 75,36
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 97,22% e tempo de execução igual a 0,61 segundos, a função Jaro obteve grau
de similaridade igual a 88,14% e tempo igual a 44,02 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 95,91% e tempo de execução igual a 75,36 segundos.
A.2.6 Cenário 2f: Artigo em Evento Internacional
O teste f do cenário dois é baseado em uma produção de participação artigo em evento
internacional, que foi selecionada da base de dados do SAPI e é apresentada na Figura 82,
juntamente com uma cópia alterada deste mesmo registro, gerado para ser comparado com o
original através das funções de cálculo de similaridade.
94
Produção original: RAABE, André Luís Alice. Indicadores para Produção de Material Didático usando Vídeos através da Web, 1999. Evento: V Congresso Internacional de Engenharia Informática, Buenos Aires. Inst. promotora/financiadora: Universidade de Buenos Aires. Produção alterada: RAABE, A. L. A. Indicadores para Produção de Material Didático usando Vídeos através da Web, 1999. Evento: V CIEI, Buenos Aires, Argentina. Inst. promotora/financiadora: Universidade de Buenos Aires.
Figura 82. Produção original e alterada do cenário 2f.
A produção alterada teve as seguintes modificações: alteração dos nomes dos autores e do
nome do congresso para a sigla “CIEI”. Após executar as duas produções (original e alterada) nas
três funções escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 22.
Tabela 22. Tabela de resultados do cenário 2f.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 84,35 0,12 Jaro 78,02 17,85 Algoritmo Proposto 90,47 46,21
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 84,35% e tempo de execução igual a 0,12 segundos, a função Jaro obteve grau
de similaridade igual a 78,02% e tempo igual a 17,85 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 90,47% e tempo de execução igual a 46,21 segundos.
A.2.7 Cenário 2g: Resumo em Evento Nacionais
O teste g do cenário dois é baseado em uma produção de resumo publicado em anais de
congresso, que foi selecionada da base de dados do SAPI e é apresentada na Figura 83, juntamente
com uma cópia alterada deste mesmo registro, gerado para ser comparado com o original através
das funções de cálculo de similaridade.
95
Produção original: RAABE, Renate O.; RAABE, André Luís Alice. APREP - Auxílio a Tomada de Decisão no Processo de Recuperação de Praias. In: Anais p.39, Seminário Integrado de Iniciação Científica, Balneário Camboriú. Anais. 2000. v.1, p.39-39. Produção alterada: RAABE, A. L. A..; RAABE, R. O. Auxílio a Tomada de Decisão no Processo de Recuperação de Praias. In: Seminario Integrado de Iniciacao Cientifica, Baln. Camboriú, 2000.
Figura 83. Produção original e alterada do cenário 2g.
A produção alterada teve as seguintes modificações: alteração dos nomes dos autores,
retirada da sigla “APREP” e das palavras “Anais p.39” e abreviação da palavra “Balneário”. Após
executar as duas produções (original e alterada) nas três funções escolhidas, a comparação gerou o
seguinte resultado apresentado na Tabela 23.
Tabela 23. Tabela de resultados do cenário 2g.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 77,23 0,11 Jaro 76,36 11,24 Algoritmo Proposto 93,75 44,98
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 77,23% e tempo de execução igual a 0,11 segundos, a função Jaro obteve grau
de similaridade igual a 76,36% e tempo igual a 11,24 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 93,75% e tempo de execução igual a 44,98 segundos.
A.2.8 Cenário 2h: Artigo em Evento Internacional
O teste h do cenário dois é baseado em uma produção de artigo em evento internacional, que
foi selecionada da base de dados do SAPI e é apresentada na Figura 84, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
96
Produção original: BENITTI, Fabiane Barreto Vavassori; SEÁRA, Everton Flávio Rufino; RAABE, André Luis Alice; SCHLINDWEIN, Luciane Maria. From conception to implantation of an educacional software to an elementary school. In: Avances en informática educativa, 2004, Cárceres. Avances en informática educativa. 2004. 84-7723-65. Produção alterada: SEÁRA, E. F. R.; RAABE, A. L. A. ; BENITTI, F. B. V.; SCHLINDWEIN, L. M. From the conception to the implementation of educating software to elementary school. In: Avances en informática educativa (AIE), 2004, Cárceres.
Figura 84. Produção original e alterada do cenário 2h.
A produção alterada teve as seguintes modificações: alteração dos nomes dos autores,
retirada das palavras “84-7723-65” e “an” e inclusão da sigla “AIE”. Após executar as duas
produções (original e alterada) nas três funções escolhidas, a comparação gerou o seguinte resultado
apresentado na Tabela 24.
Tabela 24. Tabela de resultados do cenário 2h.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 60,60 0,24 Jaro 71,91 29,20 Algoritmo Proposto 75,25 52,62
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 60,60% e tempo de execução igual a 0,24 segundos, a função Jaro obteve grau
de similaridade igual a 71,91% e tempo igual a 29,20 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 75,25% e tempo de execução igual a 52,62 segundos.
A.2.9 Cenário 2i: Comissão de Avaliação de Cursos
O teste i do cenário dois é baseado em uma produção de comissão de avaliação de cursos de
graduação e pós-graduação, que foi selecionada da base de dados do SAPI e é apresentada na
Figura 85, juntamente com uma cópia alterada deste mesmo registro, gerado para ser comparado
com o original através das funções de cálculo de similaridade.
97
Produção original: DAZZI, R. L. S.; RAABE, André Luís Alice; MARTINS, Luiz Carlos; Heloisa Helena Leal Gonçalves; BENITTI, Fabiane Barreto Vavassori. Comissão de professores para a alteração da matriz curricular do curso de Ciencia da computação, 2008. Produção alterada: DAZZI, Rudimar Luís Scaranto; RAABE, André Luís Alice; MARTINS, Luís Carlos; Heloísa Helena Leal Gonçalves; BENITTI, Fabiane Barreto Vavassori. Comissão de professores para a alteração da matriz curricular do curso de Ciencia da Computação, 2008.
Figura 85. Produção original e alterada do cenário 2i.
A produção alterada teve as seguintes modificações: alteração dos nomes (acentuação e
troca por caixa alta). Após executar as duas produções (original e alterada) nas três funções
escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 25.
Tabela 25. Tabela de resultados do cenário 2i.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 94,36 0,91 Jaro 82,11 21,25 Algoritmo Proposto 93,10 53,21
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 94,36% e tempo de execução igual a 0,29 segundos, a função Jaro obteve grau
de similaridade igual a 82,11% e tempo igual a 21,25 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 93,10% e tempo de execução igual a 53,21 segundos.
A.2.10 Cenário 2j: Artigo em Evento Nacional
O teste j do cenário dois é baseado em uma produção de artigo em evento nacional, que foi
selecionada da base de dados do SAPI e é apresentada na Figura 86, juntamente com uma cópia
alterada deste mesmo registro, gerado para ser comparado com o original através das funções de
cálculo de similaridade.
98
Produção original: SEÁRA, Everton Flávio Rufino; BENITTI, Fabiane Barreto Vavassori; RAABE, André Luis Alice; SCHLINDWEIN, Luciane Maria. Da concepção à validação de um cenário virtual 3D para o Ensino Fundamental. In: Congresso da Sociedade Brasileira de Computação (SBC) - Workshop de Informática na Escola (WIE), 2004, Salvador. Anais do SBC 2004/XXIV Congresso da Sociedade Brasileira de Computação. 2004. 8588442949. Produção alterada: SEÁRA, Everton Flávio Rufino; BENITTI, Fabiane Barreto Vavassori; RAABE, André Luis Alice. Da concepção à validação de um cenário virtual 3D para o Ensino Fundamental. In: Congresso da SBC - WIE, 2004, Salvador.
Figura 86. Produção original e alterada do cenário 2j.
A produção alterada teve as seguintes modificações: alteração dos nomes dos autores,
alteração do nome do congresso para a sigla “SBC”, retirada das palavras “Workshop de
Informática” e do trecho “Anais do SBC 2004/XXIV Congresso da Sociedade Brasileira de
Computação. 2004. 8588442949”. Após executar as duas produções (original e alterada) nas três
funções escolhidas, a comparação gerou o seguinte resultado apresentado na Tabela 26. Este foi o
único teste os cenários apresentados em que a função não retornou a produção original como
resposta, mas sim o seguinte registro: “SEÁRA, Everton Flávio Rufino; BENITTI, Fabiane Barreto
Vavassori; RAABE, André Luis Alice. A construção de um museu virtual 3D para o Ensino
Fundamental. Infocomp Journal Of Computer Science. Lavras: v.4, n.1, 2005. ISSN: 18074545.”.
Tabela 26. Tabela de resultados do cenário 2j.
Algoritmo Similaridade (%) Tempo (s) Similar_Text (PHP) 72,68 0,25 Jaro 74,81 17,15 Algoritmo Proposto 96,00 52,14
Conforme os resultados obtidos, nota-se que para este cenário a função similar_text obteve
similaridade igual a 72,68% e tempo de execução igual a 0,25 segundos, a função Jaro obteve grau
de similaridade igual a 74,81% e tempo igual a 17,15 segundos, enquanto que o algoritmo proposto
obteve similaridade igual a 96% e tempo de execução igual a 52,14 segundos.
I DICIONÁRIO DE DADOS
I.1 ESTRUTURA DAS TABELAS DO SAPI
TABELAS AREA Nome Tipo de Dados PK FK Descrição
ARE_COD NUMBER Sim Código da Área ARE_NOME VARCHAR2(200) Nome da Área ARE_PES_CADASTROU
NUMBER Pessoa que cadastrou a Área
ARE_PES_DELETA NUMBER Pessoa que deletou a Área ARE_INICIO DATE Data de transição inicial da Área ARE_FIM DATE Data de transição final da Área ARE_COD_CNPQ VARCHAR2(30) Código da Área no CNPq AREA_PRODUCAO Nome Tipo de Dados PK FK Descrição
ARE_COD NUMBER Sim Sim Código da Área PRO_COD NUMBER Sim Sim Código da Produção ARP_INICIO DATE Sim Data de transição inicial da relação ARP_PES_CADASTROU
NUMBER Pessoa que cadastrou a relação
ARP_PES_DELETA NUMBER Pessoa que deletou a relação ARP_FIM DATE Data de transição final da relação ARQUIVO Nome Tipo de Dados PK FK Descrição
PES_COD NUMBER Sim A quem pertence esse arquivo SUB_COD NUMBER Sim Código da submissão ARQ_XML CLOB Código XML CENARIO Nome Tipo de Dados PK FK Descrição
CEN_COD NUMBER Sim Código do Cenário CEN_NOME VARCHAR2(50) Nome do Cenário CEN_PES_CADASTROU
NUMBER Pessoa que cadastrou o Cenário
CEN_INICIO DATE Data de transição inicial do Cenário CEN_PES_DELETA NUMBER Pessoa que deletou o Cenário CEN_FIM DATE Data de transição final do Cenário CENARIO_PRODUCAO Nome Tipo de Dados PK FK Descrição
TIP_COD NUMBER Sim Sim Código do Tipo de Produção CEN_COD NUMBER Sim Sim Código do Cenário CEP_PESO FLOAT Peso do Tipo da Produção no Cenário CEP_INICIO DATE Data de transição inicial do peso CEP_FIM DATE Data de transição final do peso CEP_PES_CADASTROU
NUMBER Pessoa que cadastrou o peso
CEP_PES_DELETA NUMBER Pessoa que deletou o peso DOCENTE_PRODUCAO Nome Tipo de Dados PK FK Descrição
PES_COD NUMBER Sim Código de Pessoa
101
DOCENTE_PRODUCAO Nome Tipo de Dados PK FK Descrição
PRO_COD NUMBER Sim Sim Código da Produção DOP_INICIO DATE Sim Data de transição inicial da relação PRO_REFERENCIA VARCHAR2(3000) Referência da Produção DOP_FIM DATE Data de transição final da relação DOP_PES_CADASTROU
NUMBER Pessoa que cadastrou a relação
DOP_PES_DELETA NUMBER Pessoa que deletou a relação GRUPO Nome Tipo de Dados PK FK Descrição
GRU_COD NUMBER Sim Código do grupo GRU_NOME VARCHAR2(200) Nome do Grupo PES_COD NUMBER Código do responsável pelo Grupo UNICOD NUMBER Código do centro em que o Grupo atua GRU_PES_CADASTROU
NUMBER Pessoa que cadastrou o Grupo
GRU_PES_DELETA NUMBER Pessoa que deletou o Grupo GRU_INICIO DATE Data de transição inicial do Grupo GRU_FIM DATE Data da transição final do Grupo GRU_PARTICIPANTES
NUMBER Número de participantes do Grupo
PRODUCAO Nome Tipo de Dados PK FK Descrição
PRO_COD NUMBER Sim Código da Produção PRO_PES_DELETA NUMBER Pessoa que deletou a Produção PRO_PES_CADASTROU
NUMBER Pessoa que cadastrou a Produção
TIP_COD NUMBER Sim Código do Tipo de Produção PRO_INICIO DATE Data de transição inicial da Produção PRO_FIM DATE Data de transição final da Produção SUB_COD NUMBER Sim Código da Submissão do Currículo em que a
Produção se encontra PRO_VALIDA CHAR(1) Status de validação da Produção:
0 - verificada 1 - Verificada, validada 2 - Em validação ( utilizado até o momento) 3 - Validada
PRO_VALIDA_DOCENTE
NUMBER Docente que solicitou a validação da Produção
PRO_VALIDA_PROPPEC
NUMBER Funcionário da PROPPEC que registrou a validação
PRO_VALIDA_DATA DATE Data da realização da validação TIP_COD_PAI NUMBER Código do Tipo de Produção pai (campo auxiliar
no processo de migração dos sistemas) PRO_VALIDA_ANTIGO
NUMBER Código da Produção referente a tabela de Produções do SAPI antigo.
PRODUCAO_CURSO Nome Tipo de Dados PK FK Descrição
PRO_COD NUMBER Sim Sim Código da Produção CURCOD NUMBER Sim Código do Curso PRC_INICIO DATE Sim Data de transição inicial da relação PRC_PES_CADASTROU
NUMBER Pessoa que cadastrou a relação
PRC_PES_DELETA NUMBER Pessoa que deletou a relação PRC_FIM DATE Data de transição final da relação PRODUCAO_GRUPO Nome Tipo de Dados PK FK Descrição
PRO_COD NUMBER Sim Sim Código da Produção GRU_COD NUMBER Sim Sim Código do grupo
102
PRODUCAO_GRUPO Nome Tipo de Dados PK FK Descrição
PRG_INICIO DATE Sim Data de transição da relação PRG_PES_CADASTROU
NUMBER Pessoa que cadastrou a relação
PRG_FIM DATE Data de transição final da relação PRG_PES_DELETA NUMBER Pessoa que deletou a relação RELATORIO Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Código do Relatório REL_NOME VARCHAR2(50) Nome do Relatório CEN_COD NUMBER Sim Código do Cenário REL_PES_CADASTROU
NUMBER Pessoa que cadastrou o Relatório
REL_INICIO DATE Data de transição inicial do Relatório REL_FIM DATE Data de transição final do Relatório REL_PES_DELETA NUMBER Pessoa que deletou o Relatório REL_ANO_INICIO NUMBER Ano inicial do Relatório REL_ANO_FIM NUMBER Ano final do Relatório REL_UNIVALI CHAR(1) Flag indicando se deve exibir apenas produções
válidas para a instituição ou não: 0 - Todas as produções 1 - Somente as produções válidas para a Univali
RELATORIO_AGRUPA Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório AGR_ORDEM NUMBER Sim Ordem do agrupamento AGR_DESCRICAO VARCHAR2(15) Item a ser agrupado RELATORIO_AREA Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório ARE_COD NUMBER Sim Sim Código da Área RELATORIO_CAMPUS Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório CAMCOD NUMBER Sim Código do Campus RELATORIO_CENTRO Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório CENCOD NUMBER Sim Código do Centro RELATORIO_CURSO Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório CURCOD NUMBER Sim Código do Curso RELATORIO_DOCENTE Nome Tipo de Dados PK FK Descrição
PES_COD NUMBER Sim Docentes que selecionados no Relatório REL_COD NUMBER Sim Sim Código do Relatório RELATORIO_GRUPO Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório GRU_COD NUMBER Sim Sim Código do grupo
103
RELATORIO_PERFIL Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório PES_COD NUMBER Sim Pessoa que poderá visualizar o Relatório REP_INICIO DATE Sim Data de transição inicial da relação REP_PES_CADASTROU
NUMBER Pessoa que cadastrou a relação
REP_PES_DELETA NUMBER Pessoa que deletou a relação REP_FIM DATE Data de transição final da relação RELATORIO_TIPO Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório TIP_COD NUMBER Sim Sim Código do Tipo de Produção RELATORIO_TITULACAO Nome Tipo de Dados PK FK Descrição
REL_COD NUMBER Sim Sim Código do Relatório TIT_COD NUMBER Sim Titulações selecionadas no Relatório SUBMISSAO Nome Tipo de Dados PK FK Descrição
SUB_COD NUMBER Sim Código da submissão SUB_INICIO DATE Data de transição inicial da submissão SUB_FIM DATE Data de transição final da submissão PES_COD NUMBER Código da pessoa na qual a submissão se refere SUB_PES_CADASTROU
NUMBER Pessoa que submeteu o currículo
TIPO_PRODUCAO Nome Tipo de Dados PK FK Descrição
TIP_COD NUMBER Sim Código do Tipo de Produção TIP_COD_PAI NUMBER Sim Código do Tipo de Produção do Pai TIP_NOME VARCHAR2(100) Nome do Tipo de Produção TIP_PES_CADASTROU
NUMBER Pessoa que cadastrou o Tipo de Produção
TIP_INICIO DATE Data de transição inicial do Tipo de Produção TIP_FIM DATE Data de transição final do Tipo de Produção TIP_PES_DELETA NUMBER Pessoa que deletou o Tipo de Produção TIP_COD_ANTIGO NUMBER Código do Tipo de Produção no antigo SAPI
(campo apenas utilizado para conferência durante o processo de migração dos sistemas)
VALOR_ATRIBUTO Nome Tipo de Dados PK FK Descrição
PRO_COD NUMBER Sim Sim Código da Produção VAL_ORDEM NUMBER Sim Ordem de precedência quando vários registros de
um mesmo atributo existem no XML. Ex: ordem dos autores de uma publicação.
VAL_ATRIBUTO VARCHAR2(100) Sim Nome do atributo XML VAL_CONTEUDO VARCHAR2(1000) Conteúdo do atributo XML PES_COD NUMBER Código da pessoa, caso o atributo se refere a uma
pessoa
104
II CÓDIGO FONTE
CREATE OR REPLACE package SIMILARITY is TYPE TABELA IS TABLE OF NUMBER INDEX BY BINARY_INTEGER; FUNCTION Levenshtein (PDS_TEXTO IN VARCHAR2, PDS_STRING IN VARCHAR2) RETURN NUMBER DETERMINISTIC; FUNCTION Hamming (value1 IN VARCHAR2, value2 IN VARCHAR2) RETURN NUMBER; PROCEDURE KMP (t VARCHAR2, p VARCHAR2); FUNCTION jaro(str1_in IN VARCHAR2, str2_in IN VARCHAR2) RETURN NUMBER; FUNCTION AUX_genprefix(p VARCHAR2) RETURN TABELA; FUNCTION andreatta (PDS_TEXTO1 IN OUT varchar2, PDS_TEXTO2 IN OUT varchar2) RETURN NUMBER; FUNCTION andreatta_2 (PDS_TEXTO1 IN varchar2, PDS_TEXTO2 IN varchar2) RETURN NUMBER; FUNCTION andreatta_aux (PDS_TEXTO IN VARCHAR2, PDS_STRING IN VARCHAR2) RETURN NUMBER DETERMINISTIC ; PROCEDURE CARREGA_BASE; PROCEDURE call_jaro(str2_in IN VARCHAR2,pcd_docente NUMBER) ; PROCEDURE call_andreatta(str2_in IN VARCHAR2,pcd_docente NUMBER) ; end SIMILARITY; / create or replace package body SIMILARITY is --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x PROCEDURE ERRO IS BEGIN raise_application_error(-20001,'ERRO: '||SQLERRM); END; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x PROCEDURE SHOW(PDS_TEXTO VARCHAR2) IS BEGIN DBMS_OUTPUT.PUT_LINE(PDS_TEXTO); END; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x FUNCTION Hamming (value1 IN VARCHAR2, value2 IN VARCHAR2) RETURN NUMBER IS distance NUMBER; i NUMBER; len NUMBER; BEGIN distance := 0; i := 1; IF(LENGTH(VALUE1) > LENGTH(VALUE2))THEN LEN := LENGTH(VALUE1); ELSE LEN := LENGTH(VALUE2); END IF; IF (value1 is null) or (value2 is null) THEN return null; ELSE
105
WHILE (i <= len) LOOP DBMS_OUTPUT.PUT_LINE(SUBSTR(VALUE1,i,1) || ' / '|| SUBSTR(VALUE2,i,1)); IF(SUBSTR(VALUE1,i,1) <> SUBSTR(VALUE2,i,1))THEN distance := distance + 1; ELSE distance := distance + 0; END IF; i := i + 1; END LOOP; END IF; return distance; END Hamming; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x FUNCTION Levenshtein (PDS_TEXTO IN VARCHAR2, PDS_STRING IN VARCHAR2) RETURN NUMBER DETERMINISTIC IS WW_QT_TAM_TEXTO NUMBER := NVL (LENGTH (PDS_TEXTO), 0); WW_QT_TAM_STRING NUMBER := NVL (LENGTH (PDS_STRING), 0); WW_COLUNA_ESQ TABELA; WW_COLUNA_ATUAL TABELA; WW_CUSTO NUMBER := 0; BEGIN IF WW_QT_TAM_TEXTO = 0 THEN RETURN WW_QT_TAM_STRING; ELSIF WW_QT_TAM_STRING = 0 THEN RETURN WW_QT_TAM_TEXTO; ELSE FOR j IN 0 .. WW_QT_TAM_STRING LOOP WW_COLUNA_ESQ(j) := j; --SHOW(WW_COLUNA_ESQ(j)); END LOOP; FOR i IN 1.. WW_QT_TAM_TEXTO LOOP WW_COLUNA_ATUAL(0) := i; SHOW('--------------'); SHOW ('*** '||WW_COLUNA_ATUAL(0)); SHOW('--------------'); FOR j IN 1 .. WW_QT_TAM_STRING LOOP IF SUBSTR (PDS_TEXTO, i, 1) = SUBSTR (PDS_STRING, j, 1) THEN WW_CUSTO := 0; ELSE WW_CUSTO := 1; END IF; WW_COLUNA_ATUAL(j) := LEAST (WW_COLUNA_ATUAL(j-1) + 1, WW_COLUNA_ESQ(j) + 1, WW_COLUNA_ESQ(j-1) + WW_CUSTO); SHOW(' CIMA: '||WW_COLUNA_ATUAL(J-1)); SHOW(' LADO: '||WW_COLUNA_ESQ(J)); SHOW(' DIAG: ' ||WW_COLUNA_ESQ(J-1) || ' --- CUSTO: ' ||WW_CUSTO); SHOW(WW_COLUNA_ATUAL(j)); END LOOP; FOR j IN 0 .. WW_QT_TAM_STRING LOOP WW_COLUNA_ESQ(j) := WW_COLUNA_ATUAL(j); END LOOP; END LOOP; END IF; RETURN WW_COLUNA_ATUAL(WW_QT_TAM_STRING); END Levenshtein; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x
106
PROCEDURE KMP (t VARCHAR2, p VARCHAR2) IS a TABELA; q NUMBER := 0; n NUMBER := length(T); m NUMBER := length(P); sim NUMBER := 0; BEGIN a := AUX_genprefix(p); for i IN 0 .. n LOOP while(q > 0 AND SUBSTR(p,q+1,1) <> SUBSTR(t,i+1,1)) loop q := a(q-1); end loop; if (SUBSTR(p,q+1,1) = SUBSTR(t,i+1,1)) then q := q + 1; sim := sim + 1; else show(sim); sim := 0; end if; if (q = m) then show ('String igual na posicao: ' || to_char(i - m + 1)); q := a(q-1); end if; end loop; END KMP; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x FUNCTION jaro(str1_in IN VARCHAR2, str2_in IN VARCHAR2) RETURN NUMBER IS str1 VARCHAR2(4000); str2 VARCHAR2(4000); len_str1 PLS_INTEGER; len_str2 PLS_INTEGER; swap_len PLS_INTEGER; max_len PLS_INTEGER; m PLS_INTEGER; i PLS_INTEGER; j PLS_INTEGER; f PLS_INTEGER; l PLS_INTEGER; tr NUMBER := 0; a1 VARCHAR2(4000); a2 VARCHAR2(4000); swap_str VARCHAR2(4000); TYPE bool_list_t IS TABLE OF BOOLEAN INDEX BY PLS_INTEGER; f1 bool_list_t; f2 bool_list_t; wcd NUMBER; wrd NUMBER; wtr NUMBER; common NUMBER := 0; jaro_value NUMBER := 0; -- Local function -- clean_string normalizes the data as of COMPANY -> CO or CORPORATION -> CORP. Example: FUNCTION clean_string(p_str1 IN VARCHAR2) RETURN VARCHAR2 IS ret_value VARCHAR2(4000) := p_str1; BEGIN ret_value := REPLACE(ret_value, '.', ''); ret_value := REPLACE(ret_value, ',', ''); ret_value := REPLACE(ret_value, '-', ''); ret_value := REPLACE(ret_value, ';', ''); ret_value := REPLACE(ret_value, ':', ''); ret_value := REPLACE(ret_value, 'Á', 'A');
107
ret_value := REPLACE(ret_value, 'É', 'E'); ret_value := REPLACE(ret_value, 'Í', 'I'); ret_value := REPLACE(ret_value, 'Ó', 'O'); ret_value := REPLACE(ret_value, 'Ú', 'U'); ret_value := REPLACE(ret_value, ' COMPANY ', ' CO '); ret_value := REPLACE(ret_value, ' CORPORATION ', ' CO '); RETURN ret_value; END clean_string; BEGIN str1 := clean_string(str1_in); str2 := clean_string(str2_in); len_str1 := LENGTH(str1); len_str2 := LENGTH(str2); IF len_str1 > len_str2 THEN swap_len := len_str2; len_str2 := len_str1; len_str1 := swap_len; swap_str := str1; str1 := str2; str2 := swap_str; END IF; max_len := len_str2; FOR i IN 1 .. len_str1 LOOP f1(i) := FALSE; END LOOP; FOR j IN 1 .. len_str2 LOOP f2(j) := FALSE; END LOOP; m := ROUND((max_len / 2) - 1); FOR i IN 1 .. len_str1 LOOP a1 := SUBSTR(str1, i, 1); IF m >= i THEN f := 1; l := i + m; ELSE f := i - m; l := i + m; END IF; IF l > max_len THEN l := max_len; END IF; FOR j IN f .. l LOOP a2 := SUBSTR(str2, j, 1); IF (a2 = a1) AND (f2(j) = FALSE) THEN common := common + 1; f1(i) := TRUE; f2(j) := TRUE; GOTO linea_exit; END IF; END LOOP; -- j <<linea_exit>> NULL; -- Add NULL statement to avoid error END LOOP; -- i
108
l := 1; FOR i IN 1 .. len_str1 LOOP IF f1(i) THEN FOR j IN l .. len_str2 LOOP IF f2(j) THEN l := j + 1; a1 := SUBSTR(str1, i, 1); a2 := SUBSTR(str2, j, 1); IF a1 <> a2 THEN tr := tr + 0.5; END IF; GOTO j_loop; END IF; END LOOP; -- j <<j_loop>> NULL; -- Add NULL statement to avoid error END IF; END LOOP; -- i wcd := 1 / 3; wrd := 1 / 3; wtr := 1 / 3; IF common <> 0 THEN jaro_value := wcd * common / len_str1 + wrd * common / len_str2 + wtr * (common - tr) / common; END IF; RETURN NVL(jaro_value,0); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('EXCEPTION IN jaro - ' || SQLCODE || ': ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('Error stack at top level:'); DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_backtrace); RETURN jaro_value; END jaro; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x FUNCTION AUX_genprefix(p VARCHAR2) RETURN TABELA IS a TABELA; m NUMBER ; k NUMBER := 0; BEGIN m := length(p); a(0) := 0; for q in 1 .. m-1 loop while (k > 0 AND SUBSTR(P,k+1,1) <> SUBSTR(p,q+1,1)) loop k := a(k-1); end loop; if (SUBSTR(p,k+1,1) = SUBSTR(p,q+1,1)) then k := k + 1; end if; a(q) := k; --show(a(q)); end loop; return a;
109
END AUX_genprefix; --x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x.x FUNCTION TONUM(PDS_LETRA VARCHAR2)RETURN NUMBER IS PNR_AUX NUMBER; BEGIN PNR_AUX := ASCII(PDS_LETRA); RETURN PNR_AUX; END; FUNCTION RABINKARP(str1_in IN VARCHAR2, str2_in IN VARCHAR2, d NUMBER, q NUMBER) RETURN NUMBER IS M NUMBER; N NUMBER; P NUMBER := 0; H NUMBER := 0; I NUMBER := 0; id_found BOOLEAN := FALSE; qt_cnt NUMBER; BEGIN M := LENGTH(STR1_IN); N := LENGTH(STR2_IN); LOOP EXIT WHEN I < M; p := trunc((d*p + tonum(substr(str1_in,i,1))) / q); h := trunc((d*h + tonum(substr(str2_in,i,1))) / q); FOR W IN 0..N-M LOOP IF (p = h) then id_found := true; FOR j IN 0..M-1 LOOP IF (substr(str1_in,j,1) <> substr(str2_in,i+j,1))THEN id_found := false; exit; ELSE qt_cnt := nvl(qt_cnt,0) + 1; END IF; END LOOP; IF (id_found) THEN return qt_cnt; END IF; END IF; IF (i<n-m) THEN h := (d*(q+h-trunc((tonum(substr(STR1_IN,i,1))) / q)) + trunc(tonum(substr(STR1_IN,i+m,1))) / q); END IF; RETURN qt_cnt; END LOOP; I := I + 1; END LOOP; END; FUNCTION REP(PDS_TEXTO VARCHAR2) RETURN VARCHAR2 IS TAUX VARCHAR2(4000); WW_RET VARCHAR2(4000); BEGIN PDS_AUX := lower(PDS_TEXTO); PDS_AUX := REPLACE(PDS_AUX,',',''); PDS_AUX := REPLACE(PDS_AUX,';',''); PDS_AUX := REPLACE(PDS_AUX,'.',''); PDS_AUX := REPLACE(PDS_AUX,')',' '); PDS_AUX := REPLACE(PDS_AUX,'(',' '); PDS_AUX := REPLACE(PDS_AUX,'á','a'); PDS_AUX := REPLACE(PDS_AUX,'é','e'); PDS_AUX := REPLACE(PDS_AUX,'í','i'); PDS_AUX := REPLACE(PDS_AUX,'ó','o'); PDS_AUX := REPLACE(PDS_AUX,'ú','u'); PDS_AUX := REPLACE(PDS_AUX,'â','a'); PDS_AUX := REPLACE(PDS_AUX,'ê','e'); PDS_AUX := REPLACE(PDS_AUX,'ô','o'); PDS_AUX := REPLACE(PDS_AUX,'ã','a'); PDS_AUX := REPLACE(PDS_AUX,'õ','o');
110
PDS_AUX := REPLACE(PDS_AUX,'ç','c'); PDS_AUX := REPLACE(PDS_AUX,'univali','universidade do vale do itajai');*/ RETURN PDS_AUX; END; FUNCTION andreatta (PDS_TEXTO1 IN OUT varchar2, PDS_TEXTO2 IN OUT varchar2) RETURN NUMBER IS WW_DS_AUX VARCHAR2(500); WW_DS_AUX2 VARCHAR2(500); WW_DS_AUX3 VARCHAR2(500); WW_ID_POS NUMBER(3); WW_QT_PALAVRAS NUMBER(3) := 0; WW_QT_CERTAS NUMBER(3) := 0; WW_PR_SIM NUMBER(10,4); CURSOR C1 IS SELECT * FROM AUXILIAR; CURSOR C2 IS SELECT COUNT(1) FROM AUXILIAR; BEGIN PDS_TEXTO1 := PDS_TEXTO1 || ' @@@@@ '; PDS_TEXTO2 := PDS_TEXTO2 || ' @@@@@ '; delete from auxiliar; WW_DS_AUX := lower(PDS_TEXTO2); WW_DS_AUX := REP(WW_DS_AUX); WW_DS_AUX3 := lower(PDS_TEXTO1); WW_DS_AUX3 := REP(WW_DS_AUX3); LOOP WW_DS_AUX2 := SUBSTR(WW_DS_AUX,1,INSTR(WW_DS_AUX,' ')); EXIT WHEN trim(WW_DS_AUX2) = '@@@@@'; WW_DS_AUX := SUBSTR(WW_DS_AUX,INSTR(WW_DS_AUX,' ')+1,LENGTH(WW_DS_AUX)); insert into auxiliar values (trim(ww_ds_aux2),0); END LOOP; DELETE FROM AUXILIAR WHERE LENGTH(DS_AUX) <= 2 or ds_aux is null; FOR R1 IN C1 LOOP WW_ID_POS := INSTR(WW_DS_AUX3,R1.DS_AUX||' '); IF(WW_ID_POS <= 0)THEN WW_ID_POS := INSTR(WW_DS_AUX3,' '||R1.DS_AUX); END IF; IF(WW_ID_POS > 0)THEN WW_QT_CERTAS := WW_QT_CERTAS + 1; ELSE SHOW('================'||R1.DS_AUX); END IF; END LOOP; OPEN C2; FETCH C2 INTO WW_QT_PALAVRAS; CLOSE C2; SHOW('PALAVRAS: '||WW_QT_PALAVRAS); SHOW('CERTAS: '||WW_QT_CERTAS); WW_PR_SIM := (100 * WW_QT_CERTAS) / WW_QT_PALAVRAS; SHOW('SIMIRALIDADE: '||WW_PR_SIM); commit; RETURN WW_PR_SIM; END;
111
FUNCTION andreatta_2 (PDS_TEXTO1 IN varchar2, PDS_TEXTO2 IN varchar2) RETURN NUMBER IS WW_DS_AUX VARCHAR2(4000); WW_DS_AUX2 VARCHAR2(4000); WW_DS_AUX3 VARCHAR2(4000); WW_QT_PALAVRAS NUMBER(10) := 0; WW_QT_CERTAS NUMBER(10) := 0; WW_PR_SIM NUMBER(15,7); WW_ID_ACHOU NUMBER(1); CURSOR C1 IS SELECT * FROM AUXILIAR; CURSOR C3(PDS_STRING VARCHAR2) IS SELECT DISTINCT 1 FROM AUXILIAR_2 WHERE DS_AUX = PDS_STRING; CURSOR C2 IS SELECT COUNT(1) FROM AUXILIAR; V_T1 VARCHAR2(4000); V_T2 VARCHAR2(4000); BEGIN V_T1 := PDS_TEXTO1 || ' @@@@@ '; V_T2 := PDS_TEXTO2 || ' @@@@@ '; execute immediate('truncate table auxiliar'); execute immediate('truncate table auxiliar_2'); commit; WW_DS_AUX := REP(V_T2); WW_DS_AUX3 := REP(V_T1); LOOP WW_DS_AUX2 := SUBSTR(WW_DS_AUX,1,INSTR(WW_DS_AUX,' ')); EXIT WHEN trim(WW_DS_AUX2) = '@@@@@'; WW_DS_AUX := SUBSTR(WW_DS_AUX,INSTR(WW_DS_AUX,' ')+1,LENGTH(WW_DS_AUX)); begin insert into auxiliar values (trim(ww_ds_aux2),0); exception when others then raise_application_error('-20158','Erro insert 1: '||sqlerrm); end; commit; END LOOP; LOOP WW_DS_AUX2 := SUBSTR(WW_DS_AUX3,1,INSTR(WW_DS_AUX3,' ')); EXIT WHEN trim(WW_DS_AUX2) = '@@@@@'; WW_DS_AUX3 := SUBSTR(WW_DS_AUX3,INSTR(WW_DS_AUX3,' ')+1,LENGTH(WW_DS_AUX3)); begin insert into auxiliar_2 values (trim(ww_ds_aux2),0); exception when others then raise_application_error('-20145','Erro insert 2: '||sqlerrm); end; commit; END LOOP; BEGIN DELETE FROM AUXILIAR WHERE LENGTH(DS_AUX) <= 2 or ds_aux is null; DELETE FROM AUXILIAR_2 WHERE LENGTH(DS_AUX) <= 2 or ds_aux is null; exception when others then
112
raise_application_error('-20854','Erro DEL 1: '||sqlerrm); end; commit; FOR R1 IN C1 LOOP WW_ID_ACHOU := 0; OPEN C3(R1.DS_AUX); FETCH C3 INTO WW_ID_ACHOU; CLOSE C3; IF(NVL(WW_ID_ACHOU,0) = 1)THEN WW_QT_CERTAS := WW_QT_CERTAS + 1; END IF; END LOOP; OPEN C2; FETCH C2 INTO WW_QT_PALAVRAS; CLOSE C2; WW_PR_SIM := (100 * WW_QT_CERTAS) / WW_QT_PALAVRAS; commit; RETURN WW_PR_SIM; END; FUNCTION andreatta_aux (PDS_TEXTO IN VARCHAR2, PDS_STRING IN VARCHAR2) RETURN NUMBER DETERMINISTIC IS WW_QT_TAM_TEXTO NUMBER := NVL (LENGTH (PDS_TEXTO), 0); WW_QT_TAM_STRING NUMBER := NVL (LENGTH (PDS_STRING), 0); WW_COLUNA_ESQ TABELA; WW_COLUNA_ATUAL TABELA; WW_CUSTO NUMBER := 0; BEGIN IF WW_QT_TAM_TEXTO = 0 THEN RETURN WW_QT_TAM_STRING; ELSIF WW_QT_TAM_STRING = 0 THEN RETURN WW_QT_TAM_TEXTO; ELSE FOR j IN 0 .. WW_QT_TAM_STRING LOOP WW_COLUNA_ESQ(j) := j; END LOOP; FOR i IN 1.. WW_QT_TAM_TEXTO LOOP WW_COLUNA_ATUAL(0) := i; FOR j IN 1 .. WW_QT_TAM_STRING LOOP IF SUBSTR (PDS_TEXTO, i, 1) = SUBSTR (PDS_STRING, j, 1) THEN WW_CUSTO := 0; ELSE WW_CUSTO := 1; END IF; WW_COLUNA_ATUAL(j) := LEAST (WW_COLUNA_ATUAL(j-1) + 1, WW_COLUNA_ESQ(j) + 1, WW_COLUNA_ESQ(j-1) + WW_CUSTO); END LOOP; FOR j IN 0 .. WW_QT_TAM_STRING LOOP WW_COLUNA_ESQ(j) := WW_COLUNA_ATUAL(j); END LOOP; END LOOP; END IF; IF(WW_QT_TAM_TEXTO > WW_QT_TAM_STRING)THEN RETURN 1 - (WW_COLUNA_ATUAL(WW_QT_TAM_STRING) / WW_QT_TAM_TEXTO); ELSE
113
RETURN 1 - (WW_COLUNA_ATUAL(WW_QT_TAM_STRING) / WW_QT_TAM_STRING); END IF; END andreatta_aux; PROCEDURE CARREGA_BASE IS V_LINHA VARCHAR2(4000) := ''; V_ARQUIVO UTL_FILE.FILE_TYPE; V1 VARCHAR2(4000); V2 VARCHAR2(4000); V3 VARCHAR2(4000); V4 VARCHAR2(4000); BEGIN V_ARQUIVO := UTL_FILE.FOPEN('TCC', 'B.csv', 'R'); DELETE FROM PRODUCAO_DOCENTE; LOOP Begin UTL_FILE.GET_LINE(V_ARQUIVO, V_LINHA); V_LINHA := V_LINHA ||';'; /******************************************/ V1 := SUBSTR(V_LINHA, 1+1, INSTR(V_LINHA,'";')-2 ); V_LINHA := SUBSTR(V_LINHA, INSTR(V_LINHA,'";')+2, LENGTH(V_LINHA) ); /******************************************/ V2 := SUBSTR(V_LINHA, 1+1, INSTR(V_LINHA,'";')-2 ); V_LINHA := SUBSTR(V_LINHA, INSTR(V_LINHA,'";')+2, LENGTH(V_LINHA) ); /******************************************/ V3 := SUBSTR(V_LINHA, 1+1, INSTR(V_LINHA,'";')-2 ); V_LINHA := SUBSTR(V_LINHA, INSTR(V_LINHA,'";')+2, LENGTH(V_LINHA) ); /******************************************/ V4 := SUBSTR(V_LINHA, 1+1, INSTR(V_LINHA,'";')-2 ); V_LINHA := SUBSTR(V_LINHA, INSTR(V_LINHA,'";')+2, LENGTH(V_LINHA) ); /******************************************/ INSERT INTO PRODUCAO_DOCENTE VALUES (V1,V3,V2,V4); Exception when no_data_found then UTL_FILE.FCLOSE(V_ARQUIVO); exit; when others then show(V_LINHA); End; COMMIT; END LOOP;
114
COMMIT; END; PROCEDURE call_jaro(str2_in IN VARCHAR2,pcd_docente NUMBER) IS WW_PR_SIM NUMBER(15,7); WW_PR_SIM_ANT NUMBER(15,7); WW_MAIOR NUMBER(15,7); WW_CD_SEQ NUMBER(10); WW_DS_PROD VARCHAR2(4000); CURSOR C_PROD(PCD_DOC NUMBER) IS SELECT * FROM PRODUCAO_DOCENTE P WHERE P.CD_DOCENTE = PCD_DOC and p.ds_producao is not null ; BEGIN FOR R1 IN C_PROD(pcd_docente) LOOP WW_PR_SIM := jaro(r1.ds_producao,str2_in); IF(NVL(WW_PR_SIM,0) > NVL(WW_MAIOR,0) and WW_PR_SIM <= 100)THEN WW_MAIOR := WW_PR_SIM; WW_DS_PROD := R1.DS_PRODUCAO; WW_CD_SEQ := R1.NR_SEQUENCIA; END IF; END LOOP; SHOW(WW_MAIOR); SHOW(WW_DS_PROD); show(WW_CD_SEQ); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('EXCEPTION IN jaro - ' || SQLCODE || ': ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('Error stack at top level:'); DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_backtrace); END; PROCEDURE call_andreatta(str2_in IN VARCHAR2,pcd_docente NUMBER) IS WW_PR_SIM NUMBER(15,7); WW_PR_SIM_ANT NUMBER(15,7); WW_MAIOR NUMBER(15,7); WW_CD_SEQ NUMBER(10); WW_DS_PROD VARCHAR2(4000); wds_aux1 varchar2(4000); wds_aux2 varchar2(4000); CURSOR C_PROD(PCD_DOC NUMBER) IS SELECT p.nr_sequencia, p.cd_producao, p.cd_docente, replace(p.ds_producao,'ê','e') ds_producao FROM PRODUCAO_DOCENTE P WHERE P.CD_DOCENTE = PCD_DOC and p.ds_producao is not null and p.nr_sequencia = 3300 ; BEGIN wds_aux2 := str2_in; FOR R1 IN C_PROD(pcd_docente) LOOP wds_aux1 := rep(r1.ds_producao); WW_PR_SIM := andreatta_2(rep(wds_aux1),rep(wds_aux2)); IF(NVL(WW_PR_SIM,0) > NVL(WW_MAIOR,0) and WW_PR_SIM <= 100)THEN
115
WW_MAIOR := WW_PR_SIM; WW_DS_PROD := R1.DS_PRODUCAO; WW_CD_SEQ := R1.NR_SEQUENCIA; END IF; END LOOP; SHOW(WW_MAIOR); SHOW(WW_DS_PROD); SHOW( WW_CD_SEQ); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('EXCEPTION IN jaro - ' || SQLCODE || ': ' || SQLERRM); DBMS_OUTPUT.PUT_LINE('Error stack at top level:'); DBMS_OUTPUT.PUT_LINE(dbms_utility.format_error_backtrace); END; end SIMILARITY; /