2014-02-14 4 views
1

Я ищу способ сравнения сходства строк. В частности, учитывая два адреса, я хотел бы оценить их сходство.Статистическое сравнение строк

E.G.

Учитывая 8219 Lime Forest Blvd и 8219 Lime Форст Boulevard

Выход сравнения должны дать мне представление о том, насколько похожи строки.

+2

Вам понадобится гораздо более точное определение «похожих», прежде чем вы сможете реально получить что-нибудь полезное из этого, я думаю ... Как только вы точно знаете, что ищете, есть много хорошо документированных алгоритмов для такого рода вещей ... – twalberg

ответ

4

Расстояние до Левенштейна - путь. Просто из коробки идея - два адреса могут быть разными (можно почтовый код, еще одна улица с номером), и много денег было потрачено на создание потрясающих услуг геокодирования (например, https://developers.google.com/maps/documentation/geocoding/?hl=cs). Таким образом, альтернативный подход состоял бы в том, чтобы вычислить долготу/широту для обоих адресов с помощью службы геокодирования и посмотреть, соответствует ли широта/долгота :)

+0

google упрощает нашу жизнь каждый день ;-) – Leo

+0

@Ondrej Svedjar - Мне нравится идея геокодирования. В настоящее время мы используем службу проверки адресов для получения «нормализованных» адресов, которые мы можем сравнить, но мы сталкиваемся с проблемами, когда служба не будет проверять действительные адреса. В этих сценариях API API-интерфейсов по-прежнему мог найти адрес. – jparram

2

вы могли бы использовать что-то вроде этого

import org.apache.commons.lang.StringUtils; 


public class StringComparison { 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 

     String s1 = "8219 Lime Forest Blvd"; 
     String s2 = "8219 Lime Forst Boulevard"; 

     //number of chars that differ 
     int distance = StringUtils.getLevenshteinDistance(s1, s2); 

     //"relative" difference 
     float d = (float)distance/(float)s1.length(); 

     System.out.println(d); 

    } 

} 

getLevenshteinDistance даст вам ряд символов, которые отличаются от s1 до s2.

Я думаю, что более полезно, если вы разделите это число на длину строки (осторожно с делением на ноль) и попробуйте вручную найти сладкое пятно, где разница достаточно мала, чтобы обнаружить тот же адрес (для меня это как правило, около 20 ~ 30%)

Этот пример в JAVA, либерал используется в http://commons.apache.org/proper/commons-lang/index.html

Кроме того, вы могли бы улучшить это только замена известных сокращений и пытается с ними.

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