[R-br] SoundexBR

Daniel Marcelino dmarcelino em live.com
Domingo Março 17 15:24:45 BRT 2013


Fátima, dá pra fazer isso, só não sei ainda se incorporando uma
solução ad-hoc é a melhor coisa a ser feita na função original.
Preciso pensar um pouco mais sobre as implicações dessa alteração para
as bases de dados que a função foi inicialmente implementada.
Uma forma de você resolver isso "bypass" é passando o comando abaixo
nas variáveis que contêm  nomes antes de aplicar o soundex. Por
exemplo:

nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT"))

nomea$nome2<- gsub('[^A-z]', '', nomea$nome)

> nomea
     nome   nome2
1   GER?D    GERD
2 HARTMUT HARTMUT
3    RALF    RALF
4  STEFAN  STEFAN
5  ROBERT  ROBERT

> soundexBR(nomea$nome)
[1] "J-6?3" "A-635" "R-410" "S-315" "R-163"

> soundexBR(nomea$nome2)
[1] "J-630" "A-635" "R-410" "S-315" "R-163"
>

Fátima, o problema é que se o erro de entrada de dados estiver na
primeira letra do nome, e se o caracter errado estiver ocupando o
lugar de uma letra (por ex. % ao invés de H), a string gerada ficará
incorreta. Isso pode ser um problema. A solução que eu te passei
apenas retira os caracteres estranhos dos nomes, mas não "advinha"
qual letra deveria estar no lugar, percebe?
A boa notícia é que se sua base de dados tiver muitos erros de
entrada, nada te garante também que um nome, aparentemente correto,
digo, com apenas letras (Naria ao invés de Maria), não esteja sendo
codificado de forma errada ("N-600", "M-600").

Daniel

