我有一个电子邮件列表,我正在尝试查找“相似”的电子邮件。
例如:
DanB@gmail.com
DanB1@gmail.com
Dan12B@yahoo.com
对我来说将是“相似的”。
如果您熟悉可以在此处应用的方法,我将很高兴听到。
PS 我可用的工具是 Teradata (SQL) 或 R。
先感谢您
我有一个电子邮件列表,我正在尝试查找“相似”的电子邮件。
例如:
DanB@gmail.com
DanB1@gmail.com
Dan12B@yahoo.com
对我来说将是“相似的”。
如果您熟悉可以在此处应用的方法,我将很高兴听到。
PS 我可用的工具是 Teradata (SQL) 或 R。
先感谢您
由于您的问题非常庞大,并且没有人会为您完成这项工作,因此这是您的起点,至少可以让您了解各种字符串比较算法的工作原理:
library(stringdist)
library(stringi)
library(purrr)
emails <- c("ed@microsoft.com", "DanB@gmail.com", "DanB1@gmail.com", "Dan12B@yahoo.com",
"fred@outlook.com", "bill@juno.com", "Danb21@aol.com", "ed@tumblr.com")
naive_regex <- stri_match_all_regex(emails, "([[:print:]]+)@(.*)")
addressees <- map_chr(naive_regex, 2)
methods <- c("osa", "lv", "dl", "hamming", "lcs", "qgram", "cosine", "jaccard", "jw", "soundex")
map(seq_along(addressees), function(i) {
map_df(methods, function(method) {
c(addressees[i] ,method, stringdist(addressees[i], addressees, method=method)) %>%
as.list() %>%
setNames(c("looking_for", "method", addressees))
})
})
输出太长,无法放在这里,但它是一个比较矩阵列表,如下所示:
## [[2]]
## # A tibble: 10 × 9
## looking_for method ed DanB DanB1 Dan12B fred bill Danb21
## <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
## 1 DanB osa 4 0 1 2 4 4 3
## 2 DanB lv 4 0 1 2 4 4 3
## 3 DanB dl 4 0 1 2 4 4 3
## 4 DanB hamming Inf 0 Inf Inf 4 4 Inf
## 5 DanB lcs 6 0 1 2 8 8 4
## 6 DanB qgram 6 0 1 2 8 8 4
## 7 DanB cosine 1 0 0.105572809000084 0.183503419072274 1 1 0.387627564304205
## 8 DanB jaccard 1 0 0.2 0.333333333333333 1 1 0.571428571428571
## 9 DanB jw 1 0 0.0666666666666668 0.111111111111111 1 1 0.25
## 10 DanB soundex 1 0 0 0 1 1 0
一旦您了解了可接受的公差,您就可以创建一个算法来匹配 => 删除 / 匹配 => 删除等。