Escolar Documentos
Profissional Documentos
Cultura Documentos
Este trabalho tem por objetivo apresentar as principais funções de similaridade para
dados complexos (imagens e vídeos) e textos. Para os dados complexos são diferenciadas as
formas de recuperação por descrição e conteúdo, exibida as premissas para a função de
distância e apresentadas as principais funções métricas (Euclidiana, Manhattan e Chebyshev).
Outra abordagem apresentada neste trabalho é em relação as métricas de similaridade
utilizadas para textos, sendo apresentadas as principais delas (Levenshtein, Jaro-Winkler,
Monge-Elkan e Carla) sendo diferenciado os dois tipos de consulta Range Query e K-Nearest
Neighbor. Por fim, a proposta deste trabalho é a elaboração de um aplicativo corretor
ortográfico desenvolvido em ASP.Net utilizando Entity Framework na qual a palavra digitada
é a própria fonte para extração das características, e que implemente a métrica e o algoritmo
Jaro-Winkler. Os dados correspondem a uma listagem definida de palavras do dicionário
nacional e são armazenadas no Banco de Dados SqlServer sendo utilizada o tipo de busca K-
Vizinho Mais Próximo para seleção dos resultados. Por fim o algoritmo de Jaro-Winkler em
conjunto com as tecnologias: C# ASP.Net MVC, Entity Framework, jQuery, JSON e Ajax,
mostrou ser uma solução bastante eficaz para a consulta de similaridade.
DONE, Douglas Santamarina. (2013). Spell algorithm using Similarity algorithm. Course
Conclusion Project – Instituto Federal de São Paulo, São João da Boa Vista, 2013.
This study aims to present major similarity functions for complex data (images and
videos) and texts. For complex data are differentiated the retrieval forms by description and
by content, are displayed premises for the distance function and presented major functions
metrics (Euclidiana, Manhattan e Chebyshev). Another approach presented in this paper
compare the similarity metrics used for texts, being presented the main (Levenshtein, Jaro-
Winkler, Monge-Elkan e Carla) and the two tipes of query are differentiated: Range Query
and K-Nearest Neighbor. Finally the proposal of this work is the development of a
spellchecker application in ASP.Net using Entity Framework and each word typed is the very
source for feature extraction that implements the Jaro-Winkler algorithm, the data correspond
to a defined list of words in Brazilian dictionary and they are stored in SqlServer database
being used to query type K-Nearest Neighbor for results selection. Finally the Jaro-Winkler
algorithm together with the technologies: C # ASP.Net MVC, Entity Framework, jQuery,
JSON and Ajax proved to be a very effective solution for similarity query.
1 INTRODUÇÃO ...........................................................................................................15
2.5.1 Hamming............................................................................................................................ 26
3 METODOLOGIA ....................................................................................................... 33
3.2.2 Consulta com filtro para eliminar resultados sem relevância ............................................. 35
3.3.2 Aplicação............................................................................................................................ 39
3.3.6 Solução híbrida utilizando Entity Framework, listas e armazenamento em cache ............ 41
4 RESULTADOS .......................................................................................................... 50
5 CONCLUSÕES .......................................................................................................... 53
REFERÊNCIAS ............................................................................................................... 54
Capítulo
15
1 Introdução
É cada vez mais comun ver aplicações e sistemas de informação que armazenam
dados multimídia como imagens, vídeos ou mesmo uma quantidade grande de texto. Para a
busca deste tipo de dado, uma busca por termos iguais torna-se ineficiente ou mesmo inviável,
visto, por exemplo, que duas imagens mesmo representando um mesmo objeto podem ter
formas, cores e texturas um pouco diferentes o que já as caracterizariam como diferentes
(ARANTES et al., 2003).
A similaridade surgiu desta necessidade, de localização de imagens, textos, vídeos,
dentre outros que não possuem informações exatamente iguais, mas similares. Este conceito é
amplamente utilizado na medicina para comparação de tomografias, ressonância magnética,
radiografias e mamografias servindo para encontrar tumores ou outro tipo de exames que
podem ser identificados. Neste tipo de análise seria impossível realizar uma comparação por
igualdade porque uma tomografia de um paciente, por exemplo, nunca é igual ao de outro,
porém a forma, textura e cor de tumores podem ser semelhantes e com isto sendo possível
identifica-los (SANTOS FILHO et al., 2001).
Esta similaridade também pode ser utilizada para recuperação biométrica de
impressões digitais, reconhecimento de voz e identificação da íris, para este último exemplo
existem programas de similaridade que provê acerto de aproximadamente 99,10% dos casos
(GONZAGA, 2012).
Embora hoje existam resultados satisfatórios para determinadas situações, esta ideia
de similaridade ainda é um dos grandes desafios da informática. Embora já se tenha avançado
para soluções específicas, este desafio se baseia na criação de máquinas com poder dedutivo
que consigam reconhecer padrões e semelhanças entre imagens ou textos (CASTRO;
PRADO, 1999).
Para a utilização da similaridade em imagens são utilizadas funções matemáticas
dentro do plano cartesiano, nas quais as distâncias entre pontos podem representar
semelhanças entre as imagens de estudo, nos exames médicos por exemplo, podem
representar um tumor ou a existência de alguma doença que precisa de tratamento (CURA,
2002).
16
A similaridade em texto procura mensurar a diferença entre uma palavra e outra, para
isto várias técnicas são utilizadas. Contudo a ideia principal consiste em medir quantas
alterações de letras seriam necessárias para transformar uma palavra em outra, por exemplo,
para transformar a palavra ‘nota’ em ‘cota’ seria necessária apenas mudar a primeira letra, ou
seja, uma única alteração é necessária (BORGES; CONY; FREITAS, 2005).
1.1 Motivação
É cada vez mais comum que aplicações e serviços tenham que lidar com dados
complexos como som e imagens, em que a busca por igualdade nem sempre é
eficiente. Para contornar este problema de forma simples estes tipos de dados podem
ser descritos através de tags, porém estas informações podem não ter uma grande
abrangência limitando assim os resultados das buscas. Na busca por similaridade em
textos ou palavras este conceito é muito próximo, podendo ser adotado este padrão de
similaridade em uma gama de aplicações, como melhoria em ferramentas de buscas,
análise de DNAs e corretores ortográficos.
Na literatura embora existam algoritmos que trabalhem com a similaridade com textos
ou palavras, não foi encontrada uma aplicação que mescle os algoritmos de
similaridade com uma linguagem de programação Orientada a Objetos e que tenha
uma preocupação com desempenho. Este trabalho explora este nicho para a criação de
uma aplicação para este fim.
1.2 Objetivos
Este trabalho tem como objetivo mostrar os conceitos de similaridade, sua relevância
para as aplicações atuais e as áreas de conhecimento na qual o seu uso é necessário.
Através de embasamento teórico e analogias ao mundo real são apresentadas as
principais funções métricas para cálculo da distância entre dois objetos.
Também são estudados os cinco principais algoritmos de busca por similaridade
presentes na literatura para a busca por conteúdo em textos ou palavras.
Como resultado é desenvolvido uma aplicação que faz a busca por similaridade de
termos digitados. Neste trabalho não é adotado a morfologia ou semântica das
17
palavras, sendo a proximidade entre elas definidas através do uso do algoritmo Jaro-
Winkler, que verifica a quantidade de alterações necessárias para que uma palavra seja
transformada em outra. A aplicação propõe melhorias para este algoritmo de forma
que ele se adeque ao contexto e faz uma verificação de palavras propostas com um
dicionário previamente implementado trazendo os dez resultados mais relevantes
(através da busca K-Nearest Neighbor) e os exibindo em ordem de proximidade. Após
a exibição dos resultados, será possível selecionar algum dos termos e proceder a
substituição do termo pesquisado podendo a aplicação ser utilizada como um corretor
ortográfico.
Este trabalho está dividido da seguinte forma: o capítulo 1 traz a introdução sobre o
assunto de similaridade assim como a motivação e objetivos estabelecidos nesta
monografia. O capítulo 2 traz a pesquisa bibliográfica que contém todo o
embasamento teórico adquirido para a realização da aplicação de similaridade. O
capítulo 3, por sua vez, apresenta a metodologia sendo esta dividida em seis etapas
distintas que vão desde a criação do Banco de dados até o término da aplicação,
passando por etapas de desenvolvimento, melhorias, testes e correções.
O capítulo 4 apresenta os resultados obtidos e o capítulo 5 apresenta as conclusões
finais do presente trabalho.
Capítulo
19
2 Pesquisa Bibliográfica
Com o avanço da tecnologia e dos sistemas de informação grande parte das aplicações
não manipulam apenas dados simples, como textos e números, mas necessitam gerenciar e
manipular também imagens, vídeos, áudio ou mesmo uma quantidade grande de texto. Este
tipo de informação é chamada de dados complexos. Os dados complexos dificultam ou
impossibilitam a busca convencional por igualdade, sendo necessário recorrer à pesquisa por
similaridade, onde através de um cálculo de distância é possível mensurar o quanto objetos se
assemelham ao objeto pesquisado (ARANTES et al., 2003).
Em aplicações práticas e comerciais, a pesquisa por similaridade é muito utilizada na
medicina, onde são analisadas cadeias de DNA, ferramentas de apoio a diagnóstico (exames
de tomografia, ressonância magnética, radiografias, mamografias, etc). As tomografias de
dois pacientes nunca são iguais, desta forma para identificação de um tumor de forma
automatizada são desenvolvidos algoritmos e técnicas que trabalham com formas, tamanhos,
cores e dimensões aproximadas para esta identificação (SANTOS FILHO et al., 2001).
Para realizar uma busca de um dado complexo, é possível fazê-la de duas formas, que
são descritas nas duas subseções seguinte, 2.1.1 e 2.1.2:
É a mais simples e comumente utilizada na busca por igualdade, para uma busca de
imagem ou vídeo sendo feita através das tags previamente inseridas. É um mecanismo de
busca funcional, porém a sua eficiência se baseia na intuição da pessoa que as inseriu
(RODRIGUES; CECIM; ARAÚJO, 2003).
As imagens são descritas através de atributos textuais que são a base para a consulta.
Por exemplo, escrever o nome da pessoa caso seja um rosto ou conter a cor predominante,
forma ou mesmo através de uma tentativa de descrever a imagem (CURA, 2002).
20
Este tipo de recuperação é bastante utilizado na web para descrever imagens, apesar da
grande quantidade de imagens disponíveis a busca e recuperação de determinada imagem
pode ser um processo árduo e dificultoso devido à imprecisão dos resultados, carência ou
inexistência de informações para sua localização (ALVES, 2012).
A recuperação por conteúdo implementa técnicas e algoritmos para que as buscas por
vídeos ou imagens utilizem de critérios de percepção. Na busca por imagens, por exemplo,
possibilita recuperar a informação de forma visual levando em consideração as cores e
gradientes e ao compará-las é possível estabelecer o quão similar duas imagens são
(RODRIGUES; CECIM; ARAÚJO, 2003).
Este tipo de abordagem é muito utilizada na área da medicina para identificação de
tumores em radiografias e também pode ser utilizada, por exemplo, para auxiliar o
sensoriamento remoto para identificação de desmatamentos, crescimento da área urbana de
uma cidade, dentre outros (CURA, 2002).
Para realizar a comparação por imagens primeiramente é feita uma extração de suas
características em uma região para permitir a sua comparação. São realizados cálculos para
obtenção de valores e propriedades qualitativa ou quantitativa de acordo com o objetivo
proposto. As características podem ser, por exemplo, distância entre um ponto e outro,
diferenciação de cores, tamanho, dentre outras (ROSA; TRAINA, 2002).
No presente trabalho a extração de características será adotada de forma mais
simplificada, visto que serão comparadas duas palavras e o cálculo de distância será feito
baseado na quantidade de alterações necessárias para transformar uma palavra em outra,
analisando fatores como tamanho e posição de cada caractere.
Existem duas formas de representação e comparação utilizando as regiões, utilizando as
características externas e internas, que são citadas nas duas subseções seguintes:
Baseia-se no conteúdo da imagem em si, sendo analisada a distância entre pixels, cor e
textura (ROSA; TRAINA, 2002).
A distância entre dois pontos é sempre positiva ao menos que o ponto x incida sobre o
ponto y, neste caso a distância será igual a 0 (VARANDAS, 2003).
d(x,y) = 0 para x = y e d (x,y) > 0 para x ≠ y;
2.3.2 Simetria
Quando adicionado um terceiro ponto no plano qualquer lado do triângulo é menor que a
soma dos outros dois lados (VARANDAS, 2003).
d(x,y) ≤ d(x,z) + d(z,y)
Para o cálculo da dissimilaridade existe uma série de funções matemáticas que satisfazem
estas três premissas são utilizadas para determinar o quanto um objeto encontra-se distante do
outro em um plano.
23
O valor da similaridade por sua vez varia da escala [0, 1] sendo o valor crescente quanto
mais próximos os objetos estão e sendo 1 para informações iguais (BORGES; CONY;
FREITAS, 2005).
A busca por similaridade envolve três vertentes: a métrica (distância entre os elementos),
o objeto central da pesquisa e o tipo de consulta (TRAINA, 2012).
Em um plano com os pontos P1 e P2 com as coordenadas (x1, y1) e (x2, y2) a distância
d() entre estes pontos é definida pela equação 𝑑 = √(𝑥1 − 𝑥2)2 + (𝑦1 − 𝑦2)2 em que é
traçada uma reta diagonal entre os pontos P1 e P2 e desta forma medindo a menor distância
entre estes elementos no plano. Considerando que estes pontos venham a formar um triângulo
retângulo, o valor da função é o valor de sua hipotenusa. Segue abaixo a Figura 2 que melhor
ilustra este caso.
É também conhecida como Função Taxi Cab ou Função City Block. Em um plano com
os pontos P1 e P2 com as coordenadas (x1, y1) e (x2, y2) a distância d() entre estes pontos é
definida pela equação d = |x1 - x2| + |y1 - y2| em que é medida a menor distância porém
utilizando somente retas horizontais e verticais no plano. Considerando um triângulo
retângulo, o valor desta função coincide sobre a soma dos dois catetos conforme ilustra a
Figura 3 (CLESIO, 2012)
A Figura 5 ilustra cada uma destas funções de distâncias vistas em um plano, para o
exemplo considere a variável com o nome ‘r’ com o valor 1. Para a função Manhattan a
distância em relação ao elemento será de 1 ponto na horizontal ou vertical, faz parte deste
conjunto todos os elementos que estiverem neste contexto. A função Euclidiana por sua vez,
consegue encontrar elementos na diagonal, ou seja, represente um círculo com raio igual a 1.
A distância Chebyshev traça um quadrado em que cada um dos seus lados está distante em r
de seu epicentro, com isto cada um de seus lados terá o tamanho de 2r (FORSTER, 2008).
Para a comparação de string por sua vez, são encontradas na literatura com maior
frequência as seguintes métricas para cálculo de distância.
2.5.1 Hamming
possível identificar e corrigir 100% dos casos em que houve um erro individual, ou seja, um
dos elementos foi digitado incorretamente (ARGENTA; AMORIM, 2012).
2.5.2 Levenshtein
Esta técnica calcula a Distância de Edição entre duas palavras com o auxílio de uma
matriz calcula o menor custo operacional para transformar uma palavra em outra. Este cálculo
é feito pela quantidade de substituições, inclusões e exclusões tendo cada uma destas o
mesmo custo operacional para comparação (LEVENSHTEIN, 1966).
Este algoritmo é bastante utilizado para mensurar distâncias fonéticas, variantes
linguísticas ou dialetos, tendo versões desta implementação em várias línguas como Irlandês,
Alemão, Holandês, dentre outras. Este algoritmo foi utilizado, por exemplo, para examinar 15
diferentes dialetos da Noruega a fim de identificar possíveis correlações entre eles (VALLS et
al., 2012)
A métrica de Levenshtein também tem seu uso na medicina sendo utilizada para
sequenciamento e análise de cadeia de DNA sendo mensurada a quantidade de edições
necessárias para transformar uma cadeia de DNA em outra por exemplo (BORGES; CONY;
FREITAS, 2005).
Esta métrica é utilizada em empresas para remover dados duplicados de lista de e-mails
com redução do custo para o envio de mailings. Agências governamentais também utilizam
muito desta métrica em pesquisas de censo para eliminar possíveis registros duplicados que
comprometeriam a confiabilidade e o resultado final de determinada pesquisa, reduzindo
assim o custo operacional por reduzir o tempo de revisão e limpeza destas informações
(HERZOG; SCHEUREN; WINKLER, 2010).
2.5.4 Monge-Elkan
Propõe uma métrica que além de calcular a distância entre os caracteres divide as strings
de comparação em tokens, e então aplica uma função de calculo de distância de edição, ao
final será gerado um valor que será a semelhança entre estas strings (GONÇALVES, 2008).
A primeira aplicação desta métrica foi utilizada para localizar artigos científicos
disponíveis no acervo da Universidade de Califórnia. Os artigos poderiam ser encontrados
através de uma combinação dos nomes dos autores, palavras chaves, títulos, resumos ou
informações bibliográficas, após identificado o nome do artigo, era procurada a afiliação, o
algoritmo então localizava o local onde este arquivo encontrava-se disponível podendo ser o
site institucional ou uma página própria do autor (MONGE; ELKAN, 1996).
2.5.5 Carla
Recupera os objetos que diferem até determinada distância do objeto pesquisado (raio de
busca) estando sempre o objeto de referência no centro dos resultados. A Figura 6 mostra os
resultados obtidos em uma pesquisa por Range Query onde r é o raio de busca (SANTOS
FILHO et al. 2001).
Retorna a quantidade de objetos (para K > 1) mais próximos ao valor pesquisado, não
tendo o objeto de referência ao centro dos resultados. Na Figura 7 é ilustrada uma busca por
K-Nearest Neighbor em que o valor de K é igual a 5. (SANTOS FILHO et al. 2001).
Arantes et al. (2003) propõe ainda soluções híbridas como o kAndRange e kOrRange. O
primeiro caso utiliza conjunção para recuperar os valores, ou seja, os resultados devem
atender a ambos os operadores, com isto prevalece como resultado a função mais restritiva,
este algoritmo poderia ser utilizado em um texto para, quando uma palavra for digitada
errada, listar no máximo 10 palavras que difiram em até 2 caracteres. O segundo caso por sua
vez utiliza de disjunção, ou união, na qual o resultado só precisa satisfazer um dos critérios de
similaridade, um exemplo prática de uso deste algoritmo seria utilizado na área da genética
para resolver o seguinte problema: “Selecionar ao menos 20 sequências de DNA mais
parecidas com uma sequência qualquer apresentada incluindo todas as que difiram dela por
até 10 códons”. O grande benefício das soluções híbridas é que propiciam um desempenho até
40 vezes melhor do que se fossem executadas em separado.
Através de processos de indexação, as buscas podem tornar-se mais eficientes. Embora
sejam utilizados para propósitos diferentes a consulta por Range Query possui um
desempenho melhor, pois são conhecidos o domínio e o raio de pesquisa desde o início da
31
consulta podendo através da indexação ser eliminados resultados. A consulta por vizinhos
mais próximos geralmente leva um tempo maior de processamento, pois todas as informações
devem ser verificadas e ordenadas para apresentação do resultado final (ARANTES et al.,
2003).
O presente trabalho faz a pesquisa de similaridade em textos, sendo a palavra digitada a
própria fonte para extração das características, sendo cada uma de suas letras uma
característica a ser comparada para a obtenção dos resultados. Será adotada para
desenvolvimento a métrica e algoritmo de Jaro-Winkler por ser a que melhor trabalha com
palavras individuais e por não ter o tamanho da palavra como um limitador, sendo retornadas
10 palavras similares sendo estas selecionadas através do tipo de consulta K-Nearest
Neighbor.
Capítulo
33
3 Metodologia
Este capítulo tem por objetivo descrever a tecnologia utilizada assim como cada uma
das etapas partindo da criação do Banco de Dados e finalizando com os testes e correções
provenientes do desenvolvimento. A aplicação funciona de forma semelhante a um corretor
ortográfico, utilizando o algoritmo Jaro-Winkler e o K-Nearest Neighbor como o tipo de
busca. Neste capítulo são descritos os passos.
3.1 Tecnologia
• Início
• Criação do Banco de Dados e inclusão dos registros
• Consulta com filtro para eliminar resultados sem relevância
• Implementação do algoritmo Jaro-Winkler em ASP.Net
• Melhorias e adaptações do algoritmo
• Implementação do tipo de consulta K-Nearest Neighbor
• Criação de mecanismo de busca assíncrona
• Interface com o usuário
• Testes e correções
• Fim
Como a aplicação sempre trabalha com uma quantidade grande de registros a cada
consulta do usuário, o desempenho seria um dos maiores problemas e que poderia tornar a
aplicação inviável para outros fins que não seja o acadêmico.
Para resolver este problema é realizado um único acesso a banco que traz todos os
resultados, sendo então realizados diretamente na aplicação os filtros prévios antes da
realização do algoritmo de similaridade e ordenação dos elementos. Este filtro tem por
objetivos eliminar os resultados discrepantes e sem nenhuma relevância, sendo aplicado
diretamente na lista de palavras obtidas, sendo os resultados compostos por um loop que
funciona de forma semelhante a uma consulta de elementos com o operador ‘ou’, esta
consulta é melhor exemplificada nos parágrafos abaixo utilizando a sintaxe ASP.NET C#.
Supondo que sejam digitados para a consulta os caracteres ‘tes’, este primeiro filtro
faz agrupamento em pares para a realização de uma consulta que traz resultados relevantes,
ou seja, neste caso são utilizadas duas clausulas OR, ficando a consulta da seguinte forma:
SELECT id, palavra FROM Dicionario WHERE (palavra like ‘%te%’) OR (palavra
like ‘%es%’)
É possível perceber pelo comando criado que os resultados discrepantes são
desconsiderados, para a posterior busca por similaridade. A quantidade de cláusulas ‘ou’
utilizada sempre é o tamanho da string de consulta menos um, no exemplo foi possível
perceber isto visto que a palavra ‘tes’ possui três letras e foram utilizadas duas clausulas ‘or’.
desnecessário caso uma interação seja feita enquanto um processo ainda estiver em execução
este será interrompido permitindo que o novo processo faça uso da memória e processador.
O sistema possui uma interface simples contendo um único campo para digitação da
palavra, a cada interação por parte do usuário o sistema faz a consulta e a seleção por
similaridade e exibe os resultados.
A aplicação traz as 10 palavras mais similares após o cálculo da métrica Jaro-Winkler,
de acordo com os termos pesquisados. Estes resultados são exibidos logo abaixo da caixa de
pesquisa, e em ordem decrescente de proximidade sendo cada um dos resultados um link que
poderá ser clicado e com isto realizando a substituição do termo previamente digitado.
A aplicação tem um botão chamado ‘Adicionar’ que tornará possível inserir novos
termos no banco de dados, permitindo assim a inclusão de novas palavras que não estejam
contidas no contexto inicial, tais como gírias, abreviações ou estrangeirismos. A Figura 9
ilustra a interface utilizada no sistema.
Após a realização de todas as etapas descritas acima é realizada uma rotina de testes e
correções, o principal enfoque das correções é para resolver problemas de desempenho,
exceções e carga.
Uma das possíveis soluções que deverá ser implementada será para o tratamento de
números ou caracteres inválidos, desta forma ao digitar uma data, por exemplo 14/07/2012, a
aplicação não consegue comparar estes caracteres com os registros literais presentes na
aplicação, visto que não seria possível prever uma similaridade em busca de correções.
Os testes de desempenho por sua vez, são realizados através da pesquisa de vários
termos para calcular o tempo entre a digitação dos termos e o resultado da busca.
A última etapa de teste é o teste de carga, onde várias instâncias (navegadores) faz
acesso a aplicação para ver como ela se comporta em relação a múltiplos acessos, embora
tenham os limitadores de tamanho de banda e desempenho de disco.
Em caso de grandes problemas de desempenho ou carga uma solução seria abrir mão
das vantagens e facilidades do Entity Framework e realizar uma solução em que a consulta
seja feita diretamente em banco de dados, eliminando assim a dependência de um Framework
para este fim.
O tópico seguinte relata todas as etapas realizadas para o desenvolvimento e
concepção da aplicação.
3.3 Desenvolvimento
(chave-primária do tipo inteiro e com auto-incremento) além do campo ‘Palavra’ (do tipo
literal).
As palavras que popularam a tabela dicionário foram recuperadas do complemento
‘Verificador Ortográfico para Português do Brasil’ desenvolvido para o Mozilla Firefox,
desenvolvido por Vinícius Della Líbera e Adriana Quintanilha (2013). Através deste
complemento foram recuperadas 264.315. Das palavras encontradas foram removidas as
abreviações (como por exemplo: ‘sr.’, ‘dr.’), por não ter relevância para o trabalho.
3.3.2 Aplicação
3.3.3 Desempenho
Embora o estudo não tenha como foco principal o desempenho, é tomado um cuidado
especial em todas as etapas do desenvolvimento, de modo que a aplicação realize todas as
requisições e processamento em um tempo aceitável. Para que isto tornasse possível várias
alternativas foram implementadas e testadas, abaixo são enumeradas as soluções
implementadas sendo enumerados os pontos fortes e fracos sendo justificado o motivo da
escolha.
O desenvolvimento desta solução mostrou-se bastante trabalhoso, por não haver uma
forma simples para realizar consultas utilizando este tipo de expressão juntamente com
cláusulas ‘ou’ dinâmicas, ou seja, não era possível realizar uma única requisição ao banco de
Dados para realizar a pesquisa. Com isto a única medida possível era realizar uma consulta ao
Banco de Dados para cada dupla de palavras, com isto a quantidade de consultas era
proporcional ao tamanho do termo digitado, tendo a relação: (tamanhoDaPalavra – 1) * 2,
com isto ao inserir uma palavra com 5 caracteres seriam feitas 4 consultas ao Banco de
Dados, esta solução por fim teve desempenho inferior quando comparado as soluções abaixo.
em cache
Por fim, foi realizada uma nova tentativa de implementação desta vez utilizando uma
solução híbrida que concilia as consultas à base de dados utilizando o Entity Framework, uma
lista de palavras para execução no sistema e o cache nativo da linguagem C# para
armazenamento dos resultados.
A proposta agora utiliza o Entity Framework apenas como interface de comunicação
entre aplicação e Banco de Dados, e visando diminuir a quantidade de acessos e requisições
ao disco é realizada uma única consulta que traz todas as palavras armazenando-as em uma
lista de strings para uso da aplicação. Esta listagem é armazenada em cache que permite a
recuperação de seu conteúdo sem que seja necessário recorrer ao Banco de Dados.
Esta lista de palavras é então utilizada durante todo o tempo de execução da aplicação,
sendo recriada a cada nova execução. O cache, por sua vez, foi definido para ter validade de
um dia, ou seja, o sistema fará uma nova requisição somente ao término deste período, sendo
então recriado o cache.
Para solucionar esta questão foi realizada uma melhoria para a função Jaro-Winkler
em que todos os caracteres acentuados eram desconsiderados durante a verificação da
distância. Para a remoção dos acentos foi utilizada a função proposta por Schimanco (2011)
que faz a remoção por base bytes de acentuação presente em cada caractere.
Sendo:
- quantidadeComum: variável que armazena a quantidade de caracteres comuns
encontrados entre as duas palavras.
- palavra1.Length – tamanho da primeira palavra passada para a função.
- palavra2.Length – tamanho da segunda palavra passada para a função.
- transposicoes – quantidade de transposições necessárias referente aos caracteres
comuns.
Por fim o algoritmo faz um último cálculo para aumentar o grau de similaridade dos
primeiros caracteres. Este aumento pode ser de até 40% do valor que foi perdido durante o
cálculo da similaridade, ou seja, caso a similaridade inicial seja de 90 pontos mas a palavra
tenha os quatro primeiros caracteres iguais, a similaridade será aumentada em 40% dos 10
pontos restantes, sendo acrescidos 4 pontos da similaridade inicial, chegando a 94 pontos.
Após a integração, foi acrescentada a biblioteca ‘UI’ do jQuery para tornar possível o
desenvolvimento das funções que retornassem os resultados de forma assíncrona. O
desenvolvimento foi baseado no modelo de implementação encontrado no blog da MSDN
(Microsoft Developer Network) na qual o material propunha a utilização do jQuery para criar
um autocomplete para um campo do tipo texto (MSDN, 2012)
A função em jQuery que faz a comunicação de forma assíncrona com o servidor é
mostrada na Figura 11.
evento select que acrescenta o respectivo conteúdo na caixa de texto e limpa o conteúdo da
caixa de texto ‘palavra’.
O método de adicionar tem sintaxe semelhante com o método jQuery que obtém os
resultados de forma assíncrona, pois ambos utilizam de implementação em Ajax para
realizarem a requisição junto ao Controller.
O botão adicionar, conforme mencionado anteriormente, tem como finalidade inserir
uma nova palavra no Banco de Dados e também na caixa de texto da aplicação.
Primeiramente é acionada a função ‘home/adicionar’ sendo passado como parâmetro o valor
presente no input ‘palavra’, na sequência é então inserido o mesmo valor na caixa de texto
que armazena os conteúdos apresentados, a última etapa consiste em limpar o elemento
‘palavra’ para permitir uma nova inserção.
A Figura 14 exibe a codificação realizada para permitir que o controlador faça a
inclusão do conteúdo no Banco de Dados.
50
4 Resultados
Para verificar os resultados obtidos pelo algoritmo foi criado um método que
armazena todas as palavras obtidas após o filtro inicial e o seu valor de similaridade em um
arquivo com extensão ‘csv’.
Este arquivo teve grande importância durante toda a etapa de testes, pois tornou
possível identificar que por padrão o algoritmo de Jaro-Winkler considerava o valor de
similaridade diferente entre palavras acentuadas. Por exemplo, ao pesquisar o termo ‘esta’ a
palavra ‘está’ aparecia na posição 344 com apenas 88,3 pontos de similaridade, atrás de
palavras como ‘estação’ (91,42 pontos) e ‘estadual’ (90 pontos).
Com os resultados presentes em uma tabela tornou mais viável a verificação dos
valores para estudo e entendimento do algoritmo Jaro-Winkler, através da análise foi possível
perceber que o algoritmo mostrou-se bastante eficaz e que o seu uso pode ser incorporado em
diversos tipos de aplicações, servindo como um autocomplete e com a vantagem de também
prever possíveis erros de digitação.
Um dos pontos fracos e que acabou influenciando na análise dos resultados foi a
listagem de palavras obtidas. Como a listagem possui mais de 260.000 palavras os resultados
nem sempre pareciam satisfatórios pois eram exibidas uma série de termos que não são
comumente utilizados, porém em todas as situações o algoritmo funcionou e obteve os
resultados esperados.
A consulta mais onerosa realizada para a aplicação é feita ao digitar somente o
caractere ‘a’, neste caso são recuperadas 186.994 palavras que se candidatam para ser a
palavra com maior relevância. Após a realização da similaridade palavra por palavra, a
aplicação retorna em aproximadamente 2 segundos, os 10 resultados com maior relevância.
Que são ‘ab’, ‘ac’, ‘ad’, ‘ag’, ‘ah’, ‘ai’, ‘aí’, ‘al’, ‘am’ e ‘ao’, e neste caso em específico todas
possuem relevância igual a 85, sendo a ordem alfabética adotada como segundo critério de
ordenação.
51
Outro exemplo, que permite mostrar o comportamento da aplicação foi feito ao digitar o
termo ‘similaidade’, supondo que o usuário tenha cometido algum erro de digitação, neste
caso o algoritmo traz as seguintes palavras por ordem de relevância exibidas na Tabela 1.
Valor S I M I L A I D A D E
98,3 S I M I L A R I D A D E
92,1 S I M I L I D A D E
90,9 S Í M I L E
90,5 S I M I L I T U D E
90,2 S I M I Í D E O
89,0 S Í M I L
88,0 S I M I L A R
88,0 S Í M I L E S
87,0 S I M I L I A
86,9 S I F Í L I D E
tenha trazido os resultados, apresenta uma lógica que pune palavras que possuem novos
Esta situação é possível perceber através da comparação dos resultados obtidos pelas
palavras ‘símile’ e ‘similitude’ note que o primeiro termo possui seis caracteres comuns em
caracteres comuns mas por conter a inclusão de dois caracteres ‘tu’ o valor de sua
5 Conclusões
Winkler, embora tenha apresente bons resultados, nem sempre premiará a “melhor” palavra
presente no dicionário pois apresenta uma lógica que pune palavras que possuem novos
caracteres mesmo se existe maior incidência de caracteres semelhantes. Este fato em alguns
casos leva a palavras não desejáveis. Fica a proposta de realização de testes supervisionados
O presente trabalho abre o leque para uma série de trabalhos futuros, como: criação de
WebService para incorporar a similaridade a sites; criação de plugin para navegadores;
implementação de nova métrica para comparação dos resultados ou até mesmo propor
melhorias para o algoritmo de Jaro-Winkler.
54
Referências
ALVES, Cláudio Diniz. Metadados para a Recuperação de Imagens na WEB: utilizando o
software ADOBE BRIDGE. PontodeAcesso, v. 6, n. 1, p. 32-48, 2012.
BEYER, Kevin et al. When is “nearest neighbor” meaningful?. In: Database Theory -
ICDT’99. Springer Berlin Heidelberg, 1999. p. 217-235.
BORGES, Eduardo Nunes; CONY, Carlos Akcelrud. Consultas por Similaridade em SGBDS
Comerciais: Estendendo o PostgreSQL. 90f. Projeto de Diplomação (Engenharia de
Computação), FURG, Rio Grande, 2005.
CASTRO, Armando Antonio Monteiro; PRADO, Pedro Paulo Leite. Algoritmos para
reconhecimento de padrões. 2001.
CURA, Luis Mariano Del Val. Um modelo para recuperação por conteúdo de imagens de
sensoriamento remoto. 2002. Tese (Doutorado) - Curso de Ciência da Computação,
Departamento de Instituto de Computação, Universidade Estadual de Campinas, Campinas,
2002.
GONZAGA, Adilson. Estudo e avaliação das características dinâmicas do olho humano para
aplicações biométricas. 2012.
HAMMING, Richard W. Error detecting and error correcting codes. Bell System technical
journal, v. 29, n. 2, p. 147-160, 1950.
HERZOG, Thomas H.; SCHEUREN, Fritz; WINKLER, William E. Record linkage. Wiley
Interdisciplinary Reviews: Computational Statistics, v. 2, n. 5, p. 535-543, 2010.
MONGE, Alvaro E.; ELKAN, Charles. The field matching problem: Algorithms and
applications. In: Proceedings of the second international Conference on Knowledge
Discovery and Data Mining. 1996. p. 267-270.
MSDN, Microsoft Developer Network. 2012. ASP.NET MVC & jQuery UI autocomplete.
Disponível em: <http://blogs.msdn.com/b/ukadc/archive/2012/04/24/asp-net-mvc-amp-
jquery-ui-autocomplete.aspx> Acesso em: 01 de novembro de 2013
ROSA, Natália Abdala; TRAINA, A. Uma abordagem prática e eficiente de consultas por
similaridade para suporte a diagnóstico por imagens. 2002. Tese de Doutorado. Master’s
thesis, Universidade de Sao Paulo, Sao Carlos–BR.
SCHIMANCO Cesar Cassiano. Code break. 2011. Função para remover acentos em C# -
ASP.NET. Disponível em: <http://www.cbsa.com.br/post/funcao-para-remover-acentos-em-c-
--aspnet.aspx> Acesso: 25 de outubro de 2013
56
VALLS, Esteve et al. Applying the Levenshtein Distance to Catalan dialects: A brief
comparison of two dialectometric approaches. Verba: anuario galego de filoloxía, v. 39,
2012.
VB.NET Brasil. 2012. Jaro-Winkler algoritmo para tratamento de nomes. Disponível em:
<http://www.vbnetbrasil.com.br/index.php/jaro-winkler-algoritmo-para-tratamento-de-
nomes/> Acesso em: 14 de setembro de 2013