PHP で Soundex を使って類似発音の単語をグループ化する

2024-06-17

PHP での Soundex 文字列処理

PHP には、soundex() という組み込み関数が用意されており、このアルゴリズムを実装しています。この関数は、文字列を渡すと、その文字列の Soundex コードを返します。Soundex コードは、4 文字の英数字列で、先頭の文字と、その後に続く 3 つの音節を表します。

Soundex コードを計算するには、次の手順に従います。

  1. 文字列の先頭文字を大文字に変換します。
  2. 以下の表に従って、文字列の残りの部分をエンコードします。
文字エンコード
AA
BB
CC
DD
EE
FF
GG
HH
I
JJ
KK
LL
MM
NN
OO
PP
QQ
RR
SS
TT
UU
VV
WW
XX
YY
ZZ
  1. 同じ音節コードが連続する場合は、最初のコードのみを残します。
  2. コードが 4 文字に達するまで、2 と 3 の手順を繰り返します。
  3. コードの長さが 4 文字未満の場合は、末尾に 0 を追加します。

以下の例は、soundex() 関数の使用方法を示しています。

<?php

$str1 = "Ashcraft";
$str2 = "Ashcraft";
$str3 = "Ashcraft Jr.";

$soundex1 = soundex($str1);
$soundex2 = soundex($str2);
$soundex3 = soundex($str3);

echo "Ashcraft の Soundex コード: $soundex1\n";
echo "Ashcraft の Soundex コード: $soundex2\n";
echo "Ashcraft Jr. の Soundex コード: $soundex3\n";

?>

このコードを実行すると、次の出力が表示されます。

Ashcraft の Soundex コード: A-261
Ashcraft の Soundex コード: A-261
Ashcraft Jr. の Soundex コード: A-261

上記の例では、AshcraftAshcraft Jr. は同じ発音であるため、同じ Soundex コードが生成されます。

Soundex は、さまざまなアプリケーションで使用できます。以下に、いくつかの例を示します。

  • 言語学研究: Soundex を使用して、さまざまな言語の音声パターンを研究することができます。

Soundex は、完全な発音インデックスではありません。いくつかの制限があります。

  • Soundex は英語でのみ機能します。他の言語には、独自の Soundex アルゴリズムが必要になる場合があります。
  • Soundex は、発音が似ているすべての単語を一致させるわけではありません。たとえば、"Ashcraft" と "Eisencraft" は同じ Soundex コードを持っていますが、発音は異なります。
  • Soundex は、頭文字が異なる単語を一致させることができません。たとえば、"Ashcraft" と "Craft" は異なる Soundex コードを持っています。


Soundex アルゴリズムの実装

<?php

function soundex($str) {
  // 文字列を大文字に変換
  $str = strtoupper($str);

  // 文字列の先頭文字を抽出
  $firstChar = $str[0];

  // 残りの文字列を処理
  $remainingChars = substr($str, 1);
  $encodedChars = "";

  // 各文字をエンコード
  for ($i = 0; $i < strlen($remainingChars); $i++) {
    $ch = $remainingChars[$i];
    $encodedChar = encodeChar($ch);

    // 同じ音節コードが連続する場合は、最初のコードのみを残す
    if ($i > 0 && $encodedChar == $encodedChars[strlen($encodedChars) - 1]) {
      continue;
    }

    $encodedChars .= $encodedChar;
  }

  // コードが 4 文字に達するまでエンコードを続ける
  while (strlen($encodedChars) < 4) {
    $encodedChars .= "0";
  }

  // 先頭文字とエンコードされた文字列を結合して Soundex コードを返す
  return $firstChar . $encodedChars;
}

function encodeChar($ch) {
  switch ($ch) {
    case "A":
    case "E":
    case "I":
    case "O":
    case "U":
      return "";
    case "B":
    case "F":
    case "P":
      return "1";
    case "C":
    case "G":
    case "J":
    case "K":
    case "Q":
    case "S":
    case "X":
      return "2";
    case "D":
    case "T":
      return "3";
    case "L":
      return "4";
    case "M":
    case "N":
      return "5";
    case "R":
      return "6";
    case "V":
      return "8";
    case "W":
      if ($i > 0 && $encodedChars[strlen($encodedChars) - 1] != "7") {
        return "7";
      }
      break;
    case "Y":
      if ($i > 0 && $encodedChars[strlen($encodedChars) - 1] != "7") {
        return "7";
      }
      break;
    default:
      return $ch;
  }
}

// 例
$str1 = "Ashcraft";
$str2 = "Ashcraft";
$str3 = "Ashcraft Jr.";

$soundex1 = soundex($str1);
$soundex2 = soundex($str2);
$soundex3 = soundex($str3);

echo "Ashcraft の Soundex コード: $soundex1\n";
echo "Ashcraft の Soundex コード: $soundex2\n";
echo "Ashcraft Jr. の Soundex コード: $soundex3\n";

?>

このコードを実行すると、以下の出力が表示されます。

Ashcraft の Soundex コード: A-261
Ashcraft の Soundex コード: A-261
Ashcraft Jr. の Soundex コード: A-261

このコードは、soundex() 関数と同じ結果を生成します。ただし、このコードは、Soundex アルゴリズムがどのように機能するかを理解するのに役立ちます。



    Soundex の代替手段

    Soundex の制限:

    • 英語でのみ機能します。
    • すべての発音が似ている単語を一致させるわけではありません。
    • 頭文字が異なる単語を一致させることができません。

    これらの制限により、Soundex に代わるアルゴリズムを検討する必要がある場合があります。 Soundex の代替手段として検討すべきいくつかのオプションは次のとおりです:

    NYSIIS (New York State Identification System for Indexing) は、Soundex に似たアルゴリズムですが、より多くの言語をサポートし、より正確な結果を生成するように設計されています。 NYSIIS は、主に姓の索引付けに使用されます。

    Metaphone は、もう 1 つの発音インデックス アルゴリズムで、Soundex よりも正確で、より多くの言語をサポートするように設計されています。 Metaphone は、特に姓の綴り間違いの修正に役立ちます。

    Phonex は、3 番目の発音インデックス アルゴリズムで、Soundex や Metaphone よりもシンプルで、処理速度が速くなります。 Phonex は、主に姓の索引付けに使用されます。

    Double Metaphone は、Metaphone の改良版であり、より正確で包括的な結果を生成するように設計されています。 Double Metaphone は、特に姓の綴り間違いの修正に役立ちます。

    コードウェイ:

    Codeway は、発音に基づいた文字列の索引付けに使用できる別のアルゴリズムです。 Codeway は、Soundex、Metaphone、Phonexよりもシンプルで、処理速度が速くなります。

    最適なアルゴリズムの選択:

    使用するのに最適なアルゴリズムは、特定のニーズによって異なります。 考慮すべき要素には、次のものがあります。

    • サポートされている言語
    • 必要とされる精度
    • 処理速度
    • アプリケーション

    Soundex の代替手段について詳しく知りたい場合は、次のリソースを参照してください。

      • 音声認識: 音声認識システムは、音声を入力として受け取り、テキストに変換することができます。 音声認識は、発音に基づいて単語を索引付けするために使用できます。