2

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

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

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

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

我希望调整此功能,以便能够找到“Philadelphia”作为“Philadelphlaa”的输入。我需要做什么样的改变才能发生这种情况?

我正在使用 Oracle 9i。

4

3 回答 3

3

您是否有包含“费城”之类的单词的单词列表?

谁编写了这个函数?

Oracle 有包 utl_match 用于模糊文本比较:http: //download.oracle.com/docs/cd/E14072_01/appdev.112/e10577/u_match.htm

你不能吗

从单词 w1 中选择 w1.word,其中 jaro(w1.word,'Philadelphlaa', 9) >= 0.95

?

如果该单词出现在表格单词中,这将选择“Philadelphia”。

于 2010-08-28T16:00:58.380 回答
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;
于 2010-08-30T19:38:32.853 回答
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;
于 2010-08-30T18:57:58.957 回答