21.11.2014

Расстояние Левенштейна - что это и как использовать.

Расстояние Левенштейна между двумя строками - это минимальное количество операций вставки одного символа, удаления одного символа и замены одного символа на другой, необходимых для превращения одной строки в другую [Википедия]. Например, есть строки:

"text" и "text!"

Для того чтобы первую строку превратить во вторую, нужно добавить к ней символ "!", и наоборот - для того чтобы превратить вторую в первую - нужно удалить из нее восклицательный знак. Иными словами, нужно выполнить одну операцию. Это значение и называют расстоянием Левенштейна. Зачем используется такое понятие? Расстояние Левенштейна имеет множество практических применений. Например - различные утилиты, которые предназначены для мержа файлов исходного кода, утилита для сравнения текстов diff в Linux, нестрогое сравнение текстов - когда нужно "примерно" сравнить две порции текстовых данных, и прочее.

Готовые реализации.

В качестве примера и старта, для практического использования, приведу две библиотеки, с помощью которых можно рассчитать значения расстояния Левинштейна для двух текстов (строк). Первая библиотека, которая предназначена для сравнения текстовых данных, и кстати пригодна не только для вышеуказанной цели, это - google-diff-match-patch. Отличительной особенностью этой библиотеки является то, что она реализована на разных языках, имея при этом единообразный API.  Среди языков, которые поддерживаются - Java, JavaScript, Python, C++, CSharp, Lua, Objective-C, Dart.

Вот пример метода, который возвращает расстояние Левенштейна, используя google-diff-match-patch (пример на Java): 

public int getLevinshteinDistance(final String string1, 
                                  final String string2) { 
            
      diff_match_patch dmp = new diff_match_patch();
      LinkedList<diff_match_patch.Diff> diffs = 
      dmp.diff_main(string1, string2);

      return dmp.diff_levenshtein(diffs);
}

Вторая библиотека подойдет если вы испльзуете Java. Это Apache Commons. Здесь все еще проще:

    
StringUtils.getLevenshteinDistance(string1, string2);

Если ваш проект собирается с помощью Maven, для включения необходимой зависимости, добавьте в pom.xml:

<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>

 



Теги: algorithms academic programming

comments powered by Disqus