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 en 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
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
documento.
Para calcular esta diferencia uso la función adist del paquete (utils),
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]]