base de dados relativamente grande (200.000 no Estado de SP), seria muito ineficiente. Então me lembrei do algoritmo SoundEx. Só que esse algoritmo é muito lento pra constar numa chave de índice, tanto no Firebird, que é o que uso agora, e mais ainda no Clipper. Aliás, se não me falha a memória, nos fontes que acompanham o Clipper consta um fonte (PRG) do SoundEx. Não sei se é o SoundEx convencional, ou uma versão modificada. De qualquer forma, como PRG, numa chave de índice a velocidade tornaria muito lenta a indexação. Até tinha desistido. Mas resolvi pesquisar a respeito, encontrei o algoritmo original do American SoundEx e o implementei em C, que estou agora colocando à disposição dos colegas. Agradeceria muito se puderem testar e me dar um retorno acerca dos resultados, com relação a facilidade de uso, bugs e, principalmente, velocidade de indexação.
O pacote ZIP está no meu site.
Download: http://pub.buzinello.com/xbase/clipper/libs/soundex.zip
Nele constam os arquivos:
Código: Selecionar todos
DEMO.EXE - programa de demonstração (Clipper/DOS)
DEMO.PRG - fonte deste programa
Soundex.C - fonte C do algoritmo
Soundex.LIB - biblioteca para uso no Clipper
Soundex.OBJ - objeto que foi acondicionado na LIB
SoundexD.EXE - utilitário de linha (versão DOS)
SoundexW.EXE - utilitário de linha (versão Windows)A biblioteca resultante, para Clipper, contém apenas duas funções de interface: AmSoundEx(), que calcula o SoundEx de uma palavra simples e AmSoundExN(), mais apropriada para ser inserida numa chave de índice, pois calcula o SoundEx de várias palavras e retorna como resultado o SoundEx combinado de todas. Nesta última função pode-se definir quais são os caracteres espaçadores de palavras (pontos, vírgulas, etc) além do caractere espaço (default). Um argumento adicional pode ser utilizado (opcional) para informar qual o tamanho mínimo para uma palavra ser considerada (default=2). Os protótipos:
AmSoundex(<strFonte>)
AmSoundexN(<strFonte>,<strDelimitadores>[,<numTamanhoMinimo>])
PARA QUEM NÃO CONHECE SOUNDEX...
SoundEx é um algoritmo relativamente simples, cuja missão é calcular uma string que seja a representação fonética de uma palavra. A intenção é justamente facilitar os sistemas de busca, principalmente em bases muito grandes. O algoritmo original sofreu poucas alterações ao longo dos anos. A versão que codifiquei é a última publicada. No fonte C consta o link para o órgão do governo americano mantenedor do algoritmo.
Acho que alguns exemplos de cálculos (feitos pelos programas do ZIP) devem ajudar a esclarecer um pouco sobre a utilidade de algoritmos desse tipo. Notem que o formato do código do fonema é sempre o mesmo: uma letra seguida por 3 números.
Código: Selecionar todos
Palavra Simples (p) AmSoundex(p)
------------------- ------------
Buzinello B254
Busimelo B254
Caça C200
Cassa C200
Caza C200Código: Selecionar todos
Palavra Composta (p) AmSoundexN(p,"",3) <- 3 é o tamanho mínimo
-------------------------- ------------------
Paulo Buzinello P400B254
Paulu Busimelu P400B254
Maria tinha um carneirinho M600T500C656
Mary tinha um carnero M600T500C656Daqui pra frente, depois do que foi exposto, fica por conta da imaginação dos colegas que se dispuserem a testar a biblioteca.
Finalizando, quero agradecer a ajuda recebida da colega AnaCatacombs, pois sem sua infinita paciência e apoio provavelmente esse trabalho não seria concluído (e nem iniciado).

