Назад в библиотеку

Введение

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

Эта статья посвящена алгоритмам приблизительного сравнения строк текста. Она даёт упрощенное но ясное описание алгоритмов с примерами.

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

Фонетическое кодирование

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

Фонетическое кодирование очень полезно для объединения перечней личных имён или имён предприятий. Оно также используется для опознавания речи и в поисковыых системах баз данных таких как анти-террористических.

Саундэкс

Саундэкс (Soundex) конструирует фонетические коды для личных имён. Результирующий код состоит из одной буквы и трёх цифр, каждая из которых соответствует 6 согласным звукам. Алгоритм впервые был применён в переписи США в 1880 году.

Процедура
  1. Взять первую букву.
  2. Транслировать остальные буквы:
    B, F, P, V → 1
    C, G, J, K, Q, S, X, Z → 2
    D, T → 3
    L → 4
    M, N → 5
    R → 6
  3. Удалить смежные буквы имеющие одинаковый код.
  4. Удалить неначальные A, E, I, O, U, Y, W и H.
  5. Взять первые 4 буквы заполняя справа нулями.
Примеры
  1. ALEXANDRE → A4E2A536E → A4E2A536E → A42536 → A425.
  2. ALEKSANDER → A4E22A53E6 → A4E2A53E6 → A42536 → A425.

Саундэкс Дэйча-Мокотоффа

В 1985 году новый алгоритм Саундэкс Дэйча-Мокотоффа (Daitch-Mokotoff Soundex) было применён для фонетического кодирования фамилий славянских и идиш с похожим произношением но разным написанием. Наиболее важные улучшения по сравнению с Саундэкс: более длинный код - 6 символов; производятся два разных кода когда возможны два разных произношения; кодирование использует 10 цифр от 0 к 9.

Система идентификации и сведений штата Нью-Йорк

Система идентификации и сведений штата Нью-Йорк (NYSIIS - New York State Identification and Intelligence System) была разработана в 1970 году посредством строгого эпирического анализа. В этом алгоритме конструируется фонетический код до 6 букв.

Процедура
  1. Транслировать первые буквы имени:
    MAC → MCC
    PH → FF
    KN → NN
    PF → FF
    K → C
    SCH → SSS
  2. Транслировать последние буквы имени:
    EE → Y
    IE → Y
    DT, RT, RD, NT, ND → D
  3. Транслировать остальные буквы по правилами, букву за буквой:
    EV → AF; иначе E, I, O, U → A
    Q → G
    Z → S
    M → N
    KN → N; иначе K → C
    SCH → SSS
    PH → FF
    H → предыдущая буква, если предыдущая или последующая - не гласная
    W → предыдущая буква, если предыдущая - гласная
  4. Проверить последнюю букву:
    если последняя буква - S, удалить её
    если последние буквы - AY, заменить на Y
    если последняя буква - A, удалить её
  5. Удалить вторую из двойных букв.
  6. Взять первые шесть букв.
Примеры
  1. ALEXANDRE → ALAXANDRA → ALAXANDR → ALAXANDR → ALAXAN
  2. ALEKSANDER → ALACSANDAR → ALACSANDAR → ALACSANDAR → ALACSA

Метафон

Алгоритм Метафон (Metaphone) фонетически кодирует слова путем уменьшения их до 16 согласных звуков: B, X, S, K, J, T, F, H, L, M, N, P, R, 0, W, Y. Ноль представляет звук "th"; X представляет "sh".

Процедура
  1. Удалить вторую из двойных букв, за исключением C.
  2. Если слово начинается с KN, GN, PN, AE, WR, удалить первую букву.
  3. Удалить B в конце слова после M.
  4. C → X в CIA или CH; C → S в CI, CE или CY; C → K в противном случае.
  5. D → J в DGE, DGY или DGI; D → T в противном случае.
  6. Удалить G в GH и если не в конце или перед гласным в GN или GNED; G → J перед I или E или Y если не двойная GG; G → K в противном случае.
  7. Удалить H после гласной и если следующая буква не гласная.
  8. Удалить K после C.
  9. P → F в PH.
  10. Q → K.
  11. S → X в SH или SIO или SIA.
  12. T → X в TIA или TIO; T → 0 в TH; T удаляется в TCH.
  13. V → F.
  14. Если слово начинается с WH, удалить H; удалить W если следующая буква не гласная.
  15. Если слово начинается с X, тогда X → S; X → KS в противном случае.
  16. Удалить Y если следующая буква не гласная.
  17. Z → S.
  18. Гласные сохраняются только когда они находятся в начале слова.
  19. Во всех остальных случаях буквы не меняются.
