Каждый из нас из школы помнит определение Евклидова расстояния между двумя точками на плоскости. С помощью расстояния Евклида можно вычислить расстояние между двумя точками на карте, например, между вашим местоположением и станцией метро. Но для пешехода в Нью-Йорке расстояние между двумя точками в городе будет отличаться от расстояния Евклида между двумя точками из-за невозможности передвигаться иначе, как по проезжим улицам, пересекающимся под прямыми углами. Такое расстояние так и называется: "расстояние городских кварталов" или манхэттенское расстояние. При любом способе расстояние характеризует меру близости точек. В сегодняшней статье мы расскажем о способах вычисления расстояния между двумя словами.

Расстояние между двумя точками p_1=(x_1,y_1)и p_2=(x_2,y_2)в городе можно вычислить различными способами (см. примеры на рис. 1). В случае отсутствия препятствий оно может быть оценено евклидовым расстоянием, вычисленным как  d_E(p_1, p_2) =\sqrt{(x_1-x_2)^2+(y_1-y_2)^2} (красный отрезок на рис. 1). Из-за городской застройки для пешехода логично использовать манхэттенское расстояние, вычисляемое как d_M(p_1, p_2) = |x_1 - x_2| + |y_1 - y_2|(черная траектория на рис. 1). А для автомобилиста расстояние, оцененное одометром, может отличаться и от Евклидова, и от манхэттенского расстояния (фиолетовая ломаная на рис. 1). То есть для автомобилиста расстояние между двумя точками в городе может отличаться и от евклидова, и от манхэттенского расстояния.

Рис. 1 – Примеры евклидово (красный), манхэттенского (черный) и расстояние по одометру (фиолетовое)
Рис. 1 – Примеры евклидово (красный), манхэттенского (черный) и расстояние по одометру (фиолетовое)

Расстояние как мера близости вычисляется не только для точек на плоскости или точек n-мерного пространства, но и для объектов различной природы. Например, может быть вычислено расстояние между графиками функций или расстояние между распределениями случайных величин. Известно большое число различных расстояний, но для решения новых задач мы можем сами придумывать новые расстояния. Расстояние или метрика d между двумя объектами должно быть неотрицательной функцией двух аргументов, которая удовлетворяет 3-м аксиомам:

  • аксиома тождества: d(A,A)=0

  • аксиома симметрии: d(A,B)=d(B,A)

  • неравенство треугольника: d(A, B) + d(B, C) \ge d(A, C)

Иногда функции, для которых выполняются только две первые аксиомы и не выполняется неравенство треугольника, также называют метриками, хотя логичнее название – симметрика. Использование симметрики затрудняет решение некоторых математических задач, однако для некоторых алгоритмов годятся как метрики, так и симметрики. Если вы придумаете функцию для измерения расстояния, которая не является симметричной f(A,B)\neq f(B,A), то можно использовать функцию f(A,B)+F(B,A), которая является симметричной. Если же придуманная функция не удовлетворяет аксиоме тождества или не является неотрицательной, то для практических целей лучше поискать другую функцию.

В качестве объектов могут выступать слова (строки) или последовательности символов. Так же, как и расстояние между двумя точками на плоскости, расстояние между двумя словами может вычисляться различными способами. Простым способом является расстояние Хэмминга между словами одинаковой длины – это количество позиций, в которых соответствующие символы слова отличаются.

Мы будем рассматривать задачу отождествления слов при анализе распознанных образов документов. Известно много задач анализа текстовых документов. К ним относятся: классификация документов, извлечение данных, анализ тональности и другие. Решение таких задач может основываться на словах. Если мы заранее создали словари – наборы слов, каждое из которых может быть снабжено дополнительными признаками, мы можем попробовать найти эти слова в анализируемом тексте. Некоторые слова будет найдены однозначно, некоторые слова найдены не будут, а для некоторых слов найдётся несколько совпадений. Термин "найдены" означает, что для слова из словаря V=\{v_1, v_2, ..., v_m\} и слова текста W=\{w_1, w_2, ..., w_n\} мы можем сказать, что эти слова тождественны. Простейшее отождествление состоит в проверке совпадения всех символов, то есть m=n и v_i=w_i  \  \ \forall i.Такое отождествление будет работать, если анализируемый текст не содержит ошибок или число ошибок (опечаток) мало.

