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

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

作成日: 更新日:

基本的な使い方

levenshtein関数は、2つの文字列間の類似度を数値で示す「レーベンシュタイン距離」を計算する関数です。レーベンシュタイン距離とは、ある文字列を別の文字列に変換するために必要な、単一文字の挿入、削除、または置換といった操作の最小回数を指します。この距離の値が小さいほど、比較対象の2つの文字列はより似ていると判断できます。

この関数は、主にスペルチェック機能の実装や、入力されたキーワードの曖昧なマッチングを行う際などに非常に役立ちます。例えば、ユーザーが「aple」と入力した場合に、最も近い「apple」を提案するといった用途に利用できます。

levenshtein関数は、まず比較したい最初の文字列と二番目の文字列を必須の引数として受け取ります。さらに、オプションとして、文字の挿入、置換、削除にかかるコストをそれぞれ個別の整数値で指定することも可能です。これにより、特定の操作に対して異なる重み付けを行い、より柔軟な類似度計算を行うことができます。

関数は計算されたレーベンシュタイン距離を整数値で返します。文字列の長さが255文字を超える場合や、その他の無効な引数が与えられた場合には、エラーを示す-1が返される点に注意が必要です。PHP 8環境において、文字列の類似度を効率的に評価するための強力なツールとして活用できます。

構文(syntax)

1<?php
2$string1 = "kitten";
3$string2 = "sitting";
4$distance = levenshtein($string1, $string2);
5?>

引数(parameters)

string $string1, string $string2, int $insertion_cost = 1, int $replacement_cost = 1, int $deletion_cost = 1

  • string $string1: 比較対象となる最初の文字列
  • string $string2: 比較対象となる2番目の文字列
  • int $insertion_cost = 1: 文字列1から文字列2へ挿入する際のコスト(デフォルトは1)
  • int $replacement_cost = 1: 文字列1の文字を文字列2の文字へ置換する際のコスト(デフォルトは1)
  • int $deletion_cost = 1: 文字列1から文字を削除する際のコスト(デフォルトは1)

戻り値(return)

int

levenshtein関数の戻り値は、2つの文字列のレーベンシュタイン距離を表す整数です。レーベンシュタイン距離とは、一方の文字列をもう一方の文字列に変換するために必要な、挿入、削除、置換の最小回数を示します。

サンプルコード

PHP levenshtein関数で文字列距離を計算する

