Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Implementação do algoritmo metaphone para português
Java
branch: master

Merge pull request #2 from Reglare/master

Remoção do SNAPSHOT da versão
latest commit 927749a033
@ruliana authored
Failed to load latest commit information.
.settings Subindo configurações do Eclipse para facilitar trabalhar outras máqu…
data Versão inicial
src
.classpath Subindo configurações do Eclipse para facilitar trabalhar outras máqu…
.gitignore Versão inicial
.project
README.textile
pom.xml

README.textile

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 e no código de Carlos Costa Jordão. (Veja o código fonte da classe “MetaphonePtBr” para os COPYRIGHTS originais).

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”

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 :)

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.

Como usar?

É bem simples, na verdade:


	String metaphoneCode = new MetaphonePtBr("Epaminondas").toString();
	// Deve retornar "EPMNNDS"

Só isso, de verdade.

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).

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”.

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

Something went wrong with that request. Please try again.