データ品質演算子
文字列照合演算子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 selected
SQL> 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