我在我的数据库中实现了jaro-winkler算法。我没有写这个功能。该函数比较两个值并给出匹配的概率。
所以jaro(string1,string2,matchnoofchars)将返回一个结果。
我想发送一个带有matchnoofchars的字符串,然后得到概率高于95%的结果集,而不是比较两个字符串。
例如,当前函数能够为jaro返回97.62%(“Philadelphia”,“Philadelphlaa”,9)
我希望调整此功能,以便我能够找到“费城”作为“Philadelphlaa”的输入。我需要做些什么样的改变呢?
我正在使用Oracle 9i。
答案 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;