Я написал этот следующий фрагмент кода для нахождения сходства между двумя почтовыми адресамиFinding Сходства между адресами
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, Калькутта и 1/3, City Mall, Jessore Road, Near Дак Banglow Больше, Барасат, Калькутта - 700124 является как 0.6488, но они совсем не такие.
Так что я спрашиваю, может ли кто-нибудь предложить лучший подход для этого. Спасибо.
Что делает метод 'findSimilarity (...)'? Возможно, разместите код для нас, поскольку я предполагаю, что там происходят важные вычисления. – Trent
Метод findSimilarity() вычисляет расстояние редактирования между двумя строками и делит его на длину большей строки, а затем вычитает из 1. – Joy