Перейти к основному содержимому

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 является ускоренной версией функции Левенштейна. Она предназначена для использования, когда интерес представляют небольшие расстояния.

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

ПараметрТипОписание
sourcetextВ качестве исходной может быть передана любая строка, отличная от NULL и не длиннее 255 символов
targettextВ качестве целевой может быть передана любая строка, отличная от NULL и не длиннее 255 символов
ins_costintСтоимость добавления символов
del_costintСтоимость удаления символов
sub_costintСтоимость замены символов
max_dintПороговое (максимальное) значение расстояния для функции 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.