2013/3/17 Fátima Lima Paula <fatima.lima.paula em gmail.com>:
> Olá Daniel Marcelino, precisaria de uma ajuda sua no soundex.
> Verifiquei que erros de digitação não são captados pelo SoundexBR.
> Exemplo:
> ?MARIA e MARIA, PE8DRO e PEDRO.
> Será que seria tranquilo para você implementar algumas coisas?
> Estou enviando um script que fiz com teste para alguns caracteres.
> Desde já muito obrigada.
> Abs
> Fátima
> soundexBR<-function(termo){
> termo<-toupper(termo)
> # 1. Retire toda pontuação da palavra;
> termo<-gsub("[ÃÁÀÂÄ]","A",termo)
> termo<-gsub("[ÉÈÊ?Ë]","E",termo)
> termo<-gsub("[ÍÌÏÎI]","I",termo)
> termo<-gsub("[ÓÕÒÔÖ]","O",termo)
> termo<-gsub("[ÚÙÛÜU]","U",termo)
> termo<-gsub("Ç","C",termo)
> #1.a Substituir todas as letras duplas por uma única letra
> #http://www.archives.gov/genealogy/census/soundex.html
> termo<-gsub("([A-Z])\\1", "\\1", termo)
> # 2. Fique com a primeira letra;
> N<-nchar(termo)
> # Modificação PT-BR (Coeli e Camargo)
> termo<-ifelse(substr(termo,1,2)=="WA",sub("W","V",termo),termo)
> termo<-ifelse(substr(termo,1,1)=="H",substr(termo,2,N),termo)
> termo<-ifelse(substr(termo,1,2)=="KA"|substr(termo,1,2)=="KO"|substr(termo,1,2)=="KU",sub("K","C",termo),termo)
> termo<-ifelse(substr(termo,1,1)=="Y",sub("Y","I",termo),termo)
> termo<-ifelse(substr(termo,1,2)=="CE"|substr(termo,1,2)=="CI",sub("C","S",termo),termo)
> termo<-ifelse(substr(termo,1,2)=="GE"|substr(termo,1,2)=="GI",sub("G","J",termo),termo)
> ############## Segunda Parte #######################
> termo.1<-substr(termo,1,1)
> termo<-substr(termo,2,N)
> # 3. Mude todas as ocorrências das letras a seguir por '0' (zero):
> 'A','E','I','O','U','H','W','Y';
> termo<-gsub("[A,E,I,O,U,H,W,Y]",0,termo)
> # 4. Mude as letras restantes de acordo com a tabela abaixo:
> # Número Letra
> # 1 'B','F','P','V'
> termo<-gsub("[B,F,P,V]",1,termo)
> # 2 'C','G','J','K', 'Q','S','X','Z'
> termo<-gsub("[C,G,J,K,Q,S,X,Z]",2,termo)
> # 3 'D','T'
> termo<-gsub("[D,T]",3,termo)
> # 4 'L'
> termo<-gsub("L",4,termo)
> # 5 'M','N'
> termo<-gsub("[M,N]",5,termo)
> # 6 'R'
> termo<-gsub("R",6,termo)
> # 5. Remova todos os zeros da string resultante;
> termo<-gsub(0,"",termo)
> # Eliminar dois numeros iguais consecutivos por um único numero
> #http://www.archives.gov/genealogy/census/soundex.html
> termo<-gsub("([0-9])\\1", "\\1", termo)
> # Remontar
> termo<-paste(termo.1,termo,sep="")
>
> # 6. Preencha a string resultante com zeros à direita e retorne desta forma:
> #<letra maiuscula><digito><digito><digito>
> termo<-paste(termo,"0000",sep="")
> termo<-substr(termo,1,4)
> return(termo)
> }
>
> soundexBR("termo")
> soundexBR("terno")
>
> nomea=data.frame(nome=c("GER?D","HARTMUT","RALF","STEFAN","ROBERT"))
> nomea
> nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF"))
> nomeb
> fonoa=soundexBR(nomea$nome)
> fonob=soundexBR(nomeb$nome)
> library(RecordLinkage)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Ponto de interrogação
> nomea=data.frame(nome=c("GER?D","HARTMUT","?RALF","STEFAN","ROBERT"))
> nomea
> nomeb=data.frame(nome=c("HARTMUT?","GERD","ROBERT","STEFAN","RALF"))
> nomeb
> fonoa=soundexBR(nomea$nome)
> fonob=soundexBR(nomeb$nome)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Não funciona com o ? no início
> ###############################################################################
> #Barras inclinadas /
> nomea=data.frame(nome=c("GER/D","/HARTMUT","RALF/","STEFAN","ROBERT"))
> nomea
> nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF"))
> nomeb
> fonoa=soundexBR(nomea$nome)
> fonob=soundexBR(nomeb$nome)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Não funciona com a barra inclinada
> #Barras inclinadas \
> nomea=data.frame(nome=c("GER\D","\HARTMUT","RALF\","STEFAN","ROBERT"))
> nomea
> #O R rejeita a \
> #Parênteses (
> nomea=data.frame(nome=c("GER(D","(HARTMUT","RALF(","STEFA)N","ROBERT)"))
> nomea
> nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF"))
> nomeb
> fonoa=soundexBR(nomea$nome)
> fonob=soundexBR(nomeb$nome)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Só funciona com o parênteses depois do nome
> #Dois pontos e ponto e vírgula
> nomea=data.frame(nome=c("GER:D",":HARTMUT","RALF:","STEFA;N","ROBERT;"))
> nomea
> nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF"))
> fonob=soundexBR(nomeb$nome)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Só funciona com o : e ; depois do nome
> #Dólar e ponto
> nomea=data.frame(nome=c("GER$D","%HARTMUT","RALF%","STEFA.N","ROBERT."))
> nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF"))
> nomeb
> fonoa=soundexBR(nomea$nome)
> fonob=soundexBR(nomeb$nome)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Idem
> #Números
> nomea=data.frame(nome=c("GER1D","2HARTMUT","RALF3","S4TEFA.N","RO5BERT6"))
> nomea
> nomeb=data.frame(nome=c("HARTMUT","GERD","ROBERT","STEFAN","RALF"))
> nomeb
> fonoa=soundexBR(nomea$nome)
> fonob=soundexBR(nomeb$nome)
> pairs.mat = outer(fonoa,fonob, "==")
> pairs.mat
> #Não funciona com números
>
>
> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça código
> mínimo reproduzível.



-- 
\begin{signature}
Daniel Marcelino
☁ dm.silva em umontreal.ca
☎ (514) 343 6111 #3799
Skype: d.marcelino
✎ 3200 Jean Brillant,  Office C5071
Montreal, QC; H3T 1N8
Canada
\end{signature}

"Small steps toward a much better world"


Mais detalhes sobre a lista de discussão R-br