我编写了以下代码来查找两个邮政地址之间的相似性
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,但它们根本不一样.
所以我问是否有人可以提出更好的方法来做同样的事情。谢谢你。