Mysql
 sql >> Database >  >> RDS >> Mysql

Come standardizzare più valori di colonna?

La tua domanda è davvero impreciso. Per favore, segui i suggerimenti di @RiggsFolly e leggi i riferimenti su come porre una buona domanda.

Inoltre, come suggerito da @DuduMarkovitz, dovresti iniziare semplificando il problema e pulendo i tuoi dati. Alcune risorse per iniziare:

Una volta che sei soddisfatto dei risultati, puoi quindi procedere all'identificazione di un gruppo per ogni Var1 entry (questo ti aiuterà lungo la strada per eseguire ulteriori analisi/manipolazioni su voci simili) Questo potrebbe essere fatto in molti modi diversi ma, come menzionato da @GordonLinoff, una delle possibilità è la distanza di Levenshtein.

Nota :per 50.000 voci, il risultato non sarà accurato al 100% in quanto non sarà sempre classificare i termini nel gruppo appropriato, ma ciò dovrebbe ridurre notevolmente gli sforzi manuali.

In R, puoi farlo usando adist()

Utilizzando i tuoi dati di esempio:

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

Per questo piccolo campione, puoi vedere i 3 gruppi distinti (i gruppi di valori di distanza di Levensthein bassi) e puoi facilmente assegnarli manualmente, ma per insiemi più grandi, probabilmente avrai bisogno di un algoritmo di raggruppamento.

Ti ho già indicato nei commenti uno dei miei risposta precedente mostrando come farlo usando hclust() e il metodo della varianza minima di Ward, ma penso che qui faresti meglio a usare altre tecniche (una delle mie risorse preferite sull'argomento per una rapida panoramica di alcuni dei metodi più utilizzati in R è questo risposta dettagliata )

Ecco un esempio che utilizza il clustering di propagazione di affinità:

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

Troverai nell'oggetto APResult d_ap gli elementi associati a ciascun cluster e il numero ottimale di cluster, in questo 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 

Puoi anche vedere una rappresentazione visiva:

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

Quindi, puoi eseguire ulteriori manipolazioni per ciascun gruppo. Ad esempio, qui uso hunspell per cercare ogni parola separata da Var1 in un dizionario en_US per errori di ortografia e prova a trovare, all'interno di ogni group , quale id non ha errori di ortografia (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))

Che dà:

#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 :Qui poiché non abbiamo eseguito alcuna elaborazione del testo, i risultati non sono molto conclusivi, ma ti fai un'idea.

Dati

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" 
)