fuzzystrmatch. Вычисление схожести и расстояния между строками#

В исходном дистрибутиве установлено по умолчанию: нет.

Связанные компоненты: отсутствуют.

Схема размещения: ext.

Модуль содержит функции для вычисления схожести и расстояния между строками.

Описание функций#

Soundex#

Система Soundex позволяет вычислить похожие по звучанию имена, приводя их к одинаковым кодам. Система не очень полезна для неанглоязычных имен.

Функции для работы с кодами Soundex:

Функция

Возвращает

Описание

soundex(text)

text

Преобразует строку в код Soundex

difference(text, text)

int: 0 – полное несоответствие, 4 — точное совпадение

Преобразует две строки в их коды Soundex и затем сообщает количество совпадающих позиций в этих кодах; коды Soundex состоят из четырех символов

Левенштейн#

Функция вычисляет «расстояние Левенштейна» между двумя строками.

Примечание:

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

Источник: ru.wikipedia.org.

Функции Левенштейна:

Функция

Возвращает

levenshtein (text source, text target, int ins_cost, int del_cost, int sub_cost)

int

levenshtein (text source, text target)

int

levenshtein_less_equal (text source, text target, int ins_cost, int del_cost, int sub_cost, int max_d)

int

levenshtein_less_equal (text source, text target, int max_d)

int

Функция levenshtein_less_equal является ускоренной версией функции Левенштейна. Она предназначена для использования, когда интерес представляют небольшие расстояния.

Входные параметры функций Левенштейна:

Параметр

Тип

Описание

source

text

В качестве исходной может быть передана любая строка, отличная от NULL и не длиннее 255 символов

target

text

В качестве целевой может быть передана любая строка, отличная от NULL и не длиннее 255 символов

ins_cost

int

Стоимость добавления символов

del_cost

int

Стоимость удаления символов

sub_cost

int

Стоимость замены символов

max_d

int

Пороговое (максимальное) значение расстояния для функции levenshtein_less_equal (описание параметра представлено ниже)

Зависимость результата функции levenshtein_less_equal при установке параметра max_d от фактического расстояния:

  • меньше или равно max_d – возвращает точное его значение;

  • больше max_d – возвращает значение, большее чем max_d;

  • отрицательное – работа аналогична функции levenshtein.

Metaphone#

Примечание:

Metaphone - это фонетический алгоритм, опубликованный Лоуренсом Филипсом в 1990 году для индексации слов по их английскому произношению.

Источник: ru.wikipedia.org

Metaphone, как и Soundex, построен на идее составления кода, представляющего входную строку. Две строки признаются похожими, если их коды совпадают.

Функция Metaphone:

Функция

Возвращает

Описание

Входные параметры

metaphone (text source, int max_output_length)

text

Вычисляет код метафона входной строки

source – строка, отличная от NULL длиной до 255 символов; max_output_length – максимальная длина выходного кода метафона; если код длиннее, он обрезается

Double Metaphone#

Алгоритм Double Metaphone (Двойной метафон) вычисляет две строки «похожего звучания» для заданной строки — «первичную» и «альтернативную». В большинстве случаев они совпадают, но для неанглоязычных имен в особенности они могут быть весьма различными, в зависимости от произношения.

Функция Double Metaphone:

Функция

Возвращает

Описание

dmetaphone (text source)

text

Вычисляет первичный код

dmetaphone_alt (text source)

text

Вычисляет альтернативный код

Доработка#

Доработка не проводилась.

Ограничения#

Функции некорректно работают с многобайтными кодировками, как например UTF-8.

Установка#

Модуль считается «доверенным», то есть его могут устанавливать пользователи, имеющие право CREATE в текущей базе данных:

CREATE EXTENSION fuzzystrmatch SCHEMA ext;

Настройка#

Не требуется.

Использование модуля#

Примеры использования:

  • soundex

    Команда:

    SELECT ext.soundex('hello my world!!');
    

    Пример вывода:

     soundex 
    ---------
     H456
    (1 row)
    
  • difference

    Команда:

    SELECT ext.soundex('Anne'), ext.soundex('Ann'), ext.difference('Anne', 'Ann');
    

    Пример вывода:

     soundex | soundex | difference 
    ---------+---------+------------
     A500    | A500    |          4
    (1 row)
    

    Команда:

    CREATE TABLE s (nm text);
    INSERT INTO s VALUES ('john');
    INSERT INTO s VALUES ('joan');
    INSERT INTO s VALUES ('wobbly');
    INSERT INTO s VALUES ('jack');
    ---
    SELECT * FROM s WHERE soundex(nm) = soundex('john');
    SELECT * FROM s WHERE difference(s.nm, 'john') > 2;
    

    Пример вывода:

      nm  
    ------
     john
     joan
    (2 rows)
    
      nm  
    ------
     john
     joan
     jack
    (3 rows)
    
  • levenshtein

    Команда:

    SELECT levenshtein('FOOTBALL', 'GANDBOOL');
    

    Пример вывода:

     levenshtein 
    -------------
               6
    (1 row)
    

    Команда:

    SELECT levenshtein('FOOTBALL', 'GANDBOOL', 2, 1, 1);
    

    Пример вывода:

     levenshtein 
    -------------
               6
    (1 row)
    
  • levenshtein_less_equal

    Команда:

    SELECT levenshtein_less_equal('extensive', 'exhaustive', 2);
    

    Пример вывода:

     levenshtein_less_equal 
    ------------------------
                          3
    (1 row)
    

    Команда:

    SELECT levenshtein_less_equal('extensive', 'exhaustive', 4);
    

    Пример вывода:

     levenshtein_less_equal 
    ------------------------
                          4
    (1 row)
    
  • metaphone

    Команда:

    SELECT metaphone('GUNDBOLIST', 4);
    

    Пример вывода:

     metaphone 
    -----------
     KNTB
    (1 row)
    
  • dmetaphone

    Команда:

    SELECT dmetaphone('Gundbolist');
    

    Пример вывода:

     dmetaphone 
    ------------
     KNTP
    (1 row)
    

    Команда:

    SSELECT levenshtein_less_equal('extensive', 'exhaustive', 4);
    

    Пример вывода:

     levenshtein_less_equal 
    ------------------------
                          4
    (1 row)
    

Ссылки на документацию разработчика#

Исходная документация PosgreSQL по модулю fuzzystrmatch: https://www.postgresql.org/docs/15/fuzzystrmatch.html.