我已经写了下面这段代码来找到两个邮政地址之间的相似性
double similarAddr(String resAddr,String newAddr)
{
String sortedResAddr=asort(resAddr); //asort alphabetically sorts the sentence passed as its parameter
String sortedNewAddr=asort(newAddr);
String[] addrToks=sortedResAddr.split("[ ]+");
String[] newToks=sortedNewAddr.split("[ ]+");
int l1=addrToks.length;
int l2=newToks.length;
double similarity=0.0;
int lengths,lengthl; //lengths is length of shorter string while lengthl is that of longer string
if(l1<l2)
{
lengths=l1;
lengthl=l2;
for(int i=0;i<l1;i++)
{
double max=0.0;
for(int j=i;j<l2;j++)
{
double curr_similarity=findSimilarity(addrToks[i],newToks[j]); //findSimilarity calculates similarity between two string based on their edit distance, it first calculates the edit distance and normalize by dividing it by the longer string length and subtracts it from 1
if(max<curr_similarity)
max=curr_similarity;
}
similarity+=max;
}
}
else
{
lengths=l2;
lengthl=l1;
for(int i=0;i<l2;i++)
{
double max=0.0;
for(int j=i;j<l1;j++)
{
double curr_similarity=findSimilarity(newToks[i],addrToks[j]);
if(max<curr_similarity)
max=curr_similarity;
}
similarity+=max;
}
}
similarity/=lengths;
return similarity;
}
但是通过这种方法,我发现了很多误报。在这里,我将阈值设为0.5,即如果相似度得分高于0.5,则它们可能相似。但是只增加阈值并不能解决我的问题,因为许多不同的地址的相似性得分大约为0.7左右,并且它可能会错过许多非常相似的对,其相似性得分接近约0.6左右。
例如以下两个地址之间的相似性 9/18,Ekdalia Road,Gariahat,Kolkata 和 1/3,City Mall,Jessore Road,Near Dak Banglow More,Barasat,Kolkata - 700124 是0.6488,但它们根本不相同。
所以我问是否有人可以提出更好的方法来做同样的事情。谢谢。
答案 0 :(得分:2)
地址上的令牌比较不会给您带来非常好的结果,因为地址的组件具有不同的重要性。例如,街道名称的相似性并不重要,除非城市名称也匹配。
为了更好地进行地址比较,您需要尝试解析地址的分层性质 - 街道,城市,州,国家等,并以分层方式比较地址。
如果您不想这样做,可以通过消除“停用词”来改善结果。例如,“街道”,“道路”等词语经常出现,并且不是好的辨别者 - 它们使得地址看起来比它们更相似。
答案 1 :(得分:1)
我认为kc2001是对的:您需要将地址解析为单独的字段。看起来Gisgraphy有一个适用于印度地址的解析器。
如果您还可以将地址地理编码为纬度/经度坐标也有很大帮助,因为有时可以用多个地址描述相同的地方。从描述来看,Gisgraphy似乎也能做到这一点。
但是,解析地址只是第一步。在那之后你需要比较它们,我发现你需要一个非常精细的比较器才能使它工作。例如,9/18,Ekdalia Road与Ekdalia Road的382/21完全不同,即使字符串非常相似。我对使用街道地址的加权Levenshtein比较和高于字母的加权数字有很好的结果。
我编写了一个名为Duke的重复数据删除工具,它可以让您通过使用加权Levenshtein和其他比较器分别比较字段来比较解析的地址,然后将各个字段的结果组合成单个相似度值。我已经成功地使用它来重复删除客户数据和酒店数据等。
你需要对它进行一些配置和调整,但这比自己完成所有这些要容易得多。