2017-07-27 21 views
2

Damerau-Levenshtein距離など、文字タイプに基づいて重みが変化する文字列距離メトリックに重み付けすることは可能ですか?正規表現に基づく文字列距離メトリックの重み付け

私は異なったアドレスのファジーマッチを作成するために見て、数字と文字を重み付けする必要があるのですアドレスとなるようように:

「5ジェームズ・ストリート」「5 Jmaesストリート」と考えられています同じ

"5ジェームズ・ストリート""6ジェームズ・ストリート"異なると考えられています。

私は前にしかし、これは「5A」「図5b」で干潟を欠場する文字列の距離を適用する数字や文字にアドレスを分割すると考えます。順序はデータセット間で一貫していないので、1つのエントリは"James Street 5"である可能性があります。

現在のところ、stringdistパッケージでRを使用していますが、これらに限定されません。

ありがとうございます!

+1

このプロジェクトでジオコーディングAPIを試したことがありますか? –

+0

@AndrewBrēzaご提案いただきありがとうございます。私はこれについて考えましたが、APIが拾わないと書かれているかもしれないアドレスとまだ一致したいと思っていました。たとえば、*** "5#Jam#es Str $ eet" ***はまだ一致しています。 –

+1

Google Maps APIでは、スペルミスの可能性がある場所名を認識できるはずです。 Google Mapsで5#Jam#es Str $ eetを検索すると、正しい場所が結果に表示されます。 –

答えて

0

ここにアイデアがあります。それは手作業のビットを含むが、それは良い出発点かもしれない。まず、番地に着目せずに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) 

enter image description here

その後、我々はそれらを反復処理し、通りの番号を一致させるためにチェックし、それにそれぞれの道をタグ付け類似のクラスタ対応です。

与え
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") 
+1

それは素晴らしい提案です。その使用する大きな基盤。私はadistがいくつかのマッチを欠場するだろうと思っていますが、私はそれらをキャプチャするために文字列distメトリクスを使用することができます!ありがとう! –

関連する問題