[R-es] Optimización identificación de casos similares

Carlos Ortega co| @end|ng |rom qu@||tyexce||ence@e@
Vie Feb 8 00:48:41 CET 2019


Hola,

Puedes hacerlo de otras formas sin que tengas que calcular una matriz de
distancias.

Calcular la matriz de distancias de todos con todos, te lleva a tener una
matriz de 1e5 x 1e5 de enteros (en el mejor de los casos) y esos son ya
varias decenas de gigas.
Una alternativa es esta:

   - Calcular la distancia de Levenstein entre un DNI y la lista de DNIs.
   - Del resultado ver si hay alguna distancia de "1" ó de "2"  que
   indicaría un error a la hora de introducir el valor. Si aparece lo guardas.
   - Y repetir este cálculo con otro DNI y así sucesivamente.
   - En este escenario, solo haces una comparación en cada ciclo, no
   consumes RAM. Solo consumes la RAM con los DNIs que vas guardando.
   - Aquí, lo que ocurre es que el proceso es lento en ejecución.
      - He probado comparando siempre el mismo DNI con una lista (siempre
      la misma lista), que ordeno de forma aleatoria en cada ciclo.
      - Y en mi máquina tarda 20min en hacer 25000 comparaciones.
      - Y no he parelizado el bucle. Este problema es totalmente
      paralelizable...

Este es el código que he usado para hacer este ejemplo (sin paralelizar):

#-------------
library(stringdist)

a <- "123456789"
b <- "1234056789"
c <- as.character(sample(1:1e5, 1e5, replace = FALSE))

a <- Sys.time()
for( i in 1:1000) {

   to_compare <- sample(c(b,c), 1e5+1, replace = FALSE)
   res_compa <- stringdist(a, to_compare, method="dl")
   to_compare[ res_compa < 2]

}
b <- Sys.time() ; b -
#-------------

Saludos,
Carlos Ortega
www.qualityexcellence.es


El jue., 7 feb. 2019 a las 17:24, David Contreras (<
davidcontreras00 using gmail.com>) escribió:

> Buen día a todos,
>
> Agradezco su ayuda con lo siguiente:
>
> Tengo 100.000 registros con nombres de personas con su respectivo número de
> documento, quiero identificar casos que tengan un porcentaje de igualdad
> alto, no del 100% porque ya esos los tengo identificados, sino casos como
> por ejemplo:
>
> Nombre: Juan Pérez  Documento: 123456789
> Nombre: Juan Pérez  Documento: 1234056789
>
> Este caso sería una alerta de posible duplicado y tendría que revisarse
> porque posiblemente en uno de los dos casos se ingreso errado el número de
> documento.
>
> Para calcular esta diferencia uso la función adist del paquete (utils), el
> problema es que la forma en que tengo el código para revisar los 100.000
> casos, la máquina no lo soporta por los recorridos que se hacen:
>
> *El dataframe se llama Citacion.*
>
> *Citacion[,"NombreDoc"]<- paste0(Citacion[,"NOMBRE"]," ",
> Citacion[,"DOCUMENTO"]) # Concatena Nombre y documento*
>
> *Citacion[,"RNomDoc1"]<-0*
> *Citacion[,"RNomDoc2"]<-0*
>
> *ii<-1*
> *for(ii in 1:(nrow(Citacion)-1)){*
> *  jj<-ii+1*
> *  while(jj<=nrow(Citacion)){*
>
> *    if (adist(Citacion[ii,"NombreDoc"],
> Citacion[jj,"NombreDoc"])/nchar(Citacion[ii,"NombreDoc"])<0.15){  #
> Criterio para marcar los posibles casos duplicados*
> *      Citacion[ii,"RNomDoc1"]<-1*
> *      Citacion[jj,"RNomDoc2"]<-1*
> *      jj<-jj+1*
> *      } else {*
> *        Citacion[jj,"RNomDoc2"]<-0*
> *        jj<-jj+1*
> *        } *
> *  } *
>
> *}  *
>
> La idea es optimizar el código de alguna forma para agilizar el proceso y
> lograr que se identifiquen los casos a revisar.
>
> Mil gracias de nuevo.
>
>         [[alternative HTML version deleted]]
>
> _______________________________________________
> R-help-es mailing list
> R-help-es using r-project.org
> https://stat.ethz.ch/mailman/listinfo/r-help-es
>


-- 
Saludos,
Carlos Ortega
www.qualityexcellence.es

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es