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

Eric er|cconch@munoz @end|ng |rom gm@||@com
Vie Feb 8 01:10:06 CET 2019


No he mirado el codigo ni los datos, pero en estos asuntos de 
comparación la teoría dice que se ahorra tiempo si antes de comparar 
ordenas la columna de mayor a menor por ejemplo .... en ese caso, más 
allá de cierta distancia no vale la pena seguir comparando porque los 
números ya serán todos diferentes al que tomaste para comparar ... ahí 
te ahorras comparaciones ... y te puedes ahorrar algunas más ya que el 
número que tomas para comparar con los demás ya sabes si es igual o no a 
los anteriores que ya comparaste con él, de modo que no tienes que 
volver a compararlo ... me explico ?

Creo que esas dos ideas reducirán mucho la cantidad de comparaciones que 
debes hacer ... si alcanzo mañana podría probar algo y comentarte.

Suerte !!!!

Eric.



On 07/02/2019 20:48, Carlos Ortega wrote:
> 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
>>
>



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