関数・クラス解説

levenshtein

version:PHP 4 >= 4.0.1, PHP 5, PHP 7 (公式)

2つの文字列のレーベンシュタイン距離を算出する

フォーマット

int : levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del )

パラメータ

string $str1 (必須)
計算したい文字列1。255文字まで指定可能
string $str2 (必須)
計算したい文字列2。255文字まで指定可能
int $cost_ins
挿入のコストを指定
int $cost_rep (cost_ins が指定されている場合必須)
置換のコストを指定
int $cost_del (cost_ins が指定されている場合必須)
削除のコストを指定

返値 int
指定された2つの文字列のレーベンシュタイン距離を返却。$str1 あるいは $str2 の場合は-1 が返る

解説

レーベンシュタイン距離とは、二つの文字列がどの程度異なっているかを示す指標のひとつです。2つの文字列を同じにするために、”最小で”どの程度の置換・削除・挿入の作業を行わなければいけないかを計算します。
言い換えると、この数値が小さいほど2つの文字列が近いといえます。スペルチェッカーや、検索エンジンの入力ミス時でも正しい単語で検索させる場合などに利用できます。

記述サンプル

//PHP 7.4.6で実行
// 実行
echo levenshtein("abcdefghi", "abcDefgzi") ;

// 結果
2

/* ----------------------------- */

//公式より
// スペルミスした単語を入力します
$input = 'carrrot';

// チェックするための単語の配列
$words  = array('apple','pineapple','banana','orange',
                'radish','carrot','pea','bean','potato');

// まだ最短距離は見つかっていません
$shortest = -1;

// 最短距離を見つけるため単語をループします
foreach ($words as $word) {

    // 入力した単語と現在の単語の距離を
    // 計算します
    $lev = levenshtein($input, $word);

    // マッチするかどうかチェックします
    if ($lev == 0) {

        // 最短な単語はこれだ (マッチした)
        $closest = $word;
        $shortest = 0;

        // ループを抜ける; マッチしたものを見つけました
        break;
    }

    // もし距離が次に見つけた最短距離よりも短い場合、
    // もしくは次の最短の単語がまだ見つかっていない場合
    if ($lev <= $shortest || $shortest < 0) {
        // 最短のマッチと最短距離をセットします
        $closest  = $word;
        $shortest = $lev;
    }
}

echo "入力した単語: $input\n";
if ($shortest == 0) {
    echo "一致するものが見つかりました: $closest\n";
} else {
    echo "もしかして: $closest\n";
}

//上の例の出力は以下となります。
入力した単語: carrrot
もしかして: carrot

参考リンク

metaphone 文字列の metaphone キーを取得する
similar_text 二つの文字列の間の類似度を計算する
soundex 文字列の soundexキー(音声表現文字列)を返す

タグ

レーベンシュタイン距離 コスト String 文字列


公式リファレンス

書式

levenshtein ( string $str1 , string $str2 ) : int

levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del ) : int

説明

レーベンシュタイン距離は、str1 を str2 に変換するために置換、挿入、削除 しなければならない最小の文字数として定義されます。アルゴリズムの複雑さは、 O(m*n) です。 ここで、n および m はそれぞれ str1 および str2 の長さです (O(max(n,m)**3) となる similar_text() よりは良いですが、 まだかなりの計算量です)。

上記の最も簡単な形式では、この関数はパラメータとして引数を二つだけとり、 str1 から str2 に変換する際に必要な 挿入、置換、削除演算の数のみを計算します。

2 番目の形式では、挿入、置換、削除演算のコストを定義する 3 番目のパラメータが追加されます。この形式は 1 番目の形式より一般的で 汎用性が高いですが、効率的ではありません。

パラメータ

str1
レーベンシュタイン距離を計算する文字列のひとつ。
str2
レーベンシュタイン距離を計算する文字列のひとつ。
cost_ins
挿入のコストを定義します。
cost_rep
置換のコストを定義します。
cost_del
削除のコストを定義します。

返値

この関数は、引数で指定した二つの文字列のレーベンシュタイン距離を返します。 引数文字列の一つが 255 文字の制限より長い場合に -1 を返します。

サンプル

例1 levenshtein() の例

// スペルミスした単語を入力します $input = 'carrrot'; // チェックするための単語の配列 $words  = array('apple','pineapple','banana','orange',                 'radish','carrot','pea','bean','potato'); // まだ最短距離は見つかっていません $shortest = -1; // 最短距離を見つけるため単語をループします foreach ($words as $word) {     // 入力した単語と現在の単語の距離を     // 計算します     $lev = levenshtein($input, $word);     // マッチするかどうかチェックします     if ($lev == 0) {         // 最短な単語はこれだ (マッチした)         $closest = $word;         $shortest = 0;         // ループを抜ける; マッチしたものを見つけました         break;     }     // もし距離が次に見つけた最短距離よりも短い場合、     // もしくは次の最短の単語がまだ見つかっていない場合     if ($lev <= $shortest || $shortest < 0) {         // 最短のマッチと最短距離をセットします         $closest  = $word;         $shortest = $lev;     } } echo "入力した単語: $input\n"; if ($shortest == 0) {     echo "一致するものが見つかりました: $closest\n"; } else {     echo "もしかして: $closest\n"; }

上の例の出力は以下となります。

入力した単語: carrrot もしかして: carrot

参考

  • soundex() - 文字列の soundex キーを計算する
  • similar_text() - 二つの文字列の間の類似性を計算する
  • metaphone() - 文字列の metaphone キーを計算する
  • ワード検索


    ※入力キーワードが、関数名・説明文・タグに含まれるものを検索

    関数名アルファベット別

    A B C D E F G H I J
    K L M N O P Q R S T
    U V W X Y Z _

    最終更新一覧

    stristr
     大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却

    stripslashes
     バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く

    stripos
     大文字小文字を区別せずに文字列が最初に現れる位置を取得する

    stripcslashes
     addcslashes() でクォートされた文字列をアンクォートする

    strip_tags
     文字列から HTML と PHP のタグを除去して返却

    strcspn
     指定した文字が最初に現れる位置を調べる

    strcoll
     ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する

    strcmp
     2つの文字列を比較し同じか(あるいは大小)を判定する

    strchr
     strstr() のエイリアス

    strcasecmp
     2つの文字列を比較(大文字小文字を区別せず同じとみなす)

    カテゴリー一覧

    PHP の振る舞いの変更
    音声フォーマットの操作
    認証サービス
    コマンドライン関連
    圧縮およびアーカイブ
    暗号
    データベース関連
    日付および時刻関連
    ファイルシステム
    自然言語および文字エンコーディング
    画像処理および作成
    メール関連
    数学
    テキスト以外の MIME 型
    プロセス制御
    その他の基本モジュール
    その他のサービス
    検索エンジン用の拡張モジュール
    サーバー固有のモジュール
    セッション関連
    テキスト処理
    変数・データ型関連
    ウェブサービス
    Windows 用のモジュール
    XML 操作
    GUI用の拡張モジュール