2013-02-13 3 views
1

Я написал этот следующий фрагмент кода для нахождения сходства между двумя почтовыми адресами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, но они совсем не такие.

Так что я спрашиваю, может ли кто-нибудь предложить лучший подход для этого. Спасибо.

+0

Что делает метод 'findSimilarity (...)'? Возможно, разместите код для нас, поскольку я предполагаю, что там происходят важные вычисления. – Trent

+0

Метод findSimilarity() вычисляет расстояние редактирования между двумя строками и делит его на длину большей строки, а затем вычитает из 1. – Joy

ответ

2

Сравнение токенов по адресам не даст вам очень хороших результатов, поскольку компоненты адреса имеют разное значение. Например, сходство названий улиц не имеет большого значения, если названия городов также не совпадают.

Для эффективной сопоставления адресов вам необходимо попытаться проанализировать иерархическую природу адреса - улицы, города, штата, страны и т. Д. И сравнить адреса в иерархическом порядке.

Если вы не хотите идти на это усилие, вы можете улучшить свои результаты, исключив «стоп слова». Например, такие слова, как «улица», «дорога» и т. Д. Часто происходят и не являются хорошими дискриминаторами - они делают адреса, похоже, более похожими на них.

+0

Спасибо, сэр. Можете ли вы предложить мне, есть ли какой-либо инструмент, который сегментирует адреса в таких компонентах, как улица, город, штат, страна и т. Д., Поскольку сама сегментация адресов является довольно сложной задачей, поскольку вам нужно построить большое количество примеров обучения, необходимо построить хорошая модель, которая будет учиться на этих примерах. Я просмотрел документ, связанный с этой сегментацией, но не нашел такого инструмента, который я могу использовать в своей программе для выполнения этой работы. – Joy

+0

Я не знаю ни одного такого инструмента, хотя я бы поспорил, что некоторые существуют. Вы можете попробовать найти код Google для поиска парсера адресов. – kc2001

+0

Я не понимаю, почему вам нужно узнать формат адреса из примеров. Не можете ли вы применить знания, которые у вас уже есть, для анализа адресов? Например, с адресами в США вы можете начать с конца (почтовый индекс), а затем легко определить состояние и город. – kc2001

1

Я думаю, что kc2001 прав: вам нужно разобрать адреса в отдельных полях. Похоже, Gisgraphy имеет парсер, который работает для индийских адресов.

Если вы также можете геокодировать адреса в координатах lat/long, что также помогает много, потому что иногда одно и то же место можно описать несколькими адресами. Из описания, похоже, Gisgraphy тоже может это сделать.

Однако разбор адресов является только первым шагом. После этого вам нужно сравнить их, и я обнаружил, что вам нужен довольно тонко настроенный компаратор, чтобы заставить его работать. Например, 9/18, Экдалия-роуд - совершенно другое место от 382/21, Экдалия-роуд, даже если строки очень похожи. У меня были хорошие результаты при использовании взвешенного сравнения Левенштейна для уличных адресов и весовых цифр выше, чем писем.

Я написал инструмент дедупликации, называемый Duke, который позволит сравнить проанализированные адреса, сравнив поля отдельно с использованием взвешенных Levenshtein и других компараторов, а затем объединить результаты для разных полей в одно значение сходства. Я использовал его для дедупликации данных о клиентах и ​​данных о гостинице, среди прочего.

Вам нужно настроить и настроить его немного, но это должно быть намного проще, чем делать все это самостоятельно.

+0

Хороший материал (+1), larsga. Ваш комментарий о lat/lons («Если вы также можете геокодировать адреса в координатах lat/long, что также помогает много») поднимает самый важный момент - какое сходство/расстояние вы пытаетесь измерить? Если это чисто географическая дистанция, вы можете в значительной степени отказаться от текстового сравнения и подключить адреса к эквиваленту Google Maps для вычисления физического расстояния. – kc2001

+0

Чисто географическое расстояние в моем опыте недостаточно, по трем причинам. В некоторых случаях координаты будут неправильными. Кроме того, разрешение не идеально, поэтому иногда координаты будут на расстоянии 100-300 метров. И, наконец, иногда разные адреса действительно близки друг другу. – larsga

Смежные вопросы