1<?php
2
3/**
4 * levenshtein関数の使用例を示すスクリプト。
5 * この関数は、2つの文字列間のレーベンシュタイン距離(編集距離)を計算します。
6 * レーベンシュタイン距離とは、一方の文字列をもう一方に変換するために必要な、
7 * 最小限の単一文字編集(挿入、削除、置換)操作の数を表します。
8 */
9
10// 比較する文字列を定義します。
11$string1 = "kitten";
12$string2 = "sitting";
13$string3 = "sittin";
14
15echo "--- 基本的なレーベンシュタイン距離の計算 (デフォルトコスト) ---" . PHP_EOL;
16
17// デフォルトのコスト(挿入、置換、削除がそれぞれ1)でレーベンシュタイン距離を計算します。
18// 'kitten' を 'sitting' にするには、'k'->'s', 'e'->'i', 'n'->'g' の3回の置換が必要です。
19$distanceDefault = levenshtein($string1, $string2);
20echo "文字列 '{$string1}' と '{$string2}' のレーベンシュタイン距離: {$distanceDefault}" . PHP_EOL;
21
22// 'kitten' を 'sittin' にするには、'k'->'s', 'e'->'i' の2回の置換が必要です。
23$distanceDefault2 = levenshtein($string1, $string3);
24echo "文字列 '{$string1}' と '{$string3}' のレーベンシュタイン距離: {$distanceDefault2}" . PHP_EOL;
25
26echo PHP_EOL . "--- カスタムコストでのレーベンシュタイン距離の計算 ---" . PHP_EOL;
27
28// カスタムコストを指定してレーベンシュタイン距離を計算します。
29// 例として、置換コストを高く設定し、置換操作の「重み」を増やしてみます。
30$insertionCost   = 1;  // 文字の挿入にかかるコスト
31$replacementCost = 10; // 文字の置換にかかるコスト
32$deletionCost    = 1;  // 文字の削除にかかるコスト
33
34$distanceCustom = levenshtein($string1, $string2, $insertionCost, $replacementCost, $deletionCost);
35echo "文字列 '{$string1}' と '{$string2}' のレーベンシュタイン距離 (カスタムコスト: 挿入={$insertionCost}, 置換={$replacementCost}, 削除={$deletionCost}): {$distanceCustom}" . PHP_EOL;
36
37echo PHP_EOL . "--- その他の例 ---" . PHP_EOL;
38
39// 同じ文字列の場合の距離は0になります。
40$strA = "php";
41$strB = "php";
42$distanceSame = levenshtein($strA, $strB);
43echo "文字列 '{$strA}' と '{$strB}' のレーベンシュタイン距離 (デフォルトコスト): {$distanceSame}" . PHP_EOL;
44
45// 挿入が必要な場合の例 ('php' から 'phps' へは 's' の挿入1回)
46$strC = "phps";
47$distanceInsert = levenshtein($strA, $strC);
48echo "文字列 '{$strA}' と '{$strC}' のレーベンシュタイン距離 (デフォルトコスト): {$distanceInsert}" . PHP_EOL;
49
50// 削除が必要な場合の例 ('phps' から 'php' へは 's' の削除1回)
51$distanceDelete = levenshtein($strC, $strA);
52echo "文字列 '{$strC}' と '{$strA}' のレーベンシュタイン距離 (デフォルトコスト): {$distanceDelete}" . PHP_EOL;

levenshtein関数は、PHP 8で利用できる文字列操作関数の一つで、二つの文字列間のレーベンシュタイン距離を計算します。レーベンシュタイン距離とは、一方の文字列をもう一方の文字列に変換するために必要な、最小限の単一文字編集操作(文字の挿入、削除、または置換)の数を指します。

この関数は、比較対象となるstring1string2の二つの文字列を引数として受け取ります。加えて、オプションでinsertion_cost(文字の挿入にかかるコスト)、replacement_cost(文字の置換にかかるコスト)、deletion_cost(文字の削除にかかるコスト)を整数値で指定できます。これらのコストを省略した場合、デフォルト値としてそれぞれ1が設定されます。関数の戻り値は、計算されたレーベンシュタイン距離を示す整数値です。

サンプルコードでは、「kitten」と「sitting」のように異なる文字列間の距離を計算し、一方をもう一方に変換するために必要な編集操作の回数を確認しています。デフォルトのコスト設定(すべての操作が1)では、3回の操作で「kitten」を「sitting」に変換できることが示されています。また、カスタムコストを設定する例では、例えば置換コストを高く設定することで、置換操作の「重み」を変えて距離の計算結果がどのように変化するかを把握できます。これにより、システムの要件に応じて特定の編集操作をより重要視した距離を算出することが可能です。同じ文字列同士の距離は0となり、文字の挿入や削除のみで変換できる場合の距離も明確に算出されます。

levenshtein関数は、2つの文字列間の「レーベンシュタイン距離(編集距離)」を計算し、一方をもう一方に変換するために必要な最小限の編集操作(挿入、削除、置換)の回数を整数で返します。この距離が小さいほど、文字列は類似していると判断できます。引数では、比較する2つの文字列に加えて、挿入、置換、削除の各操作にかかるコストを数値で指定できます。デフォルトはすべて1ですが、コストを調整することで特定の操作の重みを変更することが可能です。この関数は文字列の大文字・小文字を区別して処理しますので、必要に応じてstrtolowerなどの関数で事前に揃えることを検討してください。非常に長い文字列を比較する場合、計算に時間がかかる可能性があるため、パフォーマンスには注意が必要です。

関連コンテンツ