Как я могу использовать jaro-winkler для поиска ближайшего значения в таблице?

В моей базе данных есть реализация алгоритма Яро-Винклера. Я не писал эту функцию. Функция сравнивает два значения и дает вероятность совпадения.

Итак, jaro(string1, string2, matchnoofchars) вернет результат.

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

Например, текущая функция может вернуть 97,62% для jaro("Philadelphia","Philadelphlaa",9)

Я хочу настроить эту функцию, чтобы я мог найти «Филадельфию» для ввода «Филадельфия». Какие изменения мне нужно сделать, чтобы это произошло?

Я использую Oracle 9i.


person abhi    schedule 27.08.2010    source источник


Ответы (3)


У вас есть список слов, содержащих такие слова, как «Филадельфия»?

И кто написал эту функцию?

У Oracle есть пакет utl_match для сравнения нечетких текстов: http://download.oracle.com/docs/cd/E14072_01/appdev.112/e10577/u_match.htm

Ты не можешь сделать

выберите w1.word из слов w1, где jaro(w1.word,'Philadelphlaa', 9) >= 0,95

?

При этом будет выбрано «Филадельфия», если это слово присутствует в словах таблицы.

person TTT    schedule 28.08.2010
comment
Функция была написана кем-то другим. Я смог использовать его в блоке Pl sql. - person abhi; 29.08.2010
comment
Хорошо, у вас есть список слов? Трудно понять вопрос. Откуда произошло слово «Филадельфия»? - person TTT; 30.08.2010
comment
список слов будет из двух разных таблиц. Основная таблица, в которой есть слова с правильным написанием, и таблица транзакций, в которой могут быть слова с ошибками. Я разместил ответ. Мой ответ неэффективен, так как обработка материала занимает много времени. - person abhi; 30.08.2010
comment
Мы используем Oracle 9i. Доступен ли пакет соответствия UTL для 9i? - person abhi; 30.08.2010
comment
Не могу найти ссылку на utl_match в документации Oracle 9.2, Oracle 9.2 уже десять лет. - person TTT; 30.08.2010

Немного грязно, но быстрее (не проверено!).

Предположим, что первые три символа одинаковы и длина тоже примерно одинакова.

DECLARE
  CURSOR citynames(cp_start in varchar2, cp_length in number) IS
    SELECT city FROM table_loc_master where statecode = 'PQ'
    and   city like cp_start||'%'
    and   length(city) between cp_length -2 and cp_length +2;
  CURSOR leasecity IS
    SELECT city FROM table_loc where State = 'PQ'
    MINUS
    SELECT to_char(city) city FROM table_loc_master where statecode = 'PQ';
  xProb NUMBER(10,8);
BEGIN
  FOR x_rec IN leasecity
  LOOP
      FOR y_rec IN citynames(substr(x_rec.city,1,3), length(x_rec.city))
      LOOP
            xProb := jwrun(x_rec.city,y_rec.city,length(y_rec.city));
            If xProb > 0.97 Then
               DBMS_OUTPUT.PUT_LINE('Source : ' || x_rec.city || ' Target: ' || y_rec.city );
            End if;
      END LOOP;
  END LOOP;
END;
person TTT    schedule 30.08.2010
comment
Это зависит от того, где название города будет написано с ошибкой. Пользовательский ввод — это не выбор, а введенное слово. Это приводит к тому, что многие названия городов выходят из строя. Спасибо, что ответили на мой вопрос. - person abhi; 31.08.2010

person    schedule
comment
Вы можете ускорить его, предположив, что первые 3, 4 или 5.. символов одинаковы. Вы также можете предположить, что оба слова имеют примерно одинаковую длину. Это ограничивает поиск. - person TTT; 30.08.2010