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

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

作成日: 更新日:

基本的な使い方

similar_text関数は、2つの文字列間の類似度を計算する関数です。この関数は、与えられた2つの文字列を比較し、それらがどれくらい似ているかを数値として評価します。例えば、ユーザーが入力したキーワードとデータベースに登録されている文字列との類似性を調べたり、スペルチェック機能の実装に役立てたりするなど、テキスト処理が必要な様々な場面で利用できます。

具体的には、similar_text関数は、2つの文字列の間に存在する共通の文字シーケンスの長さをバイト単位で計算し、その合計値を整数で返します。この戻り値が大きいほど、2つの文字列はより高い類似性を持つと判断されます。

この関数は、最低2つの引数を受け取ります。最初の2つの引数には比較したい文字列をそれぞれ指定します。3番目の引数はオプションであり、この引数に浮動小数点型の変数を参照渡しで指定すると、文字列の類似度をパーセンテージとしてその変数に格納することができます。このパーセンテージは、0から100の範囲で、文字列がどれだけ似ているかを示します。

このように、similar_text関数は、文字列の類似性を定量的に評価するための便利なツールであり、文字列比較や検索機能の実装において有効に活用することができます。

構文(syntax)

1similar_text(string $string1, string $string2, float &$percent = null): int

引数(parameters)

string $string1, string $string2, float &$percent = null

  • string $string1: 比較対象の1つ目の文字列
  • string $string2: 比較対象の2つ目の文字列
  • float &$percent = null: 2つの文字列の類似度をパーセンテージで格納する参照渡し変数 (省略可能)

戻り値(return)

int

二つの文字列がどれだけ似ているかを、0から100の整数で返します。値が大きいほど、文字列は似ています。

サンプルコード

PHPで配列から類似文字列を探す

1<?php
2
3/**
4 * 指定された文字列の配列の中から、ターゲット文字列に最も類似した文字列を見つけます。
5 * PHPのsimilar_text関数を使用して文字列間の類似度を計算し、
6 * 最も高い類似度を持つ文字列とその詳細を返します。
7 *
8 * @param string $targetString 比較対象となるターゲット文字列。
9 * @param array $stringList ターゲット文字列と比較する文字列のリスト。
10 * @return array 最も類似した文字列、類似度(バイト数)、類似度(パーセンテージ)を含む連想配列。
11 *               stringListが空の場合や類似する文字列が見つからない場合は空の配列を返します。
12 */
13function findMostSimilarStringInArray(string $targetString, array $stringList): array
14{
15    $mostSimilarString = '';
16    $highestSimilarityBytes = 0;
17    $highestSimilarityPercent = 0.0;
18
19    if (empty($stringList)) {
20        return [];
21    }
22
23    foreach ($stringList as $currentString) {
24        // similar_text関数は、2つの文字列の類似度を計算し、
25        // 共通する文字のバイト数を整数で返します。
26        // オプションの第三引数に参照渡しでfloat型の変数を指定すると、
27        // 文字列全体の類似度がパーセンテージでその変数に格納されます。
28        $similarityBytes = similar_text($targetString, $currentString, $percent);
29
30        // より高い類似度が見つかった場合、現在の文字列を最も類似と判断します。
31        if ($similarityBytes > $highestSimilarityBytes) {
32            $highestSimilarityBytes = $similarityBytes;
33            $highestSimilarityPercent = $percent;
34            $mostSimilarString = $currentString;
35        }
36    }
37
38    // 最低でも1バイト以上の類似度があれば結果を返します。
39    if ($highestSimilarityBytes > 0) {
40        return [
41            'target_string' => $targetString,
42            'most_similar_string' => $mostSimilarString,
43            'similarity_bytes' => $highestSimilarityBytes,
44            'similarity_percent' => round($highestSimilarityPercent, 2), // パーセンテージを小数点以下2桁に丸める
45        ];
46    }
47
48    return []; // 類似する文字列が見つからなかった場合
49}
50
51// --- サンプルコードの実行例 ---
52
53// 比較対象のターゲット文字列
54$targetWord = 'apple';
55
56// 比較する文字列の配列
57$candidates = [
58    'apply',
59    'aple',
60    'banana',
61    'appletree',
62    'pineapple',
63    'orange',
64    'apple', // 完全に一致する文字列も含む
65];
66
67// 関数を呼び出し、最も類似する文字列を検索
68$result = findMostSimilarStringInArray($targetWord, $candidates);
69
70// 結果を表示
71if (!empty($result)) {
72    echo "ターゲット文字列: " . $result['target_string'] . "\n";
73    echo "配列内で最も類似した文字列: " . $result['most_similar_string'] . "\n";
74    echo "類似度 (共通バイト数): " . $result['similarity_bytes'] . "\n";
75    echo "類似度 (パーセンテージ): " . $result['similarity_percent'] . "%\n";
76} else {
77    echo "類似する文字列は見つかりませんでした。\n";
78}
79
80echo "\n---\n\n";
81
82// 別の例: 似たような単語群からの検索
83$targetQuery = 'programing';
84$codingTerms = [
85    'programming',
86    'programmer',
87    'program',
88    'php',
89    'python',
90    'java',
91    'development',
92];
93
94$result2 = findMostSimilarStringInArray($targetQuery, $codingTerms);
95
96if (!empty($result2)) {
97    echo "ターゲット文字列: " . $result2['target_string'] . "\n";
98    echo "配列内で最も類似した文字列: " . $result2['most_similar_string'] . "\n";
99    echo "類似度 (共通バイト数): " . $result2['similarity_bytes'] . "\n";
100    echo "類似度 (パーセンテージ): " . $result2['similarity_percent'] . "%\n";
101} else {
102    echo "類似する文字列は見つかりませんでした。\n";
103}

