我想知道如何匹配邮政地址,因为它们的格式不同或者其中一个地址拼写错误。
到目前为止,我已经找到了不同的解决方案,但我认为它们很老,而且效率不高。我确信存在一些更好的方法,所以如果你有参考资料供我阅读,我相信这是一个可能让一些人感兴趣的主题。
我找到的解决方案(例子在R中):
Levenshtein距离,等于您必须插入,删除或更改以将一个单词转换为另一个单词的字符数。
agrep("acusait", c("accusait", "abusait"), max = 2, value = TRUE)
## [1] "accusait" "abusait"
音素的比较
library(RecordLinkage)
soundex(x<-c('accusait','acusait','abusait'))
## [1] "A223" "A223" "A123"
使用拼写纠正器(eventually a bayesian one like Peter Norvig's),但我认为地址效率不高。
我想使用Google建议的建议,但同样地,它在个人邮政地址上效率不高。
你可以想象使用机器学习监督的方法,但你需要存储用户的错误请求,这对我来说不是一个选择。
答案 0 :(得分:2)
我将此视为拼写纠正问题,您需要在某种词典中找到最接近的匹配词。 我所说的“近”是Levenshtein距离,除了最小数量的单字符插入,删除和替换限制太多。 其他类型的“拼写错误”也是可能的,例如转置两个字符。
我已经做了几次,但最近没有。 最近的病例与临床试验的伴随药物有关。 你会惊奇地发现拼错“acetylsalicylic”有多少种方法。
Here is an outline in C++ of how it is done.
简单地说,字典存储为trie,并且您会看到一个可能拼写错误的单词,您尝试在该单词中查找。 在搜索时,您可以按原样尝试单词,并尝试在每个点上对单词进行所有可能的更改。 当你走的时候,你有一个整数预算你可以容忍的改变方式,你每次进行改动都会减少。 如果您用尽预算,则不允许进一步更改。
现在有一个顶级循环,您可以在其中调用搜索。 在第一次迭代中,您以预算0调用它。 当预算为0时,它将不允许任何更改,因此它只是直接查找。 如果找不到预算为0的单词,则以预算1再次调用它,这样就可以进行一次更改。 如果失败,请尝试2的预算,依此类推。
我没有尝试过的是一个部分预算。 例如,假设一个典型的改变将预算减少2而不是1,预算变为0,2,4等。 然后一些改变可以被认为是“更便宜”。例如,元音替换可能只会将预算减少1,因此对于一个辅音替换的成本,您可以进行两次元音替换。
如果单词没有拼写错误,则所需的时间与单词中的字母数成正比。 一般来说,所需的时间是单词中改变次数的指数。
如果你在R中工作(就像我在上面的例子中那样),我会让它调用C ++程序,因为你需要为此编译语言的速度。
答案 1 :(得分:0)
扩展Mike所说的内容,并使用R中的字符串匹配库stringdist来匹配ARCGIS地理编码功能中出错的地址向量:
rows<-length(unmatched$addresses)
#vector to put our matched addresses in
matched_add<-rep(NA, rows)
score<-rep(NA, rows)
#for instructional purposes only, you should use sapply to apply functions to vectors
for (u in c(1:rows)){
#gives you the position of the closest match in an address vector
pos<-amatch(unmatched$address[u],index$address, maxDist = Inf)
matched_add[u]<-index$address[pos]
#stringsim here will give you the score to go back and adjust your
#parameters
score[u]<-stringsim(unmatched$address[u],index$address[pos])
}
Stringdist有几种方法可用于查找近似匹配,包括Levenshtein(method =&#34; lv&#34;)。您可能希望修改这些内容以适应您的数据集。