پایگاه داده Oracle 23ai عملگرهای کیفیت داده FUZZY_MATCH و PHONIC_ENCODE را برای انجام تطبیق رشته فازی معرفی کرد.
بسته UTL_MATCH در Oracle 10g Release 2 معرفی شد، اما برای اولین بار در Oracle 11g Release 2 مستند شد (و بنابراین پشتیبانی شد). این شامل انواع توابع است که برای آزمایش سطح شباهت/تفاوت بین رشته ها مفید است. عملگرهای FUZZY_MATCH و PHONIC_ENCODE عملکرد تطبیق رشته فازی پایگاه داده را گسترش می دهند.
آشنایی با قابلیت های پایگاه داده Oracle 23ai
مثال های این مقاله به جدول تست زیر نیاز دارند.
drop table if exists match_tab;
create table match_tab (
id number,
col1 varchar2(15),
col2 varchar2(15),
constraint match_tab_pk primary key (id)
);
insert into match_tab values
(۱, ‘Peter Parker’, ‘Pete Parker’),
(۲, ‘Peter Parker’, ‘peter parker’),
(۳, ‘Clark Kent’, ‘Claire Kent’),
(۴, ‘Wonder Woman’, ‘Ponder Woman’),
(۵, ‘Superman’, ‘Superman’),
(۶, ‘The Hulk’, ‘Iron Man’);
commit;
توجه داشته باشید که مقادیر COL1 و COL2 درجات مختلفی از شباهت از جمله مطابقت دقیق، مطابقت نزدیک و مقادیر کاملاً متفاوت دارند.
عملگر FUZZY_MATCH از نظر زبان خنثی است. شباهت بین دو رشته را تعیین می کند و از چندین الگوریتم لیست شده در اینجا پشتیبانی می کند.
set linesize 100
column col1 format a12
column col2 format a12
select col1,
col2,
fuzzy_match(levenshtein, col1, col2) as levenshtein,
fuzzy_match(jaro_winkler, col1, col2) as jaro_winkler,
fuzzy_match(bigram, col1, col2) as bigram,
fuzzy_match(trigram, col1, col2) as trigram,
fuzzy_match(whole_word_match, col1, col2) as wwm,
fuzzy_match(longest_common_substring, col1, col2) as lcs
from match_tab;
COL1 COL2 LEVENSHTEIN JARO_WINKLER BIGRAM TRIGRAM WWM LCS
———— ———— ———– ———— ———- ———- ———- ———-
Peter Parker Pete Parker ۹۲ ۹۲ ۹۰ ۷۰ ۵۰ ۵۸
Peter Parker peter parker ۸۴ ۸۸ ۷۲ ۶۰ ۰ ۴۱
Clark Kent Claire Kent ۸۲ ۹۰ ۶۰ ۴۴ ۵۰ ۴۵
Wonder Woman Ponder Woman ۹۲ ۹۴ ۱۰۰ ۹۰ ۵۰ ۹۱
Superman Superman ۱۰۰ ۱۰۰ ۱۰۰ ۱۰۰ ۱۰۰ ۱۰۰
The Hulk Iron Man ۰ ۴۱ ۰ ۰ ۰ ۱۲
۶ rows selected.
SQL>
به طور پیش فرض خروجی یک درصد شباهت است، اما کلمه کلیدی UNSCALED را می توان برای برگرداندن مقدار خام اضافه کرد.
select col1,
col2,
fuzzy_match(levenshtein, col1, col2, unscaled) as levenshtein,
fuzzy_match(jaro_winkler, col1, col2, unscaled) as jaro_winkler,
fuzzy_match(bigram, col1, col2, unscaled) as bigram,
fuzzy_match(trigram, col1, col2, unscaled) as trigram,
fuzzy_match(whole_word_match, col1, col2, unscaled) as wwm,
fuzzy_match(longest_common_substring, col1, col2, unscaled) as lcs
from match_tab;
COL1 COL2 LEVENSHTEIN JARO_WINKLER BIGRAM TRIGRAM WWM LCS
———— ———— ———– ———— ———- ———- ———- ———-
Peter Parker Pete Parker ۱ .۹۲ ۱۰ ۷ ۱ ۷
Peter Parker peter parker ۲ .۸۸ ۸ ۶ ۰ ۵
Clark Kent Claire Kent ۲ .۹ ۶ ۴ ۱ ۵
Wonder Woman Ponder Woman ۱ .۹۴ ۱۱ ۹ ۱ ۱۱
Superman Superman ۰ ۱ ۷ ۶ ۱ ۸
The Hulk Iron Man ۸ .۴۱ ۰ ۰ ۰ ۱
۶ rows selected.
SQL>
اگر از بسته UTL_MATCH استفاده کردهاید، مقادیر مقیاسبندیشده بدون مقیاس، فراخوانهای زیر را نشان میدهند.
UnscaledScaledAlgorithmUTL_MATCH.EDIT_DISTANCEUTL_MATCH.EDIT_DISTANCE_SIMILARITYLEVENSHTEINUTL_MATCH.JARO_WINKLERUTL_MATCH.JARO_WINKLER_SIMILARITYJARO_WINKLER
بهطور پیشفرض، خروجی با طول رشته ورودی طولانیتر مقیاسبندی میشود. کلمه کلیدی RELATE_TO_SHORTER این را تغییر می دهد تا به رشته ورودی کوتاه تر تبدیل شود.
select col1,
col2,
fuzzy_match(levenshtein, col1, col2, relate_to_shorter) as levenshtein,
fuzzy_match(jaro_winkler, col1, col2, relate_to_shorter) as jaro_winkler,
fuzzy_match(bigram, col1, col2, relate_to_shorter) as bigram,
fuzzy_match(trigram, col1, col2, relate_to_shorter) as trigram,
fuzzy_match(whole_word_match, col1, col2, relate_to_shorter) as wwm,
fuzzy_match(longest_common_substring, col1, col2, relate_to_shorter) as lcs
from match_tab;
COL1 COL2 LEVENSHTEIN JARO_WINKLER BIGRAM TRIGRAM WWM LCS
———— ———— ———– ———— ———- ———- ———- ———-
Peter Parker Pete Parker ۹۱ ۹۲ ۱۰۰ ۷۷ ۵۰ ۶۳
Peter Parker peter parker ۸۴ ۸۸ ۷۲ ۶۰ ۰ ۴۱
Clark Kent Claire Kent ۸۰ ۹۰ ۶۶ ۵۰ ۵۰ ۵۰
Wonder Woman Ponder Woman ۹۲ ۹۴ ۱۰۰ ۹۰ ۵۰ ۹۱
Superman Superman ۱۰۰ ۱۰۰ ۱۰۰ ۱۰۰ ۱۰۰ ۱۰۰
The Hulk Iron Man ۰ ۴۱ ۰ ۰ ۰ ۱۲
۶ rows selected.
SQL>
کلمه کلیدی EDIT_TOLERANCE را می توان با الگوریتم WHOLE_WORD_MATCH استفاده کرد. تلورانس درصدی از کاراکترهای یک کلمه است که می تواند متفاوت باشد، در حالی که هنوز آن را همان کلمه در نظر می گیریم.
select col1,
col2,
fuzzy_match(whole_word_match, col1, col2) as wwm,
fuzzy_match(whole_word_match, col1, col2, edit_tolerance 20) as wwm20,
fuzzy_match(whole_word_match, col1, col2, edit_tolerance 82) as wwm82
from match_tab;
COL1 COL2 WWM WWM20 WWM82
———— ———— ———- ———- ———-
Peter Parker Pete Parker ۵۰ ۱۰۰ ۵۰
Peter Parker peter parker ۰ ۱۰۰ ۵۰
Clark Kent Claire Kent ۵۰ ۱۰۰ ۵۰
Wonder Woman Ponder Woman ۵۰ ۱۰۰ ۱۰۰
Superman Superman ۱۰۰ ۱۰۰ ۱۰۰
The Hulk Iron Man ۰ ۰ ۰
۶ rows selected.
SQL>
عملگر PHONIC_ENCODE متن را بر اساس تلفظ متن به کدهای خاص زبان تبدیل می کند. این الگوریتم Double Metaphone و یک الگوریتم جایگزین را پیاده سازی می کند.
set linesize 100
column col1 format a12
column col2 format a12
column col1_dm format a8
column col2_dm format a8
column col1_dma format a8
column col2_dma format a8
select col1,
col2,
phonic_encode(double_metaphone, col1) as col1_dm,
phonic_encode(double_metaphone, col2) as col2_dm,
phonic_encode(double_metaphone_alt, col1) as col1_dma,
phonic_encode(double_metaphone_alt, col2) as col2_dma
from match_tab;
COL1 COL2 COL1_DM COL2_DM COL1_DMA COL2_DMA
———— ———— ——– ——– ——– ——–
Peter Parker Pete Parker PTRP PTPR PTRP PTPR
Peter Parker peter parker PTRP PTRP PTRP PTRP
Clark Kent Claire Kent KLRK KLRK KLRK KLRK
Wonder Woman Ponder Woman ANTR PNTR FNTR PNTR
Superman Superman SPRM SPRM SPRM SPRM
The Hulk Iron Man ۰LK ARNM TLK ARNM
۶ rows selected.
SQL>
هنگام استفاده از DOUBLE_METAPHONE_ALT، اگر کد دیگری وجود نداشته باشد، کد اصلی برگردانده می شود.
حداکثر طول کد توسط یک پارامتر سوم اختیاری کنترل می شود که مقادیر صحیح از ۱ تا ۱۲ را می پذیرد.
column col1_dm1 format a9
column col2_dm1 format a9
column col1_dm6 format a9
column col2_dm6 format a9
column col1_dm12 format a9
column col2_dm12 format a9
select col1,
col2,
phonic_encode(double_metaphone, col1, 1) as col1_dm1,
phonic_encode(double_metaphone, col2, 1) as col2_dm1,
phonic_encode(double_metaphone, col1, 6) as col1_dm6,
phonic_encode(double_metaphone, col2, 6) as col2_dm6,
phonic_encode(double_metaphone, col1, 12) as col1_dm12,
phonic_encode(double_metaphone, col2, 12) as col2_dm12
from match_tab;
COL1 COL2 COL1_DM1 COL2_DM1 COL1_DM6 COL2_DM6 COL1_DM12 COL2_DM12
———— ———— ——— ——— ——— ——— ——— ———
Peter Parker Pete Parker P P PTRPRK PTPRKR PTRPRKR PTPRKR
Peter Parker peter parker P P PTRPRK PTRPRK PTRPRKR PTRPRKR
Clark Kent Claire Kent K K KLRKKN KLRKNT KLRKKNT KLRKNT
Wonder Woman Ponder Woman A P ANTRMN PNTRMN ANTRMN PNTRMN
Superman Superman S S SPRMN SPRMN SPRMN SPRMN
The Hulk Iron Man ۰ A ۰LK ARNMN ۰LK ARNMN
۶ rows selected.
SQL>
در این نسخه هیچ پشتیبانی مستقیمی برای عملگرهای FUZZY_MATCH یا PHONIC_ENCODE در PL/SQL وجود ندارد، بنابراین تخصیص مستقیم امکان پذیر نیست.
declare
l_output number;
begin
l_output := fuzzy_match(levenshtein, ‘Peter Parker’, ‘peter parker’);
end;
/
*
ERROR at line 4:
ORA-06550: line 4, column 15:
PLS-00201: identifier ‘FUZZY_MATCH’ must be declared
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored
SQL>
declare
l_output varchar2(10);
begin
l_output := phonic_encode(double_metaphone, ‘Peter Parker’);
end;
/
*
ERROR at line 4:
ORA-06550: line 4, column 15:
PLS-00201: identifier ‘PHONIC_ENCODE’ must be declared
ORA-06550: line 4, column 3:
PL/SQL: Statement ignored
SQL>
ما می توانیم از یک SELECT … INTO برای انجام انتساب استفاده کنیم.
declare
l_output number;
begin
select fuzzy_match(levenshtein, ‘Peter Parker’, ‘peter parker’)
into l_output;
end;
/
PL/SQL procedure successfully completed.
SQL>
declare
l_output varchar2(10);
begin
select phonic_encode(double_metaphone, ‘Peter Parker’)
into l_output;
end;
/
PL/SQL procedure successfully completed.
SQL>