Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie werden mehrere Spaltenwerte standardisiert?

Ihre Frage ist wirklich ungenau. Bitte folgen Sie den Vorschlägen von @RiggsFolly und lesen Sie die Referenzen zum Stellen einer guten Frage.

Außerdem sollten Sie, wie von @DuduMarkovitz vorgeschlagen, damit beginnen, das Problem zu vereinfachen und Ihre Daten zu bereinigen. Ein paar Ressourcen für den Einstieg:

Wenn Sie mit den Ergebnissen zufrieden sind, können Sie damit fortfahren, eine Gruppe für jede Var1 zu identifizieren Eintrag (dies wird Ihnen später helfen, weitere Analysen/Manipulationen an ähnlichen Einträgen durchzuführen) Dies könnte auf viele verschiedene Arten erfolgen, aber wie von @GordonLinoff erwähnt, ist eine Möglichkeit die Levenshtein-Distanz.

Hinweis :Bei 50.000 Einträgen ist das Ergebnis nicht 100 % genau, da dies immer nicht der Fall sein wird kategorisieren Sie die Begriffe in der entsprechenden Gruppe, aber dies sollte den manuellen Aufwand erheblich reduzieren.

In R können Sie dies mit adist()

Unter Verwendung Ihrer Beispieldaten:

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

Für diese kleine Stichprobe können Sie die 3 unterschiedlichen Gruppen (die Cluster mit niedrigen Levensthein-Abstandswerten) sehen und sie leicht manuell zuweisen, aber für größere Sets benötigen Sie wahrscheinlich einen Clustering-Algorithmus.

Ich habe Sie bereits in den Kommentaren auf einen meiner vorherige Antwort zeigt, wie man das mit hclust() macht und die Minimum-Varianz-Methode von Ward, aber ich denke, hier wären Sie besser dran, andere Techniken zu verwenden (eine meiner Lieblingsressourcen zu diesem Thema für einen schnellen Überblick über einige der am häufigsten verwendeten Methoden in R ist diese detaillierte Antwort )

Hier ist ein Beispiel für die Verwendung von Affinity Propagation Clustering:

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

Sie finden im APResult-Objekt d_ap die jedem Cluster zugeordneten Elemente und die optimale Anzahl von Clustern, in diesem Fall: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 

Sie können auch eine visuelle Darstellung sehen:

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

Anschließend können Sie weitere Manipulationen für jede Gruppe vornehmen. Als Beispiel verwende ich hier hunspell um jedes einzelne Wort von Var1 nachzuschlagen Suchen Sie in einem en_US-Wörterbuch nach Rechtschreibfehlern und versuchen Sie, innerhalb jeder Gruppe zu finden , welche id enthält keine Rechtschreibfehler (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))

Was ergibt:

#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

Hinweis :Da wir hier keine Textverarbeitung durchgeführt haben, sind die Ergebnisse nicht sehr aussagekräftig, aber Sie bekommen eine Idee.

Daten

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