Сходство Джаро — Винклера

Эта статья находится на начальном уровне проработки, в одной из её версий выборочно используется текст из источника, распространяемого под свободной лицензией
Материал из энциклопедии Руниверсалис

В области информатики и статистики сходство Джаро — Винклера представляет собой меру схожести строк[en]* для измерения расстояния между двумя последовательностями символов. Это вариант, который в 1999 году предложил Уильям Э. Винклер (William E. Winkler) на основе расстояния Джаро (1989, Мэтью А. Джаро, Matthew A. Jaro). Неформально, расстояние Джаро между двумя словами — это минимальное число односимвольных преобразований, которое необходимо для того, чтобы изменить одно слово в другое.

Чем меньше расстояние Джаро — Винклера [math]\displaystyle{ d_w }[/math] для двух строк, тем больше сходства имеют эти строки друг с другом. Результат нормируется, так что [math]\displaystyle{ d_w=0 }[/math] означает отсутствие сходства, а [math]\displaystyle{ d_w=1 }[/math] — точное совпадение. Сходство Джаро — Винклера равно [math]\displaystyle{ 1-d_w }[/math].

Определение

Расстояние Джаро

Расстояние Джаро [math]\displaystyle{ d_j }[/math] между двумя заданными строками [math]\displaystyle{ s_1 }[/math] и [math]\displaystyle{ s_2 }[/math] это:

