sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo estandarizar múltiples valores de columna?

Tu pregunta es realmente impreciso. Siga las sugerencias de @RiggsFolly y lea las referencias sobre cómo hacer una buena pregunta.

Además, como sugiere @DuduMarkovitz, debe comenzar simplificando el problema y limpiando sus datos. Algunos recursos para empezar:

Una vez que esté satisfecho con los resultados, puede proceder a identificar un grupo para cada Var1 entrada (esto lo ayudará en el camino para realizar más análisis / manipulaciones en entradas similares) Esto podría hacerse de muchas maneras diferentes, pero según lo mencionado por @GordonLinoff, una posiblemente sea la Distancia de Levenshtein.

Nota :para 50 000 entradas, el resultado no será 100 % preciso, ya que no siempre categorizar los términos en el grupo apropiado, pero esto debería reducir considerablemente los esfuerzos manuales.

En R, podría hacer esto usando adist()

Usando sus datos de ejemplo:

d <- adist(df$Var1)
# add rownames (this will prove useful later on)
rownames(d) <- df$Var1

> d
#                  [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#125 Hollywood St.    0    1    1   16   15   16   15   15   15    15
#125 Hllywood St.     1    0    2   15   14   15   15   14   14    14
#125 Hollywood St     1    2    0   15   15   15   14   14   15    15
#Target Store        16   15   15    0    2    1    2   10   10     9
#Trget Stre          15   14   15    2    0    3    4    9   10     8
#Target. Store       16   15   15    1    3    0    3   11   11    10
#T argetStore        15   15   14    2    4    3    0   10   11     9
#Walmart             15   14   14   10    9   11   10    0    5     2
#Walmart Inc.        15   14   15   10   10   11   11    5    0     6
#Wal marte           15   14   15    9    8   10    9    2    6     0

Para esta pequeña muestra, puede ver los 3 grupos distintos (los grupos de valores bajos de distancia de Levensthein) y podría asignarlos fácilmente de forma manual, pero para conjuntos más grandes, es probable que necesite un algoritmo de agrupación.

Ya te señalé en los comentarios uno de mis respuesta anterior mostrando cómo hacer esto usando hclust() y el método de variación mínima de Ward, pero creo que aquí sería mejor usar otras técnicas (uno de mis recursos favoritos sobre el tema para obtener una descripción general rápida de algunos de los métodos más utilizados en R es este respuesta detallada )

Aquí hay un ejemplo que usa el agrupamiento de propagación de afinidad:

library(apcluster)
d_ap <- apcluster(negDistMat(r = 1), d)

Encontrará en el objeto APResult d_ap los elementos asociados a cada clúster y el número óptimo de clústeres, en este caso:3.

> [email protected]
#[[1]]
#125 Hollywood St.  125 Hllywood St.  125 Hollywood St 
#                1                 2                 3 
#
#[[2]]
# Target Store    Trget Stre Target. Store  T argetStore 
#            4             5             6             7 
#
#[[3]]
#     Walmart Walmart Inc.    Wal marte 
#           8            9           10 

También puede ver una representación visual:

> heatmap(d_ap, margins = c(10, 10))

Luego, puede realizar más manipulaciones para cada grupo. Como ejemplo, aquí uso hunspell para buscar cada palabra separada de Var1 en un diccionario en_US en busca de errores ortográficos e intente encontrar, dentro de cada group , cuyo id no tiene errores ortográficos (potential_id )

library(dplyr)
library(tidyr)
library(hunspell)

tibble(Var1 = sapply([email protected], names)) %>%
  unnest(.id = "group") %>%
  group_by(group) %>%
  mutate(id = row_number()) %>%
  separate_rows(Var1) %>%
  mutate(check = hunspell_check(Var1)) %>%
  group_by(id, add = TRUE) %>%
  summarise(checked_vars = toString(Var1), 
            result_per_word = toString(check), 
            potential_id = all(check))

Lo que da:

#Source: local data frame [10 x 5]
#Groups: group [?]
#
#   group    id        checked_vars   result_per_word potential_id
#   <int> <int>               <chr>             <chr>        <lgl>
#1      1     1 125, Hollywood, St.  TRUE, TRUE, TRUE         TRUE
#2      1     2  125, Hllywood, St. TRUE, FALSE, TRUE        FALSE
#3      1     3  125, Hollywood, St  TRUE, TRUE, TRUE         TRUE
#4      2     1       Target, Store        TRUE, TRUE         TRUE
#5      2     2         Trget, Stre      FALSE, FALSE        FALSE
#6      2     3      Target., Store        TRUE, TRUE         TRUE
#7      2     4       T, argetStore       TRUE, FALSE        FALSE
#8      3     1             Walmart             FALSE        FALSE
#9      3     2       Walmart, Inc.       FALSE, TRUE        FALSE
#10     3     3          Wal, marte      FALSE, FALSE        FALSE

Nota :Aquí, dado que no hemos realizado ningún procesamiento de texto, los resultados no son muy concluyentes, pero te haces una idea.

Datos

df <- tibble::tribble(
  ~Var1,                   
  "125 Hollywood St.",      
  "125 Hllywood St.",       
  "125 Hollywood St",       
  "Target Store",           
  "Trget Stre",             
  "Target. Store",          
  "T argetStore",           
  "Walmart",                
  "Walmart Inc.",           
  "Wal marte" 
)