関数・クラス解説
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
参考
ワード検索
※入力キーワードが、関数名・説明文・タグに含まれるものを検索関数名アルファベット別
最終更新一覧
●stristr
大文字小文字を区別せず文字列を検索し、ヒット箇所以降(あるいは以前)の文字列を返却
●stripslashes
バックスラッシュでエスケープされた文字列から、バックスラッシュを取り除く
●stripos
大文字小文字を区別せずに文字列が最初に現れる位置を取得する
●stripcslashes
addcslashes() でクォートされた文字列をアンクォートする
●strip_tags
文字列から HTML と PHP のタグを除去して返却
●strcspn
指定した文字が最初に現れる位置を調べる
●strcoll
ロケールに基づいて2つの文字列を比較し同じか(あるいは大小)を判定する
●strcmp
2つの文字列を比較し同じか(あるいは大小)を判定する
●strchr
strstr() のエイリアス
●strcasecmp
2つの文字列を比較(大文字小文字を区別せず同じとみなす)
カテゴリー一覧
PHP の振る舞いの変更
音声フォーマットの操作
認証サービス
コマンドライン関連
圧縮およびアーカイブ
暗号
データベース関連
日付および時刻関連
ファイルシステム
自然言語および文字エンコーディング
画像処理および作成
メール関連
数学
テキスト以外の MIME 型
プロセス制御
その他の基本モジュール
その他のサービス
検索エンジン用の拡張モジュール
サーバー固有のモジュール
セッション関連
テキスト処理
変数・データ型関連
ウェブサービス
Windows 用のモジュール
XML 操作
GUI用の拡張モジュール