無料スクリプト配布のPHP.TO   PHPの実用的なtips PHPマニュアル MySQLマニュアル Apacheマニュアル PostgreSQLマニュアル マニュアル検索    

F.15. fuzzystrmatch

fuzzystrmatch モジュールは、文字列間の類似度や相違度を決める複数の関数を提供します。

注意

現時点で、 soundex metaphone dmetaphone dmetaphone_alt は(UTF-8のような)マルチバイト符号化方式では充分に動作しません。

F.15.1. Soundex

Soundexシステムは、同一コードに変換することで似ているように見える名称を一致させる手法です。 これは、1880年、1900年、1910年の米国国政調査で初めて使用されました。 Soundexは非英語圏の名称では特に有用なものではないことに注意してください。

fuzzystrmatch はSoundexコードを使用して動作する2つの関数を提供します。

soundex(text) returns text
difference(text, text) returns int

soundex 関数は文字列をSoundexコードに変換します。 difference 関数は2つの文字列をそのSoundexコードに変換し、コード位置が一致する個数を報告します。 Soundexコードは4文字からなりますので、結果は0から4までの範囲になります。 0はまったく一致しないことを、4は完全に一致することを示します。 (したがってこの関数の名前は間違っています。 similarity の方がより優れた名前だったかもしれません。)

以下に使用例をいくつか示します。

SELECT soundex('hello world!');

SELECT soundex('Anne'), soundex('Ann'), difference('Anne', 'Ann');
SELECT soundex('Anne'), soundex('Andrew'), difference('Anne', 'Andrew');
SELECT soundex('Anne'), soundex('Margaret'), difference('Anne', 'Margaret');

CREATE TABLE s (nm text);

INSERT INTO s VALUES ('john');
INSERT INTO s VALUES ('joan');
INSERT INTO s VALUES ('wobbly');
INSERT INTO s VALUES ('jack');

SELECT * FROM s WHERE soundex(nm) = soundex('john');

SELECT * FROM s WHERE difference(s.nm, 'john') > 2;

F.15.2. レーベンシュタイン

この関数は2つの文字列間のレーベンシュタイン距離を計算します。

levenshtein(text source, text target, int ins_cost, int del_cost, int sub_cost) returns int
levenshtein(text source, text target) returns int
levenshtein_less_equal(text source, text target, int ins_cost, int del_cost, int sub_cost, int max_d) returns int
levenshtein_less_equal(text source, text target, int max_d) returns int

source および target は255バイトまでの任意の非NULL文字列を取ることができます。 コストパラメータはそれぞれ、文字の挿入、削除、置換に負わせる文字数を指定します。 この関数の2番目のバージョンのようにコストパラメータを省略することができます。 この場合デフォルトですべて1になります。 levenshtein_less_equal は距離の小さい値についてのlevenshtein関数の高速化版です。 実際の距離がmax_dより小さいまたは等しい場合、 levenshtein_less_equal はその正確な値を返します。 さもなくば、この関数はmax_dより大きな値を返します。

以下に例を示します。

test=# SELECT levenshtein('GUMBO', 'GAMBOL');
 levenshtein
-------------
           2
(1 row)

test=# SELECT levenshtein('GUMBO', 'GAMBOL', 2,1,1);
 levenshtein
-------------
           3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',2);
 levenshtein_less_equal
------------------------
                      3
(1 row)

test=# SELECT levenshtein_less_equal('extensive', 'exhaustive',4);
 levenshtein_less_equal
------------------------
                      4
(1 row)

F.15.3. Metaphone

Metaphoneは、Soundex同様、入力文字に対する対応するコードを構築するという考えに基づいたものです。 2つの文字列が同一コードを持つ場合、類似とみなされます。

以下の関数は入力文字列に対するmetaphoneコードを計算します。

metaphone(text source, int max_output_length) returns text

source は255文字までの非NULL文字列を取ることができます。 max_output_length は出力metaphoneコードの最大長を設定します。 出力は長すぎるとこの長さに切り詰められます。

以下に例を示します。

test=# SELECT metaphone('GUMBO', 4);
 metaphone
-----------
 KM
(1 row)

F.15.4. Double Metaphone

Double Metaphoneシステムは与えられた入力文字列に対する、 "primary" "alternate" という2つの "似たように見える" 文字列を計算します。 ほとんどの場合、これらは同じですが、英語以外の名称では特に発音に応じて多少異なる場合があります。 以下の関数はprimaryコードとalternateコードを計算します。

dmetaphone(text source) returns text
dmetaphone_alt(text source) returns text

入力文字列長に関する制限はありません。

以下に例を示します。

test=# select dmetaphone('gumbo');
 dmetaphone
------------
 KMP
(1 row)

powered by SEO.CUG.NET