الفرق بين المراجعتين لصفحة: «PHP/levenshtein»
هارون-بوكرش (نقاش | مساهمات) أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE:الدالة levenshtein() في PHP}}</noinclude>' |
لا ملخص تعديل |
||
(مراجعتان متوسطتان بواسطة مستخدمين اثنين آخرين غير معروضتين) | |||
سطر 1: | سطر 1: | ||
<noinclude>{{DISPLAYTITLE:الدالة | <noinclude>{{DISPLAYTITLE:الدالة <code>levenshtein()</code> في PHP}}</noinclude> | ||
(PHP 4 >= 4.0.1, PHP 5, PHP 7) | |||
تقيس الدالة <code>levenshtein()</code> مسافة Levenshtein بين سلسلتين نصيتين. | |||
== الوصف == | |||
<syntaxhighlight lang="php"> | |||
int levenshtein ( string $str1 , string $str2 ) | |||
int levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del ) | |||
</syntaxhighlight>تُقاس مسافة Levenshtein بعدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية <code>str1</code> إلى السلسلة النصية <code>str2</code>. | |||
يُعَد تعقيد خوارزمية الدالة <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، لكن مع ذلك ستبقى مُكلِفةً حسابيًا). | |||
في نُسخَتِها المبسطة، تأخذ الدالة <code>levenshtein()</code> السلسلتين النصيتين <code>str1</code> و <code>str2</code> كمعاملات وتُعيد عدد المحارف الواجب استبدالها أو إضافتها أو حذفها لتحويل السلسلة النصية <code>str1</code> إلى السلسلة النصية <code>str2</code>. | |||
في نسختها الثانية تأخذ الدالة <code>levenshtein()</code> ثلاث معاملات إضافية تحدد تكلفة كلٍ من عمليات الاستبدال والحذف والإضافة. وهي نسخة أكثر شمولية من النسخة المبسطة لكن ليست بنفس الكفاءة. | |||
== المعاملات == | |||
=== <code>str1</code> === | |||
السلسلة النصية الأولى. | |||
=== <code>str2</code> === | |||
السلسلة النصية الثانية. | |||
=== <code>cost_ins</code> === | |||
يُعَرِف تكلفة إضافة المحارف. | |||
=== <code>cost_rep</code> === | |||
يُعَرِف تكلفة استبدال المحارف. | |||
=== <code>cost_del</code> === | |||
يُعَرِف تكلفة حذف المحارف. | |||
== القيم المعادة == | |||
تُعيد الدالة <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"> | |||
<?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"; | |||
} | |||
?> | |||
</syntaxhighlight>يُعيد المثال السابق ما يلي:<syntaxhighlight lang="php"> | |||
Input word: carrrot | |||
Did you mean: carrot? | |||
</syntaxhighlight> | |||
== انظر أيضًا == | |||
* <code>[[PHP/soundex|soundex()]]</code>: حساب مفتاح soundex لسلسلة نصية. | |||
* <code>[[PHP/similar text|similar_text()]]</code>: قياس درجة التشابه بين سلسلتين نصيتين. | |||
* <code>[[PHP/metaphone|metaphone()]]</code>: حساب مفتاح metaphone لسلسلة نصية. | |||
== مصادر == | |||
* [http://php.net/manual/en/function.levenshtein.php صفحة الدالة levenshtein في توثيق PHP الرسمي]. | |||
[[تصنيف:PHP]] | |||
[[تصنيف:PHP Function]] | |||
[[تصنيف:PHP String]] |
المراجعة الحالية بتاريخ 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 لسلسلة نصية.