Codificação fonética
Autor: Roberto Mucke
Codificação Fonética.
ou o nome próprio como chave de acesso.
Não é raro encontrarmos um analista tentando achar uma forma confiável de acesso a um cadastro qualquer, usando apenas um nome de pessoa como chave, sem que dependa de um tradicional número que a identifique – RG, CPF. Os problemas que ele enfrenta não são simples:
- A escrita do nome deve ser exatamente igual como foi feita quando no cadastramento: MARIA TEREZA#MARIA TERESA (homófonos);
- Existem homônimos e por isso a chave não é única, o que torna necessário que dados complementares sejam incorporados a chave de sucesso;
- Se o sistema for em micro, o arquivo de índices pode se tornar muito grande, a menos que trabalhe apenas parte do nome para diminuir o tamanho.
Uma forma de viabilizar a pesquisa por nome, embora ainda não ideal, é através da “ fonetização”, que consiste na geração de um código através da análise dos sons produzidos pelo conjunto de sílabas e letras contido no nome. Este código deve ser incluído no registro e servirá como argumento de pesquisa, transparente ao usuário.
Os algoritmos de codificação fonética visam basicamente:
* Identificar palavras com pequenas diferenças entre si;
* Eliminar erros de escrita;
* Comprimir dados.
Então, com estes algoritmos teríamos TOSHIKAZU = TOCHICAZO, MAYRHOFER = MAIRROFER, KRAWUTSCHKE = CRAVUSQUE, eliminando a necessidade de conhecermos o nome precisamente. Bastaria que digitássemos algo “mais ou menos” parecido.
As rotinas fonéticas trabalham com comparações de grupo de letras que produzem o mesmo som, substituindo-as por uma letra padrão. CK, KC, AM, ÃO, ÕES são substituídas por M se estão no final do nome e assim por diante. Geralmente as rotinas eliminam os conectivos como “DA”, “DE”, “DOS”,”VON” e muitas eliminam também as palavras relativas a descendência como “FILHO”, “JUNIOR”, “PRIMO”.
Uma vez que temos o código fonético, podemos variar de seleção de registros: podemos obter todos os elementos pertencentes a mesma classe de equivalência, os elementos de total coincidência de códigos ou ainda os elementos de que tenham grau de associação entre códigos (para encontrarmos equivalências como ELENI – HELENA – HELIO – HELINTON – ELTON). Através da relação de itens que satisfizeram a condição de pesquisa, o usuário pode fazer o acesso desejado pela análise dos dados complementares como data de nascimento, profissão, etc.
O maior problema das rotinas de codificação fonética é a existência das diferentes línguas onde uma determinada grafia tem fonemas diferentes dependendo da língua em que a pronunciamos. Por exemplo: PUCCI = PUSSI em português ou = PUTI em italiano, Assim sendo a implementação da codificação fonética fica restrita a uma determinada língua, a menos que o usuário possa esperar um bom tempo para que o nome seja analisado também em outras (e que trabalho de rotina, hein?).
Na Celepar nós temos duas rotinas para geração de código fonético: a CEL1FON1 para nomes próprios e a CEL1FON2 para nomes de empresas Também está em fase de testes na equipe DITEC-L uma rotina desenvolvida pela CONSIST. Esta última, além de gerar o código fonético, também dá os programas para a seleção de registros. É o TRS – TEXT RETRIEVAL SYSTEM.
Para os micros o Clipper possui a função Soundex que gera um código de 4 bytes. É um código compacto mas esta função possui a inconveniência de ter sido desenvolvida para a língua inglesa.
Como não conhecia outras rotinas desenvolvidas para micro achei que seria interessante termos uma. A CEL1FON1 retorna um código com tamanho total de 6 bytes, o que é uma vantagem para micros pois não resulta num arquivo de índice grande. Assim, com esta rotina no mainframe, eu trabalhei uma semelhante para micro. Basicamente ela retorna um código de 2 bytes para cada partícula (palavra) do nome, num máximo de 3 códigos por nome completo. Se o nome tiver mais de 3 partículas ela retorna o código fonético para a primeira, a segunda e última partícula do nome. A rotina foi desenvolvida em ASSEMBLY do 8088 e pode ser chamada pelo CLIPPER ou pelo COBOL. Ela pode ser melhorada se incluirmos novas comparações fonéticas dadas por trabalho desenvolvidos na PRODESP, contidas nos anais da SUCESU.
Em Cliper a chamada é feita por função:
sCodFon = UDFFon(sNome, nTam onde:
sNome:variável numérica, contendo o tamanho do campo sNome.
O código é retornado na variável string sCodFon
Em Cobol, a chamada fica assim:
CALL “COBFON”USINGsNome nTamsCodFon, onde:
sNome:variável PIC X de até 60 bytes, contendo o nome a ser codificado;
nTam: variável numérica, contendo o tamanho do campo sNome, PIC S9(005) COMP-0;
sCodFon:variável onde será retornado o código gerado, PICX(006).
Se nenhum código for gerado, por problema nos parâmetros por exemplo, o retorno será zeros binários.
A rotina deve estar presente numa biblioteca (.LIB) na hora da linkedição do programa. Se for usado o COBOL.EXE através do MAKERUN.
Informações mais completas sobre o funcionamento desta rotina pode ser obtidas no manual de softwares de uso geral, na parte de descrição da CEL1FON1. Os procedimentos são os mesmos.
Bem enquanto não temos ainda uma rotina fonética perfeita, o analista pode usar as que existem e ir aperfeiçoando-as a medida que o tempo de uso e a experiência vão ganhando peso. Será que o usuário vai gostar?
Codificação Fonética.
ou o nome próprio como chave de acesso.
Não é raro encontrarmos um analista tentando achar uma forma confiável de acesso a um cadastro qualquer, usando apenas um nome de pessoa como chave, sem que dependa de um tradicional número que a identifique – RG, CPF. Os problemas que ele enfrenta não são simples:
- A escrita do nome deve ser exatamente igual como foi feita quando no cadastramento: MARIA TEREZA#MARIA TERESA (homófonos);
- Existem homônimos e por isso a chave não é única, o que torna necessário que dados complementares sejam incorporados a chave de sucesso;
- Se o sistema for em micro, o arquivo de índices pode se tornar muito grande, a menos que trabalhe apenas parte do nome para diminuir o tamanho.
Uma forma de viabilizar a pesquisa por nome, embora ainda não ideal, é através da “ fonetização”, que consiste na geração de um código através da análise dos sons produzidos pelo conjunto de sílabas e letras contido no nome. Este código deve ser incluído no registro e servirá como argumento de pesquisa, transparente ao usuário.
Os algoritmos de codificação fonética visam basicamente:
* Identificar palavras com pequenas diferenças entre si;
* Eliminar erros de escrita;
* Comprimir dados.
Então, com estes algoritmos teríamos TOSHIKAZU = TOCHICAZO, MAYRHOFER = MAIRROFER, KRAWUTSCHKE = CRAVUSQUE, eliminando a necessidade de conhecermos o nome precisamente. Bastaria que digitássemos algo “mais ou menos” parecido.
As rotinas fonéticas trabalham com comparações de grupo de letras que produzem o mesmo som, substituindo-as por uma letra padrão. CK, KC, AM, ÃO, ÕES são substituídas por M se estão no final do nome e assim por diante. Geralmente as rotinas eliminam os conectivos como “DA”, “DE”, “DOS”,”VON” e muitas eliminam também as palavras relativas a descendência como “FILHO”, “JUNIOR”, “PRIMO”.
Uma vez que temos o código fonético, podemos variar de seleção de registros: podemos obter todos os elementos pertencentes a mesma classe de equivalência, os elementos de total coincidência de códigos ou ainda os elementos de que tenham grau de associação entre códigos (para encontrarmos equivalências como ELENI – HELENA – HELIO – HELINTON – ELTON). Através da relação de itens que satisfizeram a condição de pesquisa, o usuário pode fazer o acesso desejado pela análise dos dados complementares como data de nascimento, profissão, etc.
O maior problema das rotinas de codificação fonética é a existência das diferentes línguas onde uma determinada grafia tem fonemas diferentes dependendo da língua em que a pronunciamos. Por exemplo: PUCCI = PUSSI em português ou = PUTI em italiano, Assim sendo a implementação da codificação fonética fica restrita a uma determinada língua, a menos que o usuário possa esperar um bom tempo para que o nome seja analisado também em outras (e que trabalho de rotina, hein?).
Na Celepar nós temos duas rotinas para geração de código fonético: a CEL1FON1 para nomes próprios e a CEL1FON2 para nomes de empresas Também está em fase de testes na equipe DITEC-L uma rotina desenvolvida pela CONSIST. Esta última, além de gerar o código fonético, também dá os programas para a seleção de registros. É o TRS – TEXT RETRIEVAL SYSTEM.
Para os micros o Clipper possui a função Soundex que gera um código de 4 bytes. É um código compacto mas esta função possui a inconveniência de ter sido desenvolvida para a língua inglesa.
Como não conhecia outras rotinas desenvolvidas para micro achei que seria interessante termos uma. A CEL1FON1 retorna um código com tamanho total de 6 bytes, o que é uma vantagem para micros pois não resulta num arquivo de índice grande. Assim, com esta rotina no mainframe, eu trabalhei uma semelhante para micro. Basicamente ela retorna um código de 2 bytes para cada partícula (palavra) do nome, num máximo de 3 códigos por nome completo. Se o nome tiver mais de 3 partículas ela retorna o código fonético para a primeira, a segunda e última partícula do nome. A rotina foi desenvolvida em ASSEMBLY do 8088 e pode ser chamada pelo CLIPPER ou pelo COBOL. Ela pode ser melhorada se incluirmos novas comparações fonéticas dadas por trabalho desenvolvidos na PRODESP, contidas nos anais da SUCESU.
Em Cliper a chamada é feita por função:
sCodFon = UDFFon(sNome, nTam onde:
sNome:variável numérica, contendo o tamanho do campo sNome.
O código é retornado na variável string sCodFon
Em Cobol, a chamada fica assim:
CALL “COBFON”USINGsNome nTamsCodFon, onde:
sNome:variável PIC X de até 60 bytes, contendo o nome a ser codificado;
nTam: variável numérica, contendo o tamanho do campo sNome, PIC S9(005) COMP-0;
sCodFon:variável onde será retornado o código gerado, PICX(006).
Se nenhum código for gerado, por problema nos parâmetros por exemplo, o retorno será zeros binários.
A rotina deve estar presente numa biblioteca (.LIB) na hora da linkedição do programa. Se for usado o COBOL.EXE através do MAKERUN.
Informações mais completas sobre o funcionamento desta rotina pode ser obtidas no manual de softwares de uso geral, na parte de descrição da CEL1FON1. Os procedimentos são os mesmos.
Bem enquanto não temos ainda uma rotina fonética perfeita, o analista pode usar as que existem e ir aperfeiçoando-as a medida que o tempo de uso e a experiência vão ganhando peso. Será que o usuário vai gostar?