1

我编写了以下代码来查找两个邮政地址之间的相似性

    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, Kolkata1/3, City Mall, Jessore Road, Near Dak Banglow More, Barasat, Kolkata - 700124 之间的相似度 为 0.6488,但它们根本不一样.

所以我问是否有人可以提出更好的方法来做同样的事情。谢谢你。

4

2 回答 2

2

地址上的代币比较不会给你很好的结果,因为地址的组成部分具有不同的重要性。例如,街道名称的相似性并不重要,除非城市名称也匹配。

要做好地址比较,需要尝试解析出地址的层次性——街道、城市、州、国家等,并以层次的方式比较地址。

如果您不想为此付出努力,您可以通过消除“停用词”来改善您的结果。例如,“street”、“road”等词经常出现,并且不是很好的鉴别器——它们使地址看起来比实际更相似。

于 2013-02-20T18:38:25.400 回答
1

我认为 kc2001 是正确的:您需要将地址解析为单独的字段。看起来Gisgraphy有一个适用于印度地址的解析器。

如果您还可以将地址地理编码为纬度/经度坐标,这也很有帮助,因为有时可以用多个地址描述同一个地方。从描述看来,Gisgraphy 也可以做到这一点。

然而,解析地址只是第一步。之后你需要比较它们,我发现你需要一个非常精细的比较器才能让它工作。例如,Ekdalia Road 9/18 与 Ekdalia Road 382/21 是完全不同的地方,即使字符串非常相似。通过对街道地址和高于字母的加权数字使用加权 Levenshtein 比较,我得到了很好的结果。

我编写了一个名为Duke的重复数据删除工具,它可以让您通过使用加权 Levenshtein 和其他比较器分别比较字段来比较解析的地址,然后将各个字段的结果组合成一个相似度值。我已经成功地使用它对客户数据和酒店数据进行了重复数据删除,等等。

您需要对其进行一些配置和调整,但这应该比自己做这一切要容易得多。

于 2013-03-02T09:38:41.777 回答