Algoritmos fonéticos para o português brasileiro

Algoritmos fonéticos para o português brasileiro

5 de agosto de 2018 1 Por Ramos de Souza Janones
Como vender Software - Seja desktop, web ou MobilePowered by Rock Convert
Powered by Rock Convert

Este artigo é apenas uma exploração de uso de algoritmos fonéticos de forma geral para as mais diversas linguagens de programação.

Powered by Rock Convert

PHP do Zero ao ProfissionalPara facilitar a busca de informações comumente grafadas erradas, usamos algoritmos fonéticos. Um recurso que é extremamente útil mas que costuma ser negligenciado, especialmente fora da língua inglesa onde existem alguns algoritmos conhecidos como os citados na Wikipedia(en), particularmente o Soundex disponível em diversos DBs e linguagens.

Temos particularidades na nossa língua que inviabilizam o uso de algoritmos de outras línguas. Na verdade é até mais regionalizado. Um algoritmo que funciona para o Brasil, não funciona para Portugal e talvez para outros países lusófonos. Tenho até dúvidas se precisaria de especializações para o cearensegaúcho ou mesmo para o piracicabano e adjacências (de centenas de quilômetros 🙂 ), só para citar alguns.

  • Existe alguma fonte oficial, um estudo conclusivo de como deveria ser o nosso algoritmo fonético?
  • Baseado nesses estudos ou por experiência, como seria esse algoritmo? Podemos aproveitar alguma variante do SoundexMetaphone ou outro algoritmo consagrado da língua inglesa, só trocando os fonemas?
  • Podemos ou devemos usar (opcionalmente) fonemas estrangeiros comuns também, já que usamos nomes estrangeiros?
  • Estou interessado no algoritmo em si, portanto, como desenvolvê-lo em detalhes (não basta linhas gerais que já tem informação suficiente), um pseudo-código ou código real em alguma linguagem seria útil mas não funadamental.

Já que posso portar código de quase qualquer linguagem mainstream, e de fato eu vou (e outros poderão) usar em algumas linguagens diferentes, não me importa se está em C, C++, C#, Java, Javascript, PHP, Perl, Python, Ruby, Lua, Delphi, Go, D, Scala, F#, ou variantes de BASIC, xBase (Clipper, Harbour, FoxPro), SQL, etc. ou até COBOL :). Use o que já possui ou sinta-se mais confortável.

Curso de PHP ERP com NFe.

Note que o melhor algoritmo é o que vale, não a implementação, por isso não me importa a linguagem. O mesmo algoritmo em linguagem diferente será considerado duplicado.

Algumas referências que eu conheço (algumas são bem ruins):

A ideia por trás do “Metaphone Pt-BR” é justamente a história do sucesso e do uso de algoritmos como o soundex durante os primeiros censos americanos e a melhoria da ideia, no caso, com o surgimento do metaphone.

Treinamento em Machine Learning, Big Data e Analytics com PYTHON, HADOOP, SPARK e APACHE KAFKA! PRESENCIAL e ONLINE!

O nicho desse algoritmo é bem específico. Não se trata de uma representação fonética acurado, seguindo o IPA, mas simplificações das palavras baseado no “soa como …”. O uso, tal como o soundex, foi principalmente no cruzamento de dados textuais e identificações de nomes duplicados grafados incorretamente. A vantagem dele é de conseguir reduzir o esforço computacional necessário para se encontrar uma palavra semelhante a outra usando algoritmos como similar_text() (no PHP), levenshtein, dentre outros.

Como o Metaphone poderia ser útil nesse caso? Algoritmos como similar_text, levenshtein e outros devolvem um índice, normalmente entre 0 e 1, do grau de proximidade entre duas strings, sendo 0 igual a nenhuma semelhança e 1 a semelhança total.

Imagine então para cruzar um banco de dados de milhares de nomes de ruas, cada qual com uma média entre três a quatro palavras, com um nome de rua com mesmo tamanho médio, oriundo de outro banco de dados, que pode ter sido grafado erradamente, ou abreviado, enfim, não exatamente igual ao que você possui, seria necessário verificar a semelhança entre cada palavra e tirar uma média para a rua. Considerando que esses algoritmos de semelhança tem complexidades O(m*n) e O(n^3), então estamos diante de grandes esforços computacionais para encontrar uma única rua.

O metaphone entra nessa parte. Ao simplificar a string, reduzindo-a para um tamanho de até 4 caracteres, torna-se possível criar um “índice” para palavras semelhantes. Por exemplo, REBECA, REBBECA, RABEKA e tantas outras variações partilhariam da mesma string metaphone: RBK. Com isso, posso aplicar o algoritmo levenshtein em um conjunto reduzido (normalmente entre 1 e 2 dezenas) de palavras, reduzindo o esforço computacional necessário.

Naturalmente pode-se ter outras abordagens para se resolver o problema citado, mas o Metaphone é uma delas só exigiria ter no banco de dados uma coluna a mais para servir de índice.

A versão para o português foi feita porque o Metaphone original utiliza as regras gramaticais inglesas, então muitas palavras em português acabam caindo em grupos diferentes porque soariam diferente para um americano.

Quem desenvolve sistemas sabe que normalmente o CPF, por ser único e numérico, é comumente utilizando como chave primária e evitar cadastro duplicados. A saída fonética é uma das abordagens que apareceu no grupo. Com isso, fiz um aprofundamento do algoritmo utilizando uma base de dados montada com nomes de pessoas, 1 milhão de nomes e 220.000 palavras únicas, resultando no estudo acima referido, onde entendo que 4 caracteres são suficientes e quais seriam as regras para o Metaphone Português – Brasileiro. A implementação dessas regras estão no código em C disponível no SourceForge e no JavaScript.

Acredito, até pela data do projeto REDECA, essa seria uma das primeira variantes abertas para o Português Brasileiro do Metaphone, rendendo um artigo científico.

E para acrescentar resposta à pergunta, segue o link do README do código em C que contém as regras de conversão do Metaphone Pt-BR, publicadas em artigo:https://sourceforge.net/p/metaphoneptbr/code/ci/master/tree/README

 » Programação 

Powered by Rock Convert
Siga os bons!
Últimos posts por Ramos de Souza Janones (exibir todos)
vote
Article Rating
LEIA TAMBÉM:  PHP 7: Até 9 Vezes Mais Rápido Que o PHP 5.6