الفرق بين المراجعتين لصفحة: «PHP/levenshtein»

من موسوعة حسوب
< PHP
لا ملخص تعديل
لا ملخص تعديل
سطر 2: سطر 2:
(PHP 4 >= 4.0.1, PHP 5, PHP 7)
(PHP 4 >= 4.0.1, PHP 5, PHP 7)


تقيس الدالة levenshtein()‎ مسافة Levenshtein بين سلسلتين نصيتين.
تقيس الدالة <code>levenshtein()‎</code> مسافة Levenshtein بين سلسلتين نصيتين.


=== الوصف ===
== الوصف ==
<syntaxhighlight lang="php">
<syntaxhighlight lang="php">
int levenshtein ( string $str1 , string $str2 )
int levenshtein ( string $str1 , string $str2 )
سطر 11: سطر 11:




</syntaxhighlight>تُقاس مسافة Levenshtein بعدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية str1 إلى السلسلة النصية str2.
</syntaxhighlight>تُقاس مسافة Levenshtein بعدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية <code>str1</code> إلى السلسلة النصية <code>str2</code>.


يُعَد تعقيد خوارزمية الدالة levenshtein() من الدرجة (O(m*n، حيث تمثل m و n طول السلسلتين النصيتين str1 و str2 (الأمر الذي يعدّ جيدًا إلى حدٍ ما مقارنة مع درجة تعقيد خوارزمية الدالة similar_text()‎ التي تكون من الدرجة (O(max(n,m)**3، لكن مع ذلك ستبقى مُكلِفةً حسابيًا).
يُعَد تعقيد خوارزمية الدالة <code>levenshtein()‎</code> من الدرجة (O(m*n، حيث تمثل m و n طول السلسلتين النصيتين <code>str1</code> و <code>str2</code> (الأمر الذي يعدّ جيدًا إلى حدٍ ما مقارنة مع درجة تعقيد خوارزمية الدالة <code>[[PHP/similar text|similar_text()‎]]</code> التي تكون من الدرجة (O(max(n,m)**3، لكن مع ذلك ستبقى مُكلِفةً حسابيًا).


في نُسخَتِها المبسطة، تأخذ الدالة levenshtein()‎ السلسلتين النصيتين str1 و str2 كمعاملات  وتُعيد عدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية str1 إلى السلسلة النصية str2.
في نُسخَتِها المبسطة، تأخذ الدالة <code>levenshtein()‎</code> السلسلتين النصيتين <code>str1</code> و <code>str2</code> كمعاملات  وتُعيد عدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية <code>str1</code> إلى السلسلة النصية <code>str2</code>.


في نسختها الثانية تأخذ الدالة levenshtein()‎ ثلاث معاملات إضافية تحدد تكلفة كلٍ من عمليات  الاستبدال والحذف والإضافة. وهي نسخة أكثر شمولية من النسخة المبسطة لكن ليست بنفس الكفاءة.
في نسختها الثانية تأخذ الدالة <code>levenshtein()‎</code> ثلاث معاملات إضافية تحدد تكلفة كلٍ من عمليات  الاستبدال والحذف والإضافة. وهي نسخة أكثر شمولية من النسخة المبسطة لكن ليست بنفس الكفاءة.


=== المعاملات ===
== المعاملات ==


==== str1 ====
=== <code>str1</code> ===
السلسلة النصية الأولى.
السلسلة النصية الأولى.


==== str2 ====
=== <code>str2</code> ===
السلسلة النصية الثانية.
السلسلة النصية الثانية.


==== cost_ins ====
=== <code>cost_ins</code> ===
يُعَرِف تكلفة إضافة المحارف.
يُعَرِف تكلفة إضافة المحارف.


==== cost_rep ====
=== <code>cost_rep</code> ===
يُعَرِف تكلفة استبدال المحارف.
يُعَرِف تكلفة استبدال المحارف.


==== cost_del ====
=== <code>cost_del</code> ===
يُعَرِف تكلفة حذف المحارف.
يُعَرِف تكلفة حذف المحارف.


=== القيم المُعادة ===
== القيم المعادة ==
تُعيد الدالة levenshtein()‎ مسافة Levenshtein بين المعاملين str1 و str2، أو القيمة (1-) إذا كان طول أحد السلسلتينstr1 أو str2 يفوق عدد 255 حرف وهو عدد المحارف المسموح به.
تُعيد الدالة <code>levenshtein()‎</code> مسافة Levenshtein بين المعاملين <code>str1</code> و <code>str2</code>، أو القيمة (1-) إذا كان طول أحد السلسلتين <code>str1</code> أو <code>str2</code> يفوق عدد 255 حرف وهو عدد المحارف المسموح به.


=== أمثلة ===
== أمثلة ==
 
المثال 1: مثال عن استعمالات الدالة <code>levenshtein()‎</code> (تقديم اقتراحات لتصحيح الكلمات المُدخلة)<syntaxhighlight lang="php">
==== المثال 1: مثال عن استعمالات الدالة levenshtein()‎ (تقديم اقتراحات لتصحيح الكلمات المُدخلة) ====
<syntaxhighlight lang="php">
<?php
<?php


// كلمة مكتوبة خطأً
// كلمة مكتوبة خطأً
$input = 'carrrot';
$input = 'carrrot';


// مصفوفة فيها كلمات للتحقق من كتابة المتغير السابق
// مصفوفة فيها كلمات للتحقق من كتابة المتغير السابق
$words  = array('apple','pineapple','banana','orange',
$words  = array('apple','pineapple','banana','orange',
               'radish','carrot','pea','bean','potato');
               'radish','carrot','pea','bean','potato');
// لم نجد أقصر طريق لتحويل السلسلة النصية الأولى إلى الثانية
// لم نجد أقصر طريق لتحويل السلسلة النصية الأولى إلى الثانية
$shortest = -1;
$shortest = -1;


// المرور على عناصر المصفوفة لمعرفة أقرب الكلمات إلى الكلمة التي نريد مراجعتها
// المرور على عناصر المصفوفة لمعرفة أقرب الكلمات إلى الكلمة التي نريد مراجعتها
foreach ($words as $word) {
foreach ($words as $word) {
   // حساب المسافة بين الكلمة المدخلة والكلمة الحالية
   // حساب المسافة بين الكلمة المدخلة والكلمة الحالية
   $lev = levenshtein($input, $word);
   $lev = levenshtein($input, $word);
   // التحقق من وجود مطابقة كاملة
   // التحقق من وجود مطابقة كاملة
   if ($lev == 0) {
   if ($lev == 0) {
       // أقرب كلمة هي الكلمة الصحيحة (المماثلة لها تمامًا)
       // أقرب كلمة هي الكلمة الصحيحة (المماثلة لها تمامًا)
       $closest = $word;
       $closest = $word;
       $shortest = 0;
       $shortest = 0;
       // الخروج من حلقة التكرار، إذ وجدنا مطابقة للكلمة
       // الخروج من حلقة التكرار، إذ وجدنا مطابقة للكلمة
       break;
       break;
   }
   }


   // إذا كانت المسافة أقل من المسافة التي حسبناها سابقًا
   // إذا كانت المسافة أقل من المسافة التي حسبناها سابقًا
   // أو لم نجد كلمةً تشبهها
   // أو لم نجد كلمةً تشبهها
   if ($lev <= $shortest || $shortest < 0) {
   if ($lev <= $shortest || $shortest < 0) {
       // ضبط أقرب كلمة تشبه الكلمة الأصل
       // ضبط أقرب كلمة تشبه الكلمة الأصل
       $closest  = $word;
       $closest  = $word;
       $shortest = $lev;
       $shortest = $lev;
   }
   }
}
}
echo "Input word: $input\n";
echo "Input word: $input\n";
if ($shortest == 0) {
if ($shortest == 0) {
   echo "Exact match found: $closest\n";
   echo "Exact match found: $closest\n";
} else {
} else {
   echo "Did you mean: $closest?\n";
   echo "Did you mean: $closest?\n";
}
}
?>
?>


</syntaxhighlight>يُعيد المثال السابق ما يلي:<syntaxhighlight lang="php">
</syntaxhighlight>يُعيد المثال السابق ما يلي:<syntaxhighlight lang="php">
سطر 122: سطر 89:
</syntaxhighlight>
</syntaxhighlight>


=== انظر أيضًا ===
== انظر أيضًا ==
* soundex()‎: حساب مفتاح soundex لسلسلة نصية.
* <code>[[PHP/soundex|soundex()‎]]</code>: حساب مفتاح soundex لسلسلة نصية.
* similar_text()‎: قياس درجة التشابه بين سلسلتين نصيتين.
* <code>[[PHP/similar text|similar_text()‎]]</code>: قياس درجة التشابه بين سلسلتين نصيتين.
* metaphone()‎: حساب مفتاح metaphone لسلسلة نصية.
* <code>[[PHP/metaphone|metaphone()‎]]</code>: حساب مفتاح metaphone لسلسلة نصية.


=== مصادر ===
== مصادر ==
* صفحة الدالة levenshtein في توثيق PHP الرسمي.
* [http://php.net/manual/en/function.levenshtein.php صفحة الدالة levenshtein في توثيق PHP الرسمي].

مراجعة 11:49، 6 أبريل 2018

(PHP 4 >= 4.0.1, PHP 5, PHP 7)

تقيس الدالة levenshtein()‎ مسافة Levenshtein بين سلسلتين نصيتين.

الوصف

int levenshtein ( string $str1 , string $str2 )

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

تُقاس مسافة Levenshtein بعدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية str1 إلى السلسلة النصية str2.

يُعَد تعقيد خوارزمية الدالة levenshtein()‎ من الدرجة (O(m*n، حيث تمثل m و n طول السلسلتين النصيتين str1 و str2 (الأمر الذي يعدّ جيدًا إلى حدٍ ما مقارنة مع درجة تعقيد خوارزمية الدالة similar_text()‎ التي تكون من الدرجة (O(max(n,m)**3، لكن مع ذلك ستبقى مُكلِفةً حسابيًا).

في نُسخَتِها المبسطة، تأخذ الدالة levenshtein()‎ السلسلتين النصيتين str1 و str2 كمعاملات  وتُعيد عدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية str1 إلى السلسلة النصية str2.

في نسختها الثانية تأخذ الدالة levenshtein()‎ ثلاث معاملات إضافية تحدد تكلفة كلٍ من عمليات  الاستبدال والحذف والإضافة. وهي نسخة أكثر شمولية من النسخة المبسطة لكن ليست بنفس الكفاءة.

المعاملات

str1

السلسلة النصية الأولى.

str2

السلسلة النصية الثانية.

cost_ins

يُعَرِف تكلفة إضافة المحارف.

cost_rep

يُعَرِف تكلفة استبدال المحارف.

cost_del

يُعَرِف تكلفة حذف المحارف.

القيم المعادة

تُعيد الدالة levenshtein()‎ مسافة Levenshtein بين المعاملين str1 و str2، أو القيمة (1-) إذا كان طول أحد السلسلتين str1 أو str2 يفوق عدد 255 حرف وهو عدد المحارف المسموح به.

أمثلة

المثال 1: مثال عن استعمالات الدالة levenshtein()‎ (تقديم اقتراحات لتصحيح الكلمات المُدخلة)

<?php

// كلمة مكتوبة خطأً
$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 word: $input\n";
if ($shortest == 0) {
   echo "Exact match found: $closest\n";
} else {
   echo "Did you mean: $closest?\n";
}
?>

يُعيد المثال السابق ما يلي:

Input word: carrrot

Did you mean: carrot?

انظر أيضًا

  • soundex()‎: حساب مفتاح soundex لسلسلة نصية.
  • similar_text()‎: قياس درجة التشابه بين سلسلتين نصيتين.
  • metaphone()‎: حساب مفتاح metaphone لسلسلة نصية.

مصادر