[math]\displaystyle{ d_j = \left\{ \begin{array}{l l} 0 & \text{когда }m = 0\\ \frac{1}{3}\left(\frac{m}{|s_1|} + \frac{m}{|s_2|} + \frac{m-t}{m}\right) & \text{в остальных случаях} \end{array} \right. }[/math]

Где:

  • [math]\displaystyle{ |s_i| }[/math] — длина строки [math]\displaystyle{ s_i }[/math];
  • [math]\displaystyle{ m }[/math] — число совпадающих символов (см. ниже);
  • [math]\displaystyle{ t }[/math] — половина числа транспозиций (см. ниже).

Два символа из [math]\displaystyle{ s_1 }[/math] и [math]\displaystyle{ s_2 }[/math] соответственно, считаются совпадающими только если они одинаковы и не дальше, чем [math]\displaystyle{ \left\lfloor\frac{\max(|s_1|,|s_2|)}{2}\right\rfloor-1 }[/math].

Каждый символ строки [math]\displaystyle{ s_1 }[/math] сравнивается со всеми соответствующими ему символами в [math]\displaystyle{ s_2 }[/math]. Количество совпадающих (но отличающихся порядковыми номерами) символов, которое делится на 2, определяет число транспозиций. Например, при сравнении слова CRATE со словом TRACE, только 'R' 'A' и 'Е' являются совпадающими символами, то есть m=3. Хотя 'C' и 'T' появляются в обоих строках, они дальше, чем на 1, то есть floor(5/2)-1=1. Следовательно, t=0 . В сравнении DwAyNE с DuANE соответствующие буквы находятся уже в том же самом порядке D-A-N-E, так что никаких перестановок не требуется.

Расстояние Джаро — Винклера

Расстояние Джаро — Винклера использует коэффициент масштабирования [math]\displaystyle{ p }[/math], что дает более благоприятные рейтинги строкам, которые совпадают друг с другом от начала до определённой длины [math]\displaystyle{ \ell }[/math], которая называется префиксом. Даны две строки [math]\displaystyle{ s_1 }[/math] и [math]\displaystyle{ s_2 }[/math]. Их расстояние Джаро — Винклера [math]\displaystyle{ d_w }[/math] это:

[math]\displaystyle{ d_w = d_j + (\ell p (1 - d_j)) }[/math]

где:

  • [math]\displaystyle{ d_j }[/math] — расстояние Джаро для строк [math]\displaystyle{ s_1 }[/math] и [math]\displaystyle{ s_2 }[/math]
  • [math]\displaystyle{ \ell }[/math] — длина общего префикса от начала строки до максимума 4-х символов
  • [math]\displaystyle{ p }[/math] — постоянный коэффициент масштабирования, использующийся для того, чтобы скорректировать оценку в сторону повышения для выявления наличия общих префиксов. [math]\displaystyle{ p }[/math] не должен превышать 0,25, поскольку в противном случае расстояние может стать больше, чем 1. Стандартное значение этой константы в работе Винклера: [math]\displaystyle{ p = 0.1 }[/math].

Хотя расстояние Джаро-Винклера часто называют метрикой расстояния, это не метрика в математическом смысле этого слова, потому что оно не подчиняется неравенству треугольника . Также расстояние Джаро-Винклера не удовлетворяет аксиоме, которая гласит, что [math]\displaystyle{ d(x,y)=0 \leftrightarrow x = y }[/math][1].

В некоторых реализациях алгоритма расчёта расстояния Джаро — Винклера префиксный бонус [math]\displaystyle{ \ell p (1 - d_j) }[/math] добавляется, только если сравниваемые строки имеют расстояние Джаро выше установленного «порога усиления» [math]\displaystyle{ b_t }[/math]. Порог в реализации Винклера составил 0,7.

[math]\displaystyle{ d_w = \left\{ \begin{array}{l l} d_j & \text{если }d_j \lt b_t\\ d_j + (\ell p (1 - d_j)) & \text{в остальных случаях} \end{array} \right. }[/math]

Примеры

Следует отметить, что написанный Винклером программный код на языке программирования C различается по крайней мере в двух местах от опубликованных работ по метрике Джаро — Винклера. Первое — это его использование таблицы опечаток (adjwt), а второе — это некоторые дополнительные условия для длинных строк.

Пример 1

Даны строки [math]\displaystyle{ s_1 }[/math] MARTHA и [math]\displaystyle{ s_2 }[/math] MARHTA. Представим их пересечение в табличном виде:

M A R T H A
M 1 0 0 0 0 0
A 0 1 0 0 0 0
R 0 0 1 0 0 0
H 0 0 0 0 1 0
T 0 0 0 1 0 0
A 0 0 0 0 0 1

Здесь максимальное расстояние составляет 6/2 — 1 = 2. В желтых ячейках приведенной таблицы указаны единицы, когда символы идентичны (имеется совпадение), и нули в противном случае.

Получается:

  • [math]\displaystyle{ m = 6 }[/math]
  • [math]\displaystyle{ |s_1| = 6 }[/math]
  • [math]\displaystyle{ |s_2| = 6 }[/math]
  • Есть несовпадающие символы T/H и Н/Т, в результате: [math]\displaystyle{ t = \frac{2}{2} = 1 }[/math]

Расстояние Джаро:

[math]\displaystyle{ d_j = \frac{1}{3}\left(\frac{6}{6} + \frac{6}{6} + \frac{6-1}{6}\right) = 0.9(4) }[/math]

Чтобы найти результат Джаро — Винклера с помощью стандартного веса [math]\displaystyle{ p = 0.1 }[/math] мы продолжаем искать:

[math]\displaystyle{ \ell = 3 }[/math]

Таким образом:

[math]\displaystyle{ d_w = 0.9(4) + (3 \cdot 0.1 (1 - 0.9(4))) = 0.96(1) }[/math]

Пример 2

Даны строки [math]\displaystyle{ s_1 }[/math] DWAYNE и [math]\displaystyle{ s_2 }[/math] DUANE. Получается:

  • [math]\displaystyle{ m = 4 }[/math]
  • [math]\displaystyle{ |s_1| = 6 }[/math]
  • [math]\displaystyle{ |s_2| = 5 }[/math]
  • [math]\displaystyle{ t = \frac{2}{2} = 1 }[/math]

Расстояние Джаро:

[math]\displaystyle{ d_j = \frac{1}{3}\left(\frac{4}{6} + \frac{4}{5} + \frac{4-1}{4}\right) = 0.73(8) }[/math]

Чтобы найти результат Джаро-Винклера с помощью стандартного веса [math]\displaystyle{ p = 0.1 }[/math] мы продолжаем искать:

[math]\displaystyle{ \ell = 1 }[/math]

Таким образом:

[math]\displaystyle{ d_w = 0.73(8) + (1 \cdot 0.1 (1 - 0.73(8))) = 0.765 }[/math]

Пример 3

Даны строки [math]\displaystyle{ s_1 }[/math] DIXON и [math]\displaystyle{ s_2 }[/math] DICKSONX. Получается:

D I X O N
D 1 0 0 0 0
I 0 1 0 0 0
C 0 0 0 0 0
K 0 0 0 0 0
S 0 0 0 0 0
O 0 0 0 1 0
N 0 0 0 0 1
X 0 0 0 0 0

Здесь закрашенные клетки — это окно соответствия для каждого символа. Единицы в ячейке указывает на совпадение. Заметим, что два икса (X) не считаются совпавшими, поскольку они находятся за пределами третьего окна совпадения.

  • [math]\displaystyle{ m = 4 }[/math]
  • [math]\displaystyle{ |s_1| = 5 }[/math]
  • [math]\displaystyle{ |s_2| = 8 }[/math]
  • [math]\displaystyle{ t = 0 }[/math]

Расстояние Джаро:

[math]\displaystyle{ d_j = \frac{1}{3}\left(\frac{4}{5} + \frac{4}{8} + \frac{4-0}{4}\right) = 0.7(6) }[/math]

Чтобы найти результат Джаро-Винклера с помощью стандартного веса [math]\displaystyle{ p = 0.1 }[/math] мы продолжаем искать:

[math]\displaystyle{ \ell = 2 }[/math]

Таким образом:

[math]\displaystyle{ d_w = 0.7(6) + (2 \cdot 0.1 (1 - 0.7(6))) = 0.81(3) }[/math]

Отношения с другими метриками изменения расстояния

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

Изменение расстояния обычно определяется как параметризуемая метрика, вычисленная с помощью определённого набора допустимых операций редактирования, и каждой операции присваивается стоимость (возможно, бесконечная). Это является дальнейшим обобщением генетических алгоритмов выравнивания последовательностей, таких, как алгоритм Смита-Ватермана, которые делают стоимость операции зависящей от того, где она применяется.

Практическое применение

  • Алгоритм Джаро-Винклера использовался для обработки результатов переписи населения[2].
  • Алгоритм сравнения строк Джаро — Винклера реализован в СУБД Oracle[3].

Реализации алгоритма на различных языках программирования

Примечания

  1. Record Linkage Algorithms in F# — Extensions to Jaro-Winkler Distance (Part 3). Дата обращения: 21 марта 2017. Архивировано 31 декабря 2019 года.
  2. Алгоритмы приблизительного сравнения текста, часть 2. Дата обращения: 21 марта 2017. Архивировано 22 марта 2017 года.
  3. Database PL/SQL Packages and Types Reference. Дата обращения: 21 марта 2017. Архивировано 12 января 2017 года.
  4. Архивированная копия (недоступная ссылка). Дата обращения: 23 февраля 2011. Архивировано 23 февраля 2011 года.
  5. Distance de jaro-winkler Архивная копия от 22 марта 2017 на Wayback Machine (фр.)
  6. [1] (англ.)

Ссылки