При анализе распознанных документов мы не можем считать, что число ошибок ничтожно мало. Несмотря на совершенство современных OCR в зашумленных текстах (см. рис. 2) возможно появление ошибок. Для отождествления слов с ошибками нужно использовать другой способ сравнения слов. Этот способ должен позволять отождествлять не только одинаковые слова, но и слова, находящиеся на некотором заранее заданном расстоянии друг от друга.

Рис. 2 – Примеры зашумленного текста
Рис. 2 – Примеры зашумленного текста

Нам необходим способ сравнения словарного слова (слова модели) V=\{v_1, v_2, ..., v_m\}и распознанного слова W=\{w_1, w_2, ..., w_n\}, учитывающий возможные ошибки в распознанных словах и возможное сходство слов модели

Для сравнения словарного и распознанного слов мы будем использовать популярное расстояние Левенштейна (редакционное расстояние), основанное на редакционных операциях вставки, удаления и замены символа. Расстояние было описано Владимиром Левенштейном для бинарных последовательностей ещё в 1960 году. Известны различные алгоритмы вычисления расстояния Левенштейна, позволяющие найти как число операций для нахождения редакционного предписания, так и последовательность операций. Оригинальное расстояние Левенштейна между двумя текстовыми строками Vи Wопределяется как минимальное число редакционных операций для трансформации Vв W. Оригинальное расстояние Левенштейна вычисляется следующим образом:

d_{LEV}(V, W) = M_{LEV}(|V|, |W|),\\\forall j \ M_{LEV}(0,j)=0, \forall i \ M_{LEV}(i,0)=0,\\M_{LEV}(i,j)=min\{M_{LEV}(i,j-1)+1,M_{LEV}(i-1,j)+1,\\M_{LEV}(i-1,j-1)+substCost(v_i,w_i)\},

где substCost(v_i, w_i) – цена операции замены символа v_iна символ w_i, а |V| и  |W| – длины слов V и W. По умолчанию цена любой из редакционных операций равняется 1.

Мы будем считать тождественными слова V и W если d_{LEV}(V, W)<d(V), где d(V) – известный заранее порог для словарного слова. При распознавании программами OCR зашумленных, осветленных или искаженных образов документов появляются неединичные ошибки распознавания в словах W. Поэтому порог  d(V) не может быть равным не только 0, но и другому небольшому числу. Очевидно, что порог d(V) должен быть различным для слов различной длины. Для слова с длиной, равной 1 , порог d(V) должен быть равен 0, но для длинных слов порог d(V) может быть достаточно большим. Для учета этого обстоятельства можно использовать нормализованное расстояние Левенштейна:

\rho_{LEV}(V,W)=\frac{2\cdot d_{LEV}(V,W)}{|V|+|W|+d_{LEV}(V,W)}.

Некоторые ошибки OCR не являются случайными. Ошибочное распознавание образа символа "Х" как символа "О" маловероятно. В то же время образ символа "Ъ" может быть ошибочно распознан как символ "Ь" из-за сходства образов "Ъ" и "Ь". Примерами сходных образов для латинского алфавита являются пары символов “B8”, “DO”, “1I”. То есть, некоторые ошибки распознавания символов случаются чаще, чем другие. Поэтому можно уточнить штрафы за несовпадение символов, заданные с помощью функции substCost(v_i, w_i). Для этого нужно построить substCost(v_i, w_i) так, чтобы при вычислении расстояния Левенштейна штраф за сходные символы был меньше, чем за символы несходные. Выберем такую функцию для цены операции замены символа, чтобы для одинаковых символов она была равна нулю, для различных несходных символов - равна 1.0, а для сходных же символов была невелика. Описанная модификация позволяет уменьшить расстояние, вычисляемое для слов с ошибками в виде сходных символов. Например, если при стандартной цене операции сравнения d_{LEV}(`СЪЁМ`, `СЬЕМ`) = 2, то при substCost(`Ъ`, `Ь`)=substCost(`Ё`, `Е`)=0.2 получаем d_{LEV}(`СЪЁМ`, `СЬЕМ`) = 0.4

