MTFN
MTFN copied to clipboard
Implementação do algoritmo metaphone para português
h1. MTFN - MeTaPHoNe
Implementação do algoritmo Metaphone para Português (focado principalmente em nomes brasileiros, mas parece não fazer feio com nomes portugueses).
Baseado "no trabalho da Prefeitura de Várzea Paulista":http://www2.varzeapaulista.sp.gov.br/metaphone e no código de Carlos Costa Jordão. (Veja o código fonte da classe "MetaphonePtBr" para os COPYRIGHTS originais).
h2. Novidades
2009-10-08 Implementado MetaphonePtBr mais frouxo. O algoritmo foca apenas nos fonemas que mais se destacam nas palavras e faz várias concessões sobre a pronúncia. A ideia é diminuir a precisão para facilitar a pesquisa. O próximo passo é implementar uma variação do Double Metaphone, mas usando o Metaphone Frouxo e o Metaphone normal para classificar a proximidade das palavras (palavras que batem no metaphone frouxo e normal são preferênciais as que batam apenas com o metaphone frouxo).
2009-10-08 Pequeno analisador para agrupar as palavras pelos fonemas. Por enquanto é apenas um utilitário útil. A itenção é tentar deixar ele um pouco mais esperto para destacar "ponto fora da curva"
h2. Para que serve?
O algoritmo cria uma "chave" baseada na pronúncia mais provável do nome. Essa chave pode ser usada principalmente em pesquisas no banco de dados. Dessa forma, a pesquisa passa a achar nomes que são fonéticamente parecidos ao invés de somente parecidos na escrita.
Por exemplo, ao procurar por "Carina", você também encontraria: Karina, Carine, Caren, Kharen, Corina, Quirino e variantes...
O quão isso é útil? Bom, acho que qualquer sistema que tenha uma pesquisa por nomes deveria ter um desses :)
h2. Motivação
Os algoritmos para criar chaves fonéticas são quase todos baseados na língua inglesa, o que os torna inúteis para sistemas em português. Por conta disso, comecei a procurar uma implementação de codificação fonética para nossa língua pátria e acabei encontrando o trabalho da Prefeitura de Várzea Paulista (tremendo trabalho legal!!!).
O algoritmo estava em C e cuidei só de passar para Java. Mas tive duas preocupações:
1 - Implementar de uma maneira tão simples que qualquer um que olhar pense consigo: "Que troço besta, achei que fosse mais complicado".
2 - Testar com o maior número possível de nomes para refinar o algoritmo.
Acho que consegui atingir ambos os objetivos (...espero!). Quanto a testar com o maior número possível de nomes, continuo lentamente modificando o algoritmo conforme vou achando casos estranhos. Como isso é uma pesquisa "no braço" por nomes que não se encaixam na fonética, é um trabalho que vai ficando cada vez mais difícil. Se você encontrar coisas esquisitas, por favor, me avise para eu ir melhorando a coisa.
h2. Como usar?
É bem simples, na verdade:
String metaphoneCode = new MetaphonePtBr("Epaminondas").toString();
// Deve retornar "EPMNNDS"
Só isso, de verdade.
h2. Como funciona?
Códigos metaphone substituem cada "som" da palavra por um equivalente fonético. Abaixo os equivalentes fonéticos:
* "B" (bacia)
* "D" (dado)
* "F" (foca)
* "G" (gato)
* "J" (gente)
* "K" (casa)
* "L" (lote)
* "1" (alho) (é o número "um", não é "L" minúsculo)
* "M" (maçã)
* "N" (nabo)
* "3" (nhoque)
* "P" (pau)
* "R" (oração)
* "2" (arroz)
* "S" (centro)
* "T" (tatu)
* "V" (vila)
* "X" (chão)
* "Z" (asa)
Todas as vogais são descartadas, exceto se forem a primeira letra do nome, como em "Alexandre" (ALXNDR) ou "Horácio" (ORS).
h2. O que mais?
Todo código tem pegadinhas e poréns, como esse aqui não é exceção, é bom que você esteja ciente delas antes de usar o código:
1 - A implementação é lenta. Meu foco foi fazer um mecanismo simples e versátil, não rápido. Pensei até em tentar acelerá-lo, mas a transformação de cerca de 100.000 nomes não chegou a demorar um minuto na minha máquina, então, para o que eu quero, está bom. Meu foco nesse projeto vai ser aprimorar os matches e deixar o mecanismo de substituição cada vez mais versátil. Se você quiser mais velocidade, vejo 2 alternativas: 1- use a implementação do pessoal de Várzea Paulista em C (é um único loop com switches... acho difícil existir algo mais rápido) ou 2 - modifique o mecanismo para deixá-lo mais veloz.
2 - COPYRIGHT desse projeto. Da minha parte, você é livre para copiar, usar, modificar, vender, fazer-o-que-te-der-na-telha com o código. Você também é livre para me dar os créditos pelo trabalho ou ignorar completamente qualquer menção ao meu nome, faça como estiver a fim :) Por outro lado, use esse código "como-está", não garanto nada, nem prometo nada, use por sua própria conta e risco. Você também precisa dar os créditos aos autores originais dos trabalhos, como está no copyright do arquivo "MetaphonePtBr.java".
h2. Só isso?
Algumas pessoas merecem agradecimentos especiais:
- Lawrence Philips, que teve a idéia genial!
- O povo da prefeitura de Várzea Paulista e a Carlos Costa Jordão (o código em C para portuga é dele). Belíssimo trabalho!
- Ao Marco "Kiko" Carnut (http://www.postcogito.org) que me ajudou com uma base jóia de nomes próprios para testes já em txt, prontinha pra usar.
Espero que seja útil. Se estiver usando, me mande um e-mail (sacumé... é uma tremenda massagem no ego saber que estão usando seu trabalho). ;)
[]s Ronie Uliana