2011-05-18 24 views
26

Tengo un montón de nombres, y quiero obtener los nombres únicos. Sin embargo, debido a errores ortográficos e inconsistencias en los datos, los nombres pueden escribirse incorrectamente. Estoy buscando una forma de verificar un vector de cadenas si dos de ellas son similares.¿Cómo se mide la similitud entre cadenas?

Por ejemplo:

pres <- c(" Obama, B.","Bush, G.W.","Obama, B.H.","Clinton, W.J.") 

Quiero encontrar que " Obama, B." y "Obama, B.H." son muy similares. ¿Hay alguna forma de hacer esto?

Respuesta

29

Esto se puede hacer en función de, por ejemplo, la distancia Levenshtein. Hay múltiples implementaciones de esto en diferentes paquetes. Algunas soluciones y paquetes se pueden encontrar en las respuestas de las siguientes preguntas:

Pero más a menudo agrep va a hacer lo que quiere:

> sapply(pres,agrep,pres) 
$` Obama, B.` 
[1] 1 3 

$`Bush, G.W.` 
[1] 2 

$`Obama, B.H.` 
[1] 1 3 

$`Clinton, W.J.` 
[1] 4 
16

Tal vez agrep es wha t quieres? Busca coincidencias aproximadas usando la distancia de edición de Levenshtein.

lapply(pres, agrep, pres, value = TRUE) 

[[1]] 
[1] " Obama, B." "Obama, B.H." 

[[2]] 
[1] "Bush, G.W." 

[[3]] 
[1] " Obama, B." "Obama, B.H." 

[[4]] 
[1] "Clinton, W.J." 
Cuestiones relacionadas