مسعود سلطانی راد
مسعود سلطانی راد
خواندن ۶ دقیقه·۲ ماه پیش

عملگرهای کیفیت داده FUZZY_MATCH و PHONIC_ENCODE در اوراکل ۲۳ai


پایگاه داده 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

عملگر 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

عملگر 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>

پشتیبانی PL/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>

oracle database
چند سالی هست در حوزه داده ها ( نگهداری و تحلیل آنها) فعالیت دارم و همیشه سعی کردم آموخته هایم رو به اشتراک بگذارم soltanirad@artarad.ir www.artarad.ir
شاید از این پست‌ها خوشتان بیاید