データ品質演算子
文字列照合演算子PHONIC_ENCODEおよびFUZZY_MATCHを使用して、Oracle Database内のデータ品質機能を拡張できます。
これらの演算子は、同じように聞こえる文字列やスペルがわずかに異なる文字列を照合することで、ほぼ重複する行を見つけるのに役立ちます。次に例を示します。
-
ChrisとKrisは、同じように聞こえる文字列です
-
kittenおよびsittenは、スペルがわずかに異なる文字列です
FUZZY_MATCH
FUZZY_MATCHは、最初の引数として使用されるアルゴリズム、2番目と3番目の引数として処理される文字列および必要な出力の品質を制御するオプションの引数を取得します。
UTL_MATCHパッケージはバイト単位で評価し、FUZZY_MATCHは文字単位で評価します。したがって、UTL_MATCHはシングルバイト文字列の比較にのみ機能し、FUZZY_MATCHはマルチバイト文字セットを処理します。
UNSCALEDオプションを指定すると、FUZZY_MATCHはLEVENSHTEIN、DAMERAU_LEVENSHTEIN、BIGRAM、TRIGRAM、LONGEST_COMMON_SUBSTRINGのアルゴリズムのメジャーを文字単位で返します。
引数
サポートされているアルゴリズム:
-
LEVENSHTEINは、UTL_MATCH.EDIT_DISTANCEまたはUTL_MATCH.EDIT_SIMILARITYに対応し、文字編集距離または類似度のメジャーを提供します。 -
DAMERAU_LEVENSHTEIN距離は、3つの従来の単一文字編集操作(挿入、削除、および置換)に加えて、許容される操作間の置換が含まれているため、従来のLEVENSHTEIN距離とは異なっています。 -
JARO_WINKLERは、UTL_MATCH.JARO_WINKLER(0-1の間のパーセンテージ)またはUTL_MATCH.JARO_WINKLER_SIMILARITY(同じですが、0-100からスケーリング)に対応します。 -
BIGRAMおよびTRIGRAMは、Nグラム照合手法のインスタンスであり、2つの文字列間の共通の連続した部分文字列(グラム)の数をカウントします。 -
WHOLE_WORD_MATCHは、Oracle Enterprise Data Qualityの単語一致率または単語一致数比較に対応します。LEVENSHTEINを計算するか、一致する単位として(文字ではなく)単語を含む2つの句の距離を編集します。 -
LONGEST_COMMON_SUBSTRINGは、2つの文字列間の最長の共通部分文字列を検索します。
どちらのstr引数にも、CHAR、VARCHAR2、NCHAR、NVARCHAR2のいずれかのデータ型を指定できます。
UNSCALED
キーワードUNSCALEDはオプションです。UNSCALEDを指定した場合、戻り値は次のいずれかになります。
-
LEVENSHTEINまたは編集距離 -
JARO_WINKLER値(パーセンテージ) -
Nグラム、共通部分文字列の数
-
LCS、最も長い共通部分文字列の長さ
RELATE_TO_SHORTER
キーワードRELATE_TO_SHORTERはオプションです。RELATE_TO_SHORTERを指定すると、類似度メジャーは短い入力文字列の長さでスケーリングされます。RELATE_TO_SHORTERを指定しない場合はデフォルトの動作になり、長い文字列長が分母として使用されます。
EDIT_TOLERANCE
キーワードEDIT_TOLERANCEはオプションです。EDIT_TOLERANCEは、WHOLE_WORD_MATCHアルゴリズムでのみ指定できます。EDIT_TOLERANCEを指定すると、文字エラーの許容範囲は、単語に差異があるが同じとみなすために、1つの単語内で差異を許容できる文字数の最大パーセントです。
戻り値
演算子はNUMBERを返します。デフォルトでは、0から100の間のパーセンテージになるように正規化された類似度スコアです。
例
SQL> select fuzzy_match(LEVENSHTEIN, 'Mohamed Tarik', 'Mo Tariq') from dual;
FUZZY_MATCH(LEVENSHTEIN,'MOHAMEDTARIK','MOTARIQ')
-------------------------------------------------
54
1 row selected.SQL> select fuzzy_match(LEVENSHTEIN, 'Mohamed Tarik', 'Mo Tariq', unscaled) from dual;
FUZZY_MATCH(LEVENSHTEIN,'MOHAMEDTARIK','MOTARIQ',UNSCALED)
----------------------------------------------------------
6
1 row selected.
SQL> select fuzzy_match(DAMERAU_LEVENSHTEIN, 'Mohamed Tarik', 'Mo Tariq', relate_to_shorter) from dual;
FUZZY_MATCH(DAMERAU_LEVENSHTEIN,'MOHAMEDTARIK','MOTARIQ',RELATE_TO_SHORTER)
---------------------------------------------------------------------------
25
1 row selected.SQL> select fuzzy_match(BIGRAM, 'Mohamed Tarik', 'Mo Tariq', unscaled) from dual;
FUZZY_MATCH(BIGRAM,'MOHAMEDTARIK','MOTARIQ',UNSCALED)
-----------------------------------------------------
5
1 row selected.SQL> select fuzzy_match(LONGEST_COMMON_SUBSTRING, 'Mohamed Tarik', 'Mo Tariq', unscaled) from dual;
FUZZY_MATCH(LONGEST_COMMON_SUBSTRING,'MOHAMEDTARIK','MOTARIQ',UNSCALED)
-----------------------------------------------------------------------
5
1 row selected.SQL> select fuzzy_match(WHOLE_WORD_MATCH, 'Mohamed Tarik', 'Mo Tariq') from dual;
FUZZY_MATCH(WHOLE_WORD_MATCH,'MOHAMEDTARIK','MOTARIQ')
------------------------------------------------------
0
1 row selectedSQL> select fuzzy_match(WHOLE_WORD_MATCH, 'Pawan Kumar Goel', 'Pavan Kumar G', EDIT_TOLERANCE 60) from dual;
FUZZY_MATCH(WHOLE_WORD_MATCH,'PAWANKUMARGOEL','PAVANKUMARG',EDIT_TOLERANCE60)
-----------------------------------------------------------------------------
67
1 row selected.PHONIC_ENCODE
PHONIC_ENCODEは、最初の引数として使用されるアルゴリズム、2番目の引数として処理される文字列、必要な出力の長さを制御するオプションのmax_code_len引数を取得します。max_code_lenは、1から12までの整数である必要があります。
引数
DOUBLE_METAPHONEは、プライマリ・コードを返します。DOUBLE_METAPHONE_ALTは、代替コード(存在する場合)を返します。代替コードがない場合は、プライマリ・コードを返します。
strには、CHAR、VARCHAR2、NCHAR、NVARCHAR2のいずれかのデータ型を指定できます。
オプションの引数max_code_lenは整数である必要があります。元のMetaphoneアルゴリズムでは、デフォルトの4文字より長いコードを返すことができます。
戻り値
演算子はVARCHAR2を返します。
例
SQL> select phonic_encode(DOUBLE_METAPHONE, 'smith') c1, 2 phonic_encode(DOUBLE_METAPHONE_ALT, 'smith') c2 from dual; C1 C2 ------------- ------------- SM0 XMT 1 row selected.
SQL> select phonic_encode(DOUBLE_METAPHONE, 'Schmidt') c1, 2 phonic_encode(DOUBLE_METAPHONE_ALT, 'Schmidt') c2 from dual; C1 C2 ------------- ------------- XMT SMT 1 row selected.
SQL> select phonic_encode(DOUBLE_METAPHONE, 'phone') c1, 2 phonic_encode(DOUBLE_METAPHONE_ALT, 'phone') c2 from dual; C1 C2 ------------- ------------- FN FN 1 row selected.
SQL> select phonic_encode(DOUBLE_METAPHONE, 'George') c1, 2 phonic_encode(DOUBLE_METAPHONE_ALT, 'George') c2 from dual; C1 C2 ------------- ------------- JRJ KRK 1 row selected.
SQL> -- PNNT / PKNNT SQL> select phonic_encode(DOUBLE_METAPHONE, 'poignant') c1, 2 phonic_encode(DOUBLE_METAPHONE_ALT, 'poignant') c2, 3 phonic_encode(DOUBLE_METAPHONE_ALT, 'poignant', 10) c3 from dual; C1 C2 C3 ------------- ------------- ------------- PNNT PKNN PKNNT

