【PHP8.x】soundex関数の使い方

soundex関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

soundex関数は、与えられた文字列に対してSoundexアルゴリズムを適用し、そのSoundexキーを計算して返す関数です。Soundexアルゴリズムは、主に英語圏の単語や名前の発音が似ているものを、スペルの違いにかかわらず同じ短いコードに変換するために考案されました。これにより、「Robert」と「Rupert」のように発音が近いがスペルが異なる単語を、同じキーで検索したり、グループ化したりすることが可能になります。

この関数は、入力された文字列の最初の一文字を保持し、続くアルファベットの子音を特定の数値に置き換えていきます。母音(A, E, I, O, U, Y)やH、Wは無視され、隣接する同じ数字の子音は一つにまとめられます。最終的に、最初の一文字のアルファベットに3桁の数字が続く、合計4文字のSoundexキーが生成されます。例えば、多くのケースで「Robert」も「Rupert」も「R163」といったキーを生成します。

主な用途としては、データベースにおけるあいまい検索、重複データの検出、または音声学的な比較が必要な場面で利用されます。ただし、Soundexは英語に特化したアルゴリズムであるため、日本語やその他の言語の文字列に対しては期待通りの結果が得られない場合があります。この関数はPHP 8以降の環境で利用できます。

構文(syntax)

1<?php
2soundex(string $string): string;
3?>

引数(parameters)

string $string

  • string $string: サウンドデックスコードに変換する文字列

戻り値(return)

string

指定された文字列のSoundexアルゴリズムによるコード表現である文字列を返します。

サンプルコード

PHP soundexとmetaphoneを比較する

1<?php
2
3/**
4 * soundex() および metaphone() 関数の比較を行います。
5 *
6 * soundex() は、主に英語の単語を基に同音の単語に同じコードを割り当てます。
7 * スペルの違いによらず、発音が似ている単語を識別するのに使われます。
8 *
9 * metaphone() は、より高度な発音アルゴリズムで、
10 * soundex() よりも英語の発音規則を考慮し、より正確な同音異義語の識別を目指します。
11 *
12 * @param string $word 比較する単語
13 */
14function comparePhoneticAlgorithms(string $word): void
15{
16    // soundex() 関数を呼び出し、その結果を変数に格納します。
17    $soundexCode = soundex($word);
18
19    // metaphone() 関数を呼び出し、その結果を変数に格納します。
20    $metaphoneCode = metaphone($word);
21
22    // 元の単語とそれぞれの関数の結果を出力します。
23    echo "Word:        " . $word . PHP_EOL;
24    echo "  Soundex:   " . $soundexCode . PHP_EOL;
25    echo "  Metaphone: " . $metaphoneCode . PHP_EOL;
26    echo PHP_EOL; // 区切りのための改行
27}
28
29// 比較対象となる単語のリスト。
30// 発音が似ている、またはスペルが異なるが発音が似ている単語を含めます。
31$wordsToCompare = [
32    "hello",    // 基本的な単語
33    "hallo",    // "hello" と発音が似ている
34    "smith",    // 姓の例
35    "smyth",    // "smith" と発音が似ている姓の例
36    "phone",    // "ph" の発音を持つ単語
37    "fone",     // "f" の発音を持つ単語
38    "quick",    // "qu" の発音を持つ単語
39    "kwic",     // "quick" と発音が似ている単語
40    "Robert",   // 人名の例
41    "Rupert",   // "Robert" と Soundex が同じになる人名の例
42    "Euler",    // 異なるスペルだが発音が似ている例
43    "Ellery",   // "Euler" と Soundex が同じになる例
44    "Knuth",    // 無音の "K" を含む単語
45    "Knut",     // "Knuth" と発音が似ている単語
46];
47
48// 各単語について soundex と metaphone の結果を比較表示します。
49foreach ($wordsToCompare as $word) {
50    comparePhoneticAlgorithms($word);
51}
52

PHPのsoundex関数は、与えられた英単語の発音を基に、4文字のコードを生成する機能を提供します。引数にはコード化したい文字列(string $string)を渡し、戻り値としてその発音コード(string)が返されます。この関数は、スペルが多少異なっていても発音が似ている単語を識別する際に役立ちます。

一方、metaphone関数も単語の発音コードを生成しますが、soundexよりもさらに高度な英語の発音規則を考慮したアルゴリズムを使用しており、より正確に同音異義語を識別することを目指しています。

提示されたサンプルコードでは、comparePhoneticAlgorithms関数を用いて、「hello」と「hallo」、「smith」と「smyth」のように、発音が似ている複数の単語に対し、soundexmetaphoneの両方のコードを生成し、その結果を比較しています。この比較を通じて、それぞれの関数がどのように発音の類似性を捉え、異なる、あるいは同じコードを生成するのかを具体的に確認できます。これらの関数は、例えば、検索機能でスペルミスを許容したり、データベース内で類似する単語をグループ化したりする際に活用されます。

soundex()関数は主に英語の単語の発音を基に類似コードを生成しますが、より単純なアルゴリズムです。そのため、より高度な英語の発音規則を考慮し、高い精度で同音異義語を識別したい場合は、metaphone()関数を検討してください。どちらの関数も英語に特化しているため、日本語などの英語以外の言語の単語には、期待する結果が得られないことに注意が必要です。これらの関数は、スペルミスを許容する検索機能や、似たような名前の重複チェックなど、発音に基づいた比較が必要な場合に有用ですが、完璧な一致を保証するものではありません。利用目的に応じて適切に選択し、結果を慎重に評価することが重要です。

PHP soundex()関数で発音類似度を判定する

1<?php
2
3/**
4 * soundex関数の基本的な使用方法を示すサンプルコード。
5 *
6 * soundex関数は、与えられた文字列のSoundexキーを計算します。
7 * Soundexキーは、英語の単語の発音をアルファベットと数字の組み合わせで表現するもので、
8 * スペルが異なっていても発音が似ている単語は同じキーを生成する傾向があります。
9 * これにより、スペルミスのある名前や単語の検索、類似する単語のグループ化に役立ちます。
10 */
11function demonstrateSoundex(): void
12{
13    echo "--- PHP soundex() 関数デモ ---" . PHP_EOL . PHP_EOL;
14
15    // 例1: 発音が似ている単語のSoundexキーを比較します。
16    // "Robert" と "Rupert" は発音が似ているため、同じSoundexキーを生成します。
17    $word1_1 = "Robert";
18    $word1_2 = "Rupert";
19    echo "元の単語: '{$word1_1}' の Soundex キー: " . soundex($word1_1) . PHP_EOL; // R163
20    echo "元の単語: '{$word1_2}' の Soundex キー: " . soundex($word1_2) . PHP_EOL; // R163
21    echo "結果: これらの単語は同じSoundexキーを持っています。" . PHP_EOL . PHP_EOL;
22
23    // 例2: スペルは異なるが発音が似ている別の単語ペア。
24    // "Cohen" と "Cohn" も発音が似ており、同じキーを生成することが期待されます。
25    $word2_1 = "Cohen";
26    $word2_2 = "Cohn";
27    echo "元の単語: '{$word2_1}' の Soundex キー: " . soundex($word2_1) . PHP_EOL; // C500
28    echo "元の単語: '{$word2_2}' の Soundex キー: " . soundex($word2_2) . PHP_EOL; // C500
29    echo "結果: これらの単語も同じSoundexキーを持っています。" . PHP_EOL . PHP_EOL;
30
31    // 例3: 全く異なる単語のSoundexキーを比較します。
32    // "Apple" と "Banana" は発音が異なるため、異なるSoundexキーを生成します。
33    $word3_1 = "Apple";
34    $word3_2 = "Banana";
35    echo "元の単語: '{$word3_1}' の Soundex キー: " . soundex($word3_1) . PHP_EOL; // A140
36    echo "元の単語: '{$word3_2}' の Soundex キー: " . soundex($word3_2) . PHP_EOL; // B500
37    echo "結果: これらの単語は異なるSoundexキーを持っています。" . PHP_EOL . PHP_EOL;
38
39    // 例4: 数字や特殊文字を含む文字列の場合、Soundexは主にアルファベット部分を処理します。
40    $mixedString = "S1mpson";
41    echo "元の単語: '{$mixedString}' の Soundex キー: " . soundex($mixedString) . PHP_EOL; // S525
42    echo "結果: 数字はSoundexキーの計算に直接は影響しませんが、最初の文字は使用されます。" . PHP_EOL . PHP_EOL;
43
44    // 例5: 空文字列を渡した場合、PHP 8では空のキーを返します。
45    $emptyString = "";
46    echo "元の単語: '{$emptyString}' (空文字列) の Soundex キー: '" . soundex($emptyString) . "'" . PHP_EOL;
47    echo "結果: 空文字列は空のSoundexキーを生成します。" . PHP_EOL;
48}
49
50// soundex関数のデモンストレーションを実行します。
51demonstrateSoundex();

PHP 8のsoundex関数は、与えられた英単語の発音に基づいた「Soundexキー」と呼ばれるアルファベットと数字の組み合わせの文字列を生成します。このキーは、スペルが異なっていても発音が似ている単語に対して、同じまたは非常に近いキーを生成する特性を持っています。これにより、システム内でスペルミスのある名前や単語を検索する際、発音が似ている候補を見つけ出すのに役立ちます。例えば、「Robert」と「Rupert」のように発音が似ている単語は、「R163」という同じSoundexキーを生成します。

本関数は、Soundexキーを計算したいstring型の文字列を引数として受け取り、計算されたstring型のSoundexキーを返します。空の文字列を引数として渡した場合は、空のSoundexキーが返されます。また、数字や特殊文字を含む文字列の場合でも、Soundexアルゴリズムは主にアルファベット部分を処理し、最初の文字はキーの先頭として使用されます。この機能は、特に英語圏の名前のデータベース検索などで有効に活用できます。

soundex関数は、英語の発音に基づいたキーを生成するため、日本語などの英語以外の言語には適用できません。主にスペルミスの可能性のある英単語や名前の検索、または発音が似ている単語のグループ化に利用されますが、完全な一致や高精度な発音比較を保証するものではなく、あくまで近似的な結果を返します。入力文字列に数字や記号が含まれていてもエラーにはなりませんが、キーの生成には主にアルファベット部分が考慮されます。また、空の文字列を引数に渡すと、PHP 8では空のSoundexキーが返される点にご注意ください。より厳密なテキスト類似度判定が必要な場合は、他のより高度なアルゴリズムも検討すると良いでしょう。

関連コンテンツ