Hatena::Groupchris4403

rm -Rf

 | 

2010-03-25

mysqlのsoundex

| 23:47 | mysqlのsoundex - rm -Rf を含むブックマーク はてなブックマーク - mysqlのsoundex - rm -Rf

以前に参加していたIIR輪講で自分が担当したパートにsoundexというものが紹介されていました。

これは単語をあるルールにしたがって、発音を記号化したハッシュを生成してindexとするものです。IIRの中で紹介されていたのは次のようなルールでした。

1.最初の文字を残す。

2.次の文字をすべて0に置き換える : A, E, I, O,U, H, W, Y

3.以下の文字を数字に置き換える

B, F, P, V to 1.

C, G, J, K, Q, S, X, Z to 2.

D, T to 3.

L to 4.

M, N to 5.

R to 6.

4. 連続した同じ数字のうち1つを取り除いていくことを繰り返す。

5. 0を結果の文字列から削除する。ゼロ詰めして、最初の4文字を取得する。その文字列は、最初がアルファベットで3つの数字が連続したものになっている。

このルールに従うと、Hermannという単語からはH655という文字列が生成されます。このsoudexを使うと、同じ発音、似た発音の文字列を検索できます。

mysqlマニュアルを眺めていたら、このsoundexがアルファベット限定ですが、利用できると書いてあったので、ちょっと試してみました。

セットアップ

soundex_testというdatabaseにdataというテーブルを作成して、いくつか単語を入れておきます。

create database soundex_test;
use soundex_test;
create table data (
  word VARCHAR(255)
);
INSERT INTO data VALUES('mouth');
INSERT INTO data VALUES('nose');
INSERT INTO data VALUES('north');
INSERT INTO data VALUES('air');
INSERT INTO data VALUES('bare');
INSERT INTO data VALUES('buy');
INSERT INTO data VALUES('bye');

soundexを使ってselect

あとはsounds like構文を使って検索するだけです。

mysql> select * from data where word sounds like 'bear';
+------+
| word |
+------+
| bare |
+------+
1 row in set (0.01 sec)

bearと同じ発音のbareが抽出できました。

mysql> select * from data where word sounds like 'by';
+------+
| word |
+------+
| buy  |
| bye  |
+------+
2 rows in set (0.01 sec)

もちろん複数の結果も返ってきます。

異なる綴りで同じような発音のバリエーションが発生しやすい人名などの検索に役立ちそうです。

 |