Как я могу использовать jaro-winkler, чтобы найти ближайшее значение в таблице? - PullRequest
2 голосов
/ 27 августа 2010

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

Таким образом, jaro (string1, string2, matchnoofchars) вернет результат.

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

Например, текущая функция способна вернуть 97,62% для jaro («Филадельфия», «Филадельфия», 9)

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

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

Ответы [ 3 ]

3 голосов
/ 28 августа 2010

У вас есть список слов, в которых есть такие слова, как "Филадельфия"?

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

У 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

?

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

1 голос
/ 30 августа 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;
0 голосов
/ 30 августа 2010
DECLARE
  CURSOR citynames IS
    SELECT city FROM table_loc_master where statecode = 'PQ';
  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
      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;
...