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

作成日: 更新日:

metaphone関数は、入力された英語の文字列の発音に基づいたユニークなキーを生成する関数です。このキーは「metaphoneキー」と呼ばれ、単語のスペルが多少異なっていても発音が似ている単語を効率的に見つけ出す検索機能や、文字列の比較に非常に役立ちます。例えば、スペルミスのある検索クエリに対して、正しい単語や発音が近い単語を提示するといった用途で利用できます。

この関数は、最初の引数としてキーを生成したい元の文字列(string $string)を受け取ります。2番目の引数(int $phonemes)はオプションで、生成されるmetaphoneキーの最大長を指定するために使用します。この引数を0(ゼロ)に設定すると、キーの長さに制限は設けられません。関数が正常に実行されると、生成されたmetaphoneキーを表す文字列が戻り値として返されます。

metaphone関数は、英語の発音規則に基づいてキーを生成するため、主に英語の単語に対して有効です。日本語などの非英語圏の文字列に適用しても、期待する結果は得られない点に留意してください。

基本的な使い方

構文(syntax)

string|false metaphone(string $string, int $max_phonemes = 0)

引数(parameters)

string $string, int $max_phonemes = 0

  • string $string: メタフォンアルゴリズムを適用する対象の文字列
  • int $max_phonemes = 0: 生成する音素の最大数。0を指定すると、すべての音素が生成されます

戻り値(return)

string

metaphone関数は、入力された文字列をメタフォンアルゴリズムに基づいて変換した結果を文字列として返します。

サンプルコード

PHP metaphone関数で音響キーを生成する

<?php

/**
 * このスクリプトは、PHPのmetaphone関数を使用して単語の音響キーを生成する方法を示します。
 * metaphone関数は、似た発音を持つ単語を比較するために役立つ、文字列の音響的な表現を計算します。
 *
 * @param string $word 入力する単語
 * @param int $maxPhonemes 生成するmetaphoneキーの最大長。0を指定すると制限なし。
 */
function demonstrateMetaphone(string $word, int $maxPhonemes = 0): void
{
    echo "元の単語: \"{$word}\"\n";
    if ($maxPhonemes > 0) {
        $metaphoneKey = metaphone($word, $maxPhonemes);
        echo "Metaphoneキー (最大 {$maxPhonemes} 音素): \"{$metaphoneKey}\"\n";
    } else {
        $metaphoneKey = metaphone($word);
        echo "Metaphoneキー (制限なし): \"{$metaphoneKey}\"\n";
    }
    echo "--------------------\n";
}

// metaphone関数の使用例
demonstrateMetaphone("hello");
demonstrateMetaphone("hallo"); // "hello" と似た発音の単語
demonstrateMetaphone("programming");
demonstrateMetaphone("program", 5); // 最大音素数を5に制限
demonstrateMetaphone("computer");
demonstrateMetaphone("komputer", 4); // 最大音素数を4に制限
demonstrateMetaphone("php");

?>

PHPのmetaphone関数は、指定された単語の発音に基づく音響キーを生成するための関数です。これは、スペルが異なっていても発音が似ている単語を識別する際に非常に役立ちます。例えば、検索システムなどでユーザーが入力した単語が少し間違っていても、関連性の高い結果を返したい場合に活用できます。

この関数は二つの引数を取ります。最初の引数$stringには、音響キーを生成したい元の単語を文字列型で渡します。二番目の引数$max_phonemesはオプションで、整数型で音響キーの最大長を指定します。デフォルト値は0で、この場合はキーの長さに制限がありません。関数は最終的に、生成された音響キーを文字列として返します。

サンプルコードでは、demonstrateMetaphone関数を通じてmetaphone関数の使い方を示しています。複数の異なる単語で音響キーを生成し、"hello""hallo"のように発音が似た単語が似たキーを持つことを確認できます。また、$max_phonemes引数を活用し、キーの長さを制限する例も含まれています。これにより、必要に応じてキーの長さを調整できることがわかります。

metaphone関数は、主に英語の発音に基づいて単語の音響キーを生成し、発音が似た単語を比較する目的で利用されます。生成されるキーは単語の完全な発音を示すものではなく、あくまで比較用の短い文字列です。第二引数でキーの最大長を指定しない場合(または0を指定した場合)、キーは可変長となります。数値を指定するとその長さに切り詰められるため、短すぎると単語ごとの識別性が低下する可能性があります。この関数は主に英語圏の単語に適用され、日本語など他の言語では期待通りの結果が得られないことがあります。また、比較的古いアルゴリズムであるため、より複雑な音響的類似度判定には、別の高度なアルゴリズムの検討も視野に入れると良いでしょう。

