acfrancisが既に回答しているように、組み込みlevenshtein
関数を使用するよりもはるかに簡単にはなりません。
ただし、最後の質問に答えるには、はい、あなたが提案する方法でそれを行うことは実行可能であり、それほど難しくありません.
コード
function checkQuestions($para1, $para2){
$arr1 = array_unique(array_filter(explode(' ', preg_replace('/[^a-zA-Z0-9]/', ' ', strtolower($para1)))));
$arr2 = array_unique(array_filter(explode(' ', preg_replace('/[^a-zA-Z0-9]/', ' ', strtolower($para2)))));
$intersect = array_intersect($arr1, $arr2);
$p1 = count($arr1); //Number of words in para1
$p2 = count($arr2); //Number of words in para2
$in = count($intersect); //Number of words in intersect
$lowest = ($p1 < $p2) ? $p1 : $p2; //Which is smaller p1 or p2?
return array(
'Average' => number_format((100 / (($p1+$p2) / 2)) * $in, 2), //Percentage the same compared to average length of questions
'Smallest' => number_format((100 / $lowest) * $in, 2) //Percentage the same compared to shortest question
);
}
説明
- 2 つの引数を受け取る関数を定義します (引数は比較する質問です)。
- 入力をフィルタリングし、配列に変換します
- 入力を小文字にする
strtolower
- 英数字以外の文字を除外する
preg_replace
- フィルタリングされた文字列をスペースで分解します
- 作成した配列をフィルタリングします
- 空白を削除
array_filter
- 重複を削除
array_unique
2-4
2 番目の質問を繰り返します
- 両方の配列で一致する単語を見つけて、新しい配列に移動します
$intersect
$p1
、、$p2
および3 つの配列のそれぞれの単語数をカウントします。$in
- パーセンテージ類似度を計算して返す
次に、同じと見なされる前に、質問がどの程度類似している必要があるかのしきい値を設定する必要があります80%
。
注意
- この関数は、2 つの値の配列を返します。1 つ目は長さを 2 つの入力質問の平均と比較し、2 つ目は短い方のみを比較します。単一の値を返すように変更できます。
- 私
number_format
はパーセンテージに使用しました...しかし、int
おそらく戻ってきても大丈夫でしょう
例
例 1
$question1 = 'The average of 20 numbers is zero. Of them, at the most, how many may be greater than zero?';
$question2 = 'The average of 20 numbers is zero. Of them how many may be greater than zero?';
if(checkQuestions($question1, $question2)['Average'] >= 80){
echo "Questions are the same...";
}
else{
echo "Questions are not the same...";
}
//Output: Questions are the same...
例 2
$para1 = 'The average of 20 numbers is zero. Of them, at the most, how many may be greater than zero?';
$para2 = 'The average of 20 numbers is zero. Of them how many may be greater than zero?';
$para3 = 'The average of 20 numbers is zero. Of them how many may be greater than zero, at the most?';
var_dump(checkQuestions($para1, $para2));
var_dump(checkQuestions($para1, $para3));
var_dump(checkQuestions($para2, $para3));
/**
Output:
array(2) {
["Average"]=>
string(5) "93.33"
["Smallest"]=>
string(6) "100.00"
}
array(2) {
["Average"]=>
string(6) "100.00"
["Smallest"]=>
string(6) "100.00"
}
array(2) {
["Average"]=>
string(5) "93.33"
["Smallest"]=>
string(6) "100.00"
}
*/