Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да стандартизираме множество стойности на колона?

Вашият въпрос е наистина неточен. Моля, следвайте предложенията на @RiggsFolly и прочетете препратките за това как да зададете добър въпрос.

Освен това, както предлага @DuduMarkovitz, трябва да започнете с опростяване на проблема и почистване на вашите данни. Няколко ресурса, за да започнете:

След като сте доволни от резултатите, можете да продължите да идентифицирате група за всяка Var1 запис (това ще ви помогне по-нататък да извършите по-нататъшен анализ/манипулации на подобни записи) Това може да се направи по много различни начини, но както е споменато от @GordonLinoff, единият вероятно е разстоянието на Levenshtein.

Забележка :за 50K записи резултатът няма да е 100% точен, тъй като няма винаги категоризирайте термините в подходящата група, но това трябва значително да намали ръчните усилия.

В R можете да направите това с помощта на adist()

Използвайки вашите примерни данни:

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

За тази малка извадка можете да видите 3-те отделни групи (клъстерите с ниски стойности на разстоянието на Левенщайн) и можете лесно да ги присвоите ръчно, но за по-големи групи вероятно ще ви е необходим алгоритъм за групиране.

Вече ви посочих в коментарите към един от моите предишен отговор показва как да направите това с помощта на hclust() и метода на минималната вариация на Ward, но мисля, че тук ще е по-добре да използвате други техники (един от любимите ми ресурси по темата за бърз преглед на някои от най-широко използваните методи в R е този подробен отговор )

Ето пример за използване на клъстериране на афинитетно разпространение:

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

Ще намерите в обекта APResult d_ap елементите, свързани с всеки клъстер и оптималния брой клъстери, в този случай: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 

Можете също да видите визуално представяне:

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

След това можете да извършите допълнителни манипулации за всяка група. Като пример тук използвам hunspell за търсене на всяка отделна дума от Var1 в en_US речник за правописни грешки и се опитайте да намерите във всяка group , който id няма правописни грешки (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))

Което дава:

#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

Забележка :Тук, тъй като не сме извършили обработка на текст, резултатите не са много убедителни, но схващате идеята.

Данни

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Урок за MySQL – Управление на регистрационни файлове на MySQL сървър:завъртане, компресиране, запазване и изтриване

  2. Проверете две дата не е между две друга дата + MYSQl

  3. Библиотеките на MySQL и MariaDB в C++, използвайки cmake, mingw

  4. MySQL - присъединяване въз основа на дата

  5. MySQL позволява ли обратни извиквания в C, така че когато се случи промяна, мога да бъда уведомен?