Примеры
  1. ALEXANDRE → ALEKSANTRE → ALKSNTR
  2. ALEKSANDER → ALEKSANTER → ALKSNTR

Двойной метафон

Двойной метафон (Double metaphone) - улучшенный вариант Метафона. Этот алгоритм фонетически кодирует слова путем уменьшения их до 12 согласных звуков. Оно возвращает два кода если слово имеет два возможных произношения.

Метрика похожести

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

Многие из этих процедур вычисляют сходство двух строк как число между 0 и 1. Величина 0 означает, что строки полностью различны. Величина 1 означает совершенное совпадение строк. Промежуточные значения соответствуют частичному совпадению.

Алгоритмы метрик похожести полезны для проверки орфографии, для опознавания речи, для анализа ДНК, для обнаружения плагиата, для нахождения разницы между файлами и для дистанционного обновления дисплея.

Дистанция Хэмминга

Для двух строк одинаковой длины, дистанция Хэмминга (Hamming distance) - количество мест, в которых строки имеют разные символы.

Примеры
  1. Дистанция Хэмминга от ALEXANDRE до ALEKSANDR: 6 (ALE совпадает, остальные 6 символов различны).

Дистанция редактирования

Дистанция редактирования (edit distance) между двумя строками определяется как минимальное число вставок, замен и удалений символов необходых для того, чтобы преобразовать первую строку во вторую. Дистанция 0 означает, что строки идентичны.

Алгоритм был изобретён в 1965 советским научным работником Владимиром Левенштейном. По этой причине Дистанция редактирования называется также Дистанцией Левенштейна.

Имеются современные варианты алгоритма, придавая различные веса вставке, замене и удалению.

Примеры
  1. Дистанция редактирования от ALEXANDRE до ALEKSANDER: 4 (замена X на K, введение S после K, введение E после D, удаление E в конце).

Триграмма

Триграммное сходство (trigram similarity) между двумя строками определяется числом совпадающих символьных триплетов в обоих строках. Алгоритм можно обобщить на n-граммы, где n=1, 2, ...

Строки string1 и string2 пополняются слева и справа одним символом пробела. Затем строки разделяются на триплеты (триграммы). Окончательно, сходство вычисляется по формуле:

s = 2*m / (a + b).

Здесь:

m - число совпадающих триграмм
a - число триграмм в string1
b - число триграмм в string2

Примеры
  1. Сходство ALEXANDRE и ALEKSANDER: 2*3 / (9+10) = 0.32 (совпадают _AL, ALE, AND).

Распознавание форм Ратклиффа/Обершелпа

Алгоритм Ратклиффа/Обершелпа (Ratcliff/Obershelp pattern recognition) вычисляет сходство двух строк как удвоенное число соответствующих символов разделённое на полное число символов в строках. Соответствующие символы находятся в самой длинной общей подпоследовательности плюс, рекурсивно, соответствующие символы в остальной части по любую сторону от самой длинной общей подпоследовательности.

Примеры
  1. Сходство ALEXANDRE и ALEKSANDER: 2 * (3+3+1+1) / (9+10) = 0.84 (соответствуют ALE, AND, E, R).

Джаро-Винклер

Сходство Джаро-Винклера (Jaro-Winkler similarity) было применено в переписи США и использовано в последующей обработке.

Для данных строк string1 и string2, их сходство задаётся формулой:

s = m/3a + m/3b + (m-t)/3m.

Здесь:

m - число соответствующих символов
a - длина string1
b - длина string2
t - число перестановок

Два символа считаются соответствующими, только если они находятся не дальше чем (max(a,b)/2 - 1). Первый соответствующий символ в string1 сравнивается с первым соответствующим символом в string2; второй соответствующий символ в string1 сравнивается со вторым соответствующим символом в string2, и так далее. Число соответствующих символов делённое на 2 даёт число перестановок.

Улучшенный метод Джаро-Винклера использует веса отличные от 1/3. Он также даёт меньший вес некоторым типам ошибок: визуального сканирования, клавишного ввода и в конце строки.

Примеры
  1. Сходство ALEXANDRE и ALEKSANDER: (8/9 + 8/10 + (8-1)/8) / 3 = 0.85 (соответствуют A, L, E, A, N, D, R, E; 1 перестановка).

Опечатки

Имеются некоторые алгоритмы, учитывающие ошибки ввода на клавиатуре: V вместо B, 6 вместо Y и так далее.

Ресурсы

Смотрите также обширную библиографию Интернета на английском языке.

  1. Дистанция Левенштейна в Википедии — свободной энциклопедии.
    http://ru.wikipedia.org/
  2. Описание функций обработки строк PHP: levenshtein, soundex, similar_text e metaphone.
    http://www.php.net/manual/ru/ref.strings.php