ここにアイデアがあります。それは手作業のビットを含むが、それは良い出発点かもしれない。まず、番地に着目せずにadist()
(またはstringdist()
とデータに最もよく適合するmethod
)を使用して、住所間のおおよその文字列の距離を計算します。この場合
m <- adist(v)
rownames(m) <- v
> m
# [,1] [,2] [,3] [,4] [,5] [,6] [,7]
#5 James Street 0 2 3 1 4 17 17
#5 Jmaes Street 2 0 4 3 6 17 17
#5#Jam#es Str$eet 3 4 0 4 6 17 17
#6 James Street 1 3 4 0 4 17 17
#James Street 5 4 6 6 4 0 16 17
#10a Cold Winter Road 17 17 17 17 16 0 1
#10b Cold Winter Road 17 17 17 17 17 1 0
、我々は明らかに二つのクラスタを識別することができますが、我々はまた、樹状図を視覚化するためにhclust()
を使用することができます。
cl <- hclust(as.dist(m))
plot(cl)
rect.hclust(cl, 2)
その後、我々はそれらを反復処理し、通りの番号を一致させるためにチェックし、それにそれぞれの道をタグ付け類似のクラスタ対応です。
与え
library(dplyr)
res <- data.frame(cluster = cutree(cl, 2)) %>%
tibble::rownames_to_column("address") %>%
mutate(
# Extract all components of the address
lst = stringi::stri_extract_all_words(address),
# Identify the component containing the street number and return it
num = purrr::map_chr(lst, .f = ~ grep("\\d+", .x, value = TRUE))) %>%
# For each cluster, tag matching street numbers
mutate(group = group_indices_(., .dots = c("cluster", "num")))
:
# address cluster lst num group
#1 5 James Street 1 5, James, Street 5 1
#2 5 Jmaes Street 1 5, Jmaes, Street 5 1
#3 5#Jam#es Str$eet 1 5, Jam, es, Str, eet 5 1
#4 6 James Street 1 6, James, Street 6 2
#5 James Street 5 1 James, Street, 5 5 1
#6 10a Cold Winter Road 2 10a, Cold, Winter, Road 10a 3
#7 10b Cold Winter Road 2 10b, Cold, Winter, Road 10b 4
をあなたは可能性があり、その後distinct()
を使用してgroup
に基づいてpull()
固有のアドレス:
> distinct(res, group, .keep_all = TRUE) %>% pull(address)
#[1] "5 James Street" "6 James Street" "10a Cold Winter Road"
# "10b Cold Winter Road"
データ
v <- c("5 James Street", "5 Jmaes Street", "5#Jam#es Str$eet", "6 James Street",
"James Street 5", "10a Cold Winter Road", "10b Cold Winter Road")
このプロジェクトでジオコーディングAPIを試したことがありますか? –
@AndrewBrēzaご提案いただきありがとうございます。私はこれについて考えましたが、APIが拾わないと書かれているかもしれないアドレスとまだ一致したいと思っていました。たとえば、*** "5#Jam#es Str $ eet" ***はまだ一致しています。 –
Google Maps APIでは、スペルミスの可能性がある場所名を認識できるはずです。 Google Mapsで5#Jam#es Str $ eetを検索すると、正しい場所が結果に表示されます。 –