PHP 8のsimilar_text関数は、二つの文字列がどれくらい似ているかを計算するために使用されます。この関数は、比較対象となる文字列を二つ($string1$string2)引数として受け取り、それらの文字列間で共通する文字のバイト数を整数値として返します。また、オプションとして三つ目の引数にfloat型の変数を参照渡しで渡すと、文字列全体の類似度をパーセンテージ(0%から100%)でその変数に格納してくれます。

このサンプルコードでは、similar_text関数を応用し、指定された文字列の配列の中から、ターゲット文字列に最も類似した文字列を効率的に見つけ出す方法を提示しています。findMostSimilarStringInArray関数は、比較したいターゲット文字列と、比較対象となる文字列のリストを受け取ります。そして、リスト内の各文字列とターゲット文字列の類似度をsimilar_textで一つずつ計算し、最も類似度が高い文字列を特定します。最終的に、関数は最も類似した文字列、その類似度(共通バイト数)、および類似度(パーセンテージ)を含む連想配列を返します。これにより、検索候補の提案や、ユーザー入力のゆらぎに対応する処理などに応用できます。実行例では、見つかった最も類似した文字列とその詳細な類似度が出力されます。

similar_text関数は、共通する文字のバイト数を戻り値として返し、パーセンテージは参照渡しされる第三引数で取得します。この仕組みを理解し、適切に利用してください。類似度はバイト数とパーセンテージの2種類で表現されますが、それぞれ異なる指標のため、どちらで比較・判断するかに注意が必要です。マルチバイト文字(日本語など)を含む文字列の類似度もバイト単位で計算されるため、文字数ではなくバイト数で評価される点に留意してください。また、大文字と小文字は区別されますので、必要に応じてstrtolowerなどで事前に統一することも検討しましょう。

PHPのsimilar_textとlevenshteinで文字列比較する

1<?php
2declare(strict_types=1);
3
4/**
5 * 2つの文字列の類似性を異なるアルゴリズムで比較し、それぞれの結果を出力します。
6 * similar_text は類似する文字数を返し、levenshtein は編集距離を返します。
7 *
8 * @param string $string1 比較する最初の文字列。
9 * @param string $string2 比較する2番目の文字列。
10 */
11function compareStringSimilarity(string $string1, string $string2): void
12{
13    echo "--- 比較対象の文字列 ---\n";
14    echo "文字列1: '{$string1}'\n";
15    echo "文字列2: '{$string2}'\n\n";
16
17    // similar_text: 2つの文字列で一致する文字の数を計算し、オプションで類似度パーセンテージも提供します。
18    // 値が大きいほど類似度が高いことを示します。
19    $similarChars = similar_text($string1, $string2, $percent);
20    echo "similar_text の結果:\n";
21    echo "  共通の文字数: {$similarChars}\n";
22    echo "  類似度 (%): " . round($percent, 2) . "%\n\n";
23
24    // levenshtein: 1つの文字列を別の文字列に変換するために必要な最小の編集(挿入、削除、置換)回数を計算します。
25    // 値が小さいほど類似度が高いことを示します。
26    $levenshteinDistance = levenshtein($string1, $string2);
27    echo "levenshtein の結果:\n";
28    echo "  編集距離: {$levenshteinDistance}\n\n";
29}
30
31// 実行例1: 少しだけ異なる文字列
32compareStringSimilarity("apple", "aple");
33echo str_repeat("=", 40) . "\n\n";
34
35// 実行例2: いくつか異なる文字列
36compareStringSimilarity("kitten", "sitting");
37echo str_repeat("=", 40) . "\n\n";
38
39// 実行例3: 全く同じ文字列
40compareStringSimilarity("php", "php");
41echo str_repeat("=", 40) . "\n\n";
42
43// 実行例4: 全く異なる文字列
44compareStringSimilarity("apple", "orange");

PHPのsimilar_text関数は、2つの文字列がどれくらい似ているかを数値で計算します。この関数は、比較したい2つの文字列を引数として受け取り、共通して含まれる文字の数を整数で返します。また、3つ目の引数として浮動小数点型の変数を参照渡しで指定することで、2つの文字列の類似度をパーセンテージとしてその変数に格納することができます。この共通文字数やパーセンテージが大きいほど、文字列の類似度が高いと判断できます。

一方、levenshtein関数も文字列の類似度を測るために使用されますが、異なるアルゴリズムで計算を行います。levenshteinは、ある文字列を別の文字列に変換するために必要な最小限の編集回数(文字の挿入、削除、置換)を整数で返します。この編集回数が小さいほど、文字列の類似度が高いと判断します。

このように、similar_textは共通部分の多さで類似度を判断し、levenshteinは編集のしやすさで類似度を判断します。サンプルコードでは、「apple」と「aple」のように部分的に異なる文字列や、「kitten」と「sitting」のように多くの違いがある文字列を比較することで、それぞれの関数の計算結果と、その解釈の違いを示しています。

similar_text関数は、2つの文字列間で一致する文字数を整数で返します。オプションの第3引数には、参照渡しで類似度のパーセンテージが格納されますので、変数を用意して受け取ってください。一方、levenshtein関数は文字列を別の文字列に変換するために必要な最小編集回数を返し、値が小さいほど類似度が高いことを示します。結果の解釈がsimilar_textとは逆になる点に注意が必要です。また、これらの関数はバイト単位で処理されるため、日本語などのマルチバイト文字を扱う際には意図しない結果になる可能性があります。文字列比較の目的に合わせ、文字エンコーディングも考慮して適切な関数を選択してください。

関連コンテンツ