如何使用jaro-winkler查找表中最接近的值?

时间:2010-08-27 14:37:43

标签: oracle string-comparison fuzzy-comparison

我在我的数据库中实现了jaro-winkler算法。我没有写这个功能。该函数比较两个值并给出匹配的概率。

所以jaro(string1,string2,matchnoofchars)将返回一个结果。

我想发送一个带有matchnoofchars的字符串,然后得到概率高于95%的结果集,而不是比较两个字符串。

例如,当前函数能够为jaro返回97.62%(“Philadelphia”,“Philadelphlaa”,9)

我希望调整此功能,以便我能够找到“费城”作为“Philadelphlaa”的输入。我需要做些什么样的改变呢?

我正在使用Oracle 9i。

3 个答案:

答案 0 :(得分: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

如果表单中包含该单词,则会选择“费城”。

答案 1 :(得分:1)

有点脏但更快(未经测试!)。

假设前三个字符相同,长度也大致相同。

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;

答案 2 :(得分:0)

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;