F.22. fuzzystrmatch#

F.22. fuzzystrmatch

F.22. fuzzystrmatch

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

Предостережение

В настоящее время функции soundex, metaphone, dmetaphone и dmetaphone_alt не работают хорошо с многобайтовыми кодировками (например, UTF-8).

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

F.22.1. Soundex

Система Soundex - это метод сопоставления похожих по звучанию имен, преобразуя их в одинаковый код. Изначально он был использован Всемирной переписью населения США в 1880, 1900 и 1910 годах. Обратите внимание, что Soundex не очень полезен для неанглийских имен.

Модуль fuzzystrmatch предоставляет две функции для работы с кодами Soundex:

soundex(text) returns text
difference(text, text) returns int

Функция soundex преобразует строку в ее код Soundex. Функция difference преобразует две строки в их коды Soundex и затем сообщает количество совпадающих позиций кодов. Поскольку коды Soundex имеют четыре символа, результат может быть от нуля до четырех, где ноль означает отсутствие совпадения, а четыре - точное совпадение. (Таким образом, функция имеет неправильное название — similarity было бы более подходящим названием).

Вот несколько примеров использования:

SELECT soundex('hello world!');

SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');

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;

F.22.2. Левенштейн

Эта функция вычисляет расстояние Левенштейна между двумя строками:

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

И source и target могут быть любой непустой строкой, с максимальной длиной 255 символов. Параметры стоимости определяют, сколько стоит вставка, удаление или замена одного символа соответственно. Вы можете опустить параметры стоимости, как во второй версии функции; в этом случае все они устанавливаются по умолчанию равными 1.

levenshtein_less_equal - это ускоренная версия функции Levenshtein, которая используется, когда интересуют только малые расстояния. Если фактическое расстояние меньше или равно max_d, то levenshtein_less_equal возвращает правильное расстояние; в противном случае возвращает значение, большее, чем max_d. Если max_d отрицательное, то поведение такое же, как у levenshtein.

Примеры:

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 levenshtein
-------------
           2
(1 row)

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2, 1, 1);
 levenshtein
-------------
           3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive', 2);
 levenshtein_less_equal
------------------------
                      3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive', 4);
 levenshtein_less_equal
------------------------
                      4
(1 row)

F.22.3. Метафон

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

Эта функция вычисляет код метафона входной строки:

metaphone(text source, int max_output_length) returns text

Входной параметр source должен быть непустой строкой с максимальной длиной 255 символов. Параметр max_output_length устанавливает максимальную длину кода metaphone в выводе; если длина превышает это значение, вывод будет обрезан до указанной длины.

Пример:

test=# SELECT metaphone('GUMBO', 4);
 metaphone
-----------
 KM
(1 row)

F.22.4. Double Metaphone

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

dmetaphone(text source) returns text
dmetaphone_alt(text source) returns text

Входные строки не имеют ограничений по длине.

Пример:

test=# SELECT dmetaphone('gumbo');
 dmetaphone
------------
 KMP
(1 row)