Также при отождествлении различающихся слов необходимо учесть ещё одну особенность: некоторые слова в статическом тексте похожи друг на друга. Рассмотрим несколько слов, расстояние Левенштейна между которыми является небольшим:

d_{LEV}(`АДРЕС`,`АНДРЕЙ`) = 2,\\d_{LEV}(`ТФ-3201-302`, `ТФ-3201-301`) = 1.

Эти близкие слова, размещенные в тексте документа отождествлять нежелательно. Например, ключевое слово АДРЕС из статического текста не должно отождествляться со словом АНДРЕЙ из заполнения поля документа. Идентификаторы TF-3201-302 и TF-3201-301 сходны, но различие в один символ как раз и является признаком того, что идентификаторы различным.

На вопрос из заголовка статьи мы можем дать чёткий ответ: расстояние между словами "Будапештом" и "Бухарестом" равняется 3 при использовании расстояния Левенштейна или расстояния Хэмминга. Нормализованное расстояние Левенштейна между слова "Будапештом" и "Бухарестом" равняется 0.26.

Но можем ли мы отождествить слова "Будапештом" и "Бухарестом"? Такое решение может быть принято только в контексте конкретной задачи. Если мы извлекаем реквизит "место рождения", то отождествить нельзя. Если же мы ищем слово "Будапештом" в некотором документе, в котором появление слова "Бухарестом" маловероятно, то отождествить можно.

Пример сходства слов "Будапештом" и "Бухарестом" является умозрительным, а в реальных документах часто различать следующие слова из статического текста: "КРЕДИТНОЙ" и "КРЕДИТНОГО", "ВЫДАН" и "ВЫДАЧИ", "СЕРИЯ" и "СЕРИЯ,№" и т.д.

В таких словах большая часть символов совпадает, а различие наблюдается в небольшом числе символов, размещенных в определенном месте, часто в суффиксе или окончании строки. Отождествление будет ложным, если требуется различать эти слова.

Для исключения рассмотренных случаев ложного отождествления предлагается применять шаблоны словарных слов следующего вида:

G(V) = b_1 b_2…b_k * m_1 m_2… m_p * e_1 e_2…e_q.

В этих шаблонах заданы обязательные символы в начале, в середине или в конце слова, а знак*означает последовательность произвольных символов. Если при сравнении символы распознанного слова не удовлетворяют шаблону, то расстояние Левенштейна увеличивается на заданный заранее штраф. Эта модификация позволяет увеличить расстояние между словами, различающимися незначительным числом символов, которые являются признаками для различия слов.

Применение описанных модификаций превращает расстояние Левенштейна в новое расстояние между словарным словом V и распознанным словом W:

Sim(V,W)=d_{LEV}(V,W)-f(G(V),W),

где f(G(V), W) – штраф за несоответствие распознанного слова W, вычисленный с помощью шаблона G(V) словарного слова V. При этом может применяться функция цены операции замены символа, учитывающая ошибки распознавания для сходных символов. Если штраф отсутствует и сходных символов нет, то Sim(V, W) совпадает с расстоянием Левенштейна d_{LEV}(V, W). Расстояние Sim(V, W) также может быть нормализовано аналогично ρ_{LEV }(V,W).

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

Расстояние Левенштейна является адекватным способом сравнить два слова. Мы рассказали о модификации расстояния Левенштейна для отождествления распознанных слов документа и слов из модели (словаря). Существует возможность придумать и другие функции для сравнения слов. Если придумаете, то напишите статью и расскажите об особенностях вашей метрики!

Комментарии (6)


  1. sepetov
    28.06.2023 07:47

    Хорошо получилось! Как-то тоже пришлось дорабатывать алгоритм Левенштейна под свои нужды. Причина была такая же - алгоритм хорошо сравнивает два отдельных слова, а вот два предложения - уже не очень. Кратко о том, к чему я пришёл в тот раз:

    • в сравниваемых текстах идентичные слова исключались из сравнения

    • оставшиеся слова перед сравнением сортировались по алфавиту, так как порядок слов не был важен в моей предметной области

    • полученное расстояние нормировалось на исходную длину строк, включая исключённые на первом этапе слова

    Что интересно, в комментариях отметился ещё один разработчик, который в той же предметной области решал похожую проблему и тоже использовал расстояние Левенштейна.


    1. SmartEngines Автор
      28.06.2023 07:47

      Добрый день! Благодарим!

      Было бы интересно узнать, какую задачу анализа текстов Вы решали? Предложения уже были выделены или извлекались динамически?

      В некоторых задачах мы ищем n-граммы (n – от 2-х до 5-ти) в строке с удаленными пробелами. Наш опыт показывает, что без штрафов f(G(V), W) здесь не обойтись.


      1. sepetov
        28.06.2023 07:47
        +1

        Проблема была такая: оптимизировать размещение товаров на складе.

        Один из критериев оптимальности - размещение в одной ячейке товаров с непохожими названиями. В противном случае встречается такая ситуация:

        • сборщику товара приказали собрать 14 упаковок 5-мл. шприцов по 10 шт. от производителя ООО "АБВГД".

        • он подходит к нужной ячейке, а там десятки разновидностей в общем-то одинаковых шприцов: есть 5 мл по 10 шт, но другой производитель, есть тот же производитель, но 10 мл. по 5 штук и т. п.

        • сборщик путается, берёт не тот товар, в итоге это оборачивалось штрафом для него и недовольством для клиента

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


        1. SmartEngines Автор
          28.06.2023 07:47

          Спасибо! Интересная задача.


  1. tenzink
    28.06.2023 07:47

    Я как-то давно занимался совоставлением распознанного текста с текстом из pdf. Из pdf текст иногда достаётся странно. Например, могут потеряться все пробелы, или жирный шрифт моделируется тем, что буква удваивается-утраивается, бывают проблемы с "кракозябрами" и ещё всякое разное. Помню, что приходилось дополнительно настраивать штрафы для удаления/вставки (у вас они = 1). Например, удаление пробельных символов штрафовать слабее. Потом нужно восстановить набор операций, соответствующие минимальному расстоянию. Таких наборов может быть несколько и выбирался "наилучший". Вот здесь и были самые большие проблемы, так как наборов операций с одним и тем же штрафом могло быть много и не все они были хорошими по другим соображениям.


    1. SmartEngines Автор
      28.06.2023 07:47

      Приветствуем! Спасибо за ваш комментарий!

      Ваш опыт сопоставления слов распознанного текста с текстом из pdf очень интересен! Было бы интересным почитать или провести эксперименты, связанные с тем, что слова модель тоже могут содержать ошибки.

      У нас цена удаления/вставки равна 1, поскольку удаление/вставка символа в распознанном слове чаще проявляется из-за ошибок распознавания нескольких подряд  идущих символов. То есть не было необходимости особым образом реагировать на такие ошибки.

      В статье не рассмотрены ошибки поиска слов: когда слово при распознавании разбито на части (лишние пробелы) или когда объединились несколько слов (потеря пробела). Кстати, такие случаи возможны не только из-за распознавания, иногда в деловых документах между словом статического текста и словом заполнения в самом деле отсутствует пробел.