PHPのmetaphone関数とsoundex関数を比較する

<?php

/**
 * 与えられた単語に対して soundex と metaphone の音声キーを比較して表示します。
 *
 * @param string $word 比較する単語。
 * @return void
 */
function comparePhoneticKeys(string $word): void
{
    // soundex は英語の単語に対して4文字の音声コードを生成します。
    // 同じ発音の単語でも異なるコードになることがあります。
    $soundexKey = soundex($word);

    // metaphone は soundex よりも一般的に英語の単語に対して正確な音声キーを生成します。
    // 第二引数 (max_phonemes = 0) はキーの長さに制限がないことを意味します。
    $metaphoneKey = metaphone($word);

    echo "単語: '{$word}'\n";
    echo "  Soundex キー: '{$soundexKey}'\n";
    echo "  Metaphone キー: '{$metaphoneKey}'\n";
    echo "\n";
}

// --- デモンストレーション ---

// soundex と metaphone キーの比較の開始を知らせるヘッダー
echo "--- Soundex と Metaphone キーの比較 ---\n\n";

// 例1: 似たような発音だが綴りが異なる単語
comparePhoneticKeys("phone");
comparePhoneticKeys("fone");

// 例2: 一般的なスペルミス
comparePhoneticKeys("receive");
comparePhoneticKeys("recieve");

// 例3: 綴りは異なるが発音が似ている単語 (例: アメリカ英語とイギリス英語)
comparePhoneticKeys("color");
comparePhoneticKeys("colour");

// 例4: より複雑な単語とその発音の近似
comparePhoneticKeys("knowledge");
comparePhoneticKeys("nolej"); // 大まかな発音の近似綴り

// --- metaphone の max_phonemes 引数の使用例 ---

echo "--- metaphone の max_phonemes (キーの長さ制限) の例 ---\n\n";

$longWord = "internationalization";
echo "元の単語: '{$longWord}'\n";
echo "  metaphone キー (制限なし): '" . metaphone($longWord) . "'\n";
// metaphone キーを最大5文字に制限して生成
echo "  metaphone キー (最大5文字): '" . metaphone($longWord, 5) . "'\n";
echo "\n";

// デモンストレーションの終了を知らせるフッター
echo "-------------------------------------------\n";

?>

PHPのmetaphone関数は、与えられた単語の発音に基づいた「音声キー」と呼ばれる文字列を生成する機能を提供します。この音声キーは、スペルが異なっていても発音が似ている単語を特定する際に非常に有用で、例えば検索システムで入力ミスのある単語でも、発音を手がかりに関連性の高い結果を見つける用途などに利用されます。

この関数は、第一引数に音声キーを生成したい単語をstring型で指定します。第二引数$max_phonemesint型で、生成される音声キーの最大長を指定します。デフォルト値の0を設定すると、キーの長さに制限がなくなります。戻り値としては、生成された音声キーがstring型で返されます。

PHPにはsoundexという似た機能を持つ関数もありますが、metaphoneは一般的に英語の単語に対して、より正確な音声キーを生成するとされています。提供されたサンプルコードでは、「phone」と「fone」のようにスペルは異なるが発音が似ている単語や、「receive」と「recieve」のようなスペルミスのある単語に対して、soundexmetaphoneの音声キーを比較しています。これにより、metaphoneが類似した発音の単語に対して、より一貫性のあるキーを生成する傾向があることがわかります。また、max_phonemes引数を使用することで、生成される音声キーの長さを制御できることも示されています。

metaphone関数は、与えられた単語の英語の発音に基づいたキーを生成し、soundexと比較して一般的に高い精度を持っています。主にスペルミス検出や発音が似た単語の検索・グルーピングに利用されます。この関数は英語の音韻規則に特化しており、日本語など他の言語では期待する結果が得られない点に留意が必要です。

第二引数のmax_phonemesは、生成されるキーの最大長を指定できます。0を指定すると長さに制限はありません。キーの長さを制限することで比較の柔軟性が向上しますが、短すぎると異なる単語も同じキーとして扱われる可能性が高まります。これらの特性を理解し、目的に応じて適切に活用してください。

【PHP8.x】metaphone関数の使い方 | いっしー@Webエンジニア