[R-br] SoundexBR

Fátima Lima Paula fatima.lima.paula em gmail.com
Domingo Março 17 16:00:09 BRT 2013


Valeu.
Abs

Em 17 de março de 2013 15:43, Daniel Marcelino <dmarcelino em live.com>escreveu:

> Dá pra fazer tudo tranquilamente. Inclusive, se você perceber que há
> muito erro por vício de digitação etc, você pode tentar implementar um
> pequeno dicionário de substituições e passar como função no R.
> Acabei de ver que a solução que eu te passei não corrige as barras
> "\". Para isso você teria que passar essa outra:
>
>
> nomea=data.frame(nome=c("?GER\\D","\\HART$MUT","R%ALF\\","STEFAN8","?ROBERT"))
>
> nomea$nome2<- gsub('[^A-z]', '', nomea$nome)
>
> nomea$nome2<- gsub('[^[:alnum:]]', '', nomea$nome)
>
> > nomea
>        nome   nome2
> 1    GER\\D    GERD
> 2 \\HARTMUT HARTMUT
> 3    RALF\\    RALF
> 4    STEFAN  STEFAN
> 5    ROBERT  ROBERT
>
>
>
> 2013/3/17 Fátima Lima Paula <fatima.lima.paula em gmail.com>:
> > Valeu, Daniel.
> > Acho que, como falei com meus orientadores isso se resolve levanco os
> > nomespara o excel.
> > É que a gente queria ver se daria para fazer no R.
> > Obrigada.
> > Abs
> >
> > Em 17 de março de 2013 15:24, Daniel Marcelino <dmarcelino em live.com>
> > escreveu:
> >
> >> 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"
> >> _______________________________________________
> >> 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.
> >
> >
> >
> > _______________________________________________
> > 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"
> _______________________________________________
> 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.
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20130317/43beeee6/attachment.html>


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