حساب مسافة تحرير ليفنشتاين بين سلسلتين
تبيّن مسافة تحرير ليفنشتاين عدد التغييرات على مستوى المحرف اللازمة لتحويل سلسلة إلى أخرى.
شغّل الأداة مجانًا
أدخل سلسلتين لتحصل على أقل مجموع ممكن لعمليات الإدراج والحذف والاستبدال. تفيد هذه القيمة عندما تكون المطابقة التامة شديدة الصرامة، مع الحاجة إلى مقياس واضح وقابل لإعادة الإنتاج. المقارنة حتمية وحساسة لحالة الأحرف، وتعمل مباشرة على نقاط ترميز Unicode من دون اتصال بالشبكة أو تقييم احتمالي.
ما الذي تعبّر عنه المسافة
مسافة ليفنشتاين عدد صحيح غير سالب. تعني القيمة صفر أن السلسلتين متطابقتان، وتعني القيمة واحد أن عملية إدراج أو حذف أو استبدال واحدة تكفي لمطابقتهما. تتطلب القيم الأكبر تعديلات أكثر. تفحص الخوارزمية جميع تسلسلات التحرير الصالحة وتعيد أصغر مجموع، ولا تطبق التغييرات على نحو جشع من اليسار إلى اليمين. يهم ذلك عند تكرار المحارف أو إزاحة المقاطع. تميّز النتيجة بين الأحرف الكبيرة والصغيرة، وهي عدد مطلق وليست نسبة مئوية. قد تكون المسافة ثلاثة كبيرة لرمز من أربعة محارف، لكنها ضئيلة لفقرة طويلة. لذلك ينبغي تفسير العدد مع طول السلسلتين ومستوى التسامح الملائم لتطبيقكم.
كيفية إجراء الحساب
تستخدم الحاسبة البرمجة الديناميكية لإيجاد أقل طريقة كلفة لتحويل كل بادئة من السلسلة الأولى إلى كل بادئة من الثانية. تدرس كل خانة ثلاثة احتمالات: إدراج المحرف الحالي أو حذفه أو استبداله، ولا تضيف المحارف المتطابقة أي كلفة. يحتفظ التنفيذ بالصف السابق والصف الحالي فقط، فيضمن النتيجة الدقيقة بذاكرة تتناسب مع الإدخال الأقصر. تُقرأ المحارف كنقاط ترميز Unicode، ولذلك يُعامل المحرف الإضافي الذي تمثله JavaScript بزوج بديل على أنه عنصر واحد. لا يجري تطبيع Unicode ولا توحيد حالة الأحرف. إذا كان ينبغي اعتبار تمثيلات متشابهة بصرياً متكافئة، فطبّعوا النصوص أو وحّدوها قبل الإرسال.
استخدام النتيجة ضمن سير العمل
أرسلوا القيمتين في الحقلين <code>first</code> و<code>second</code>. يجب أن تكون كلتاهما سلسلتين نصيتين، لكن السلسلة الفارغة صالحة؛ وعندئذ تساوي المسافة عدد نقاط ترميز Unicode في السلسلة الأخرى. يتضمن الكائن المعاد العدد الصحيح <code>distance</code>. يمكن مقارنة اسم مُدخل باسم معروف، أو التحقق من أن معرّفاً مصححاً يبعد تعديلاً واحداً عن الأصل. لا تستخدموا حداً واحداً لجميع المدخلات، لأن الرموز القصيرة والأسماء والجمل لها أنماط أخطاء مختلفة. حدّدوا كذلك ما إذا كانت المسافات وعلامات الترقيم واللهجات وحالة الأحرف مهمة. يناسب التنفيذ في المتصفح الفحص التفاعلي، وتستخدم طلبات API الآلية التنفيذ الحتمي نفسه بكلفة $0.002 لكل طلب. تُرفض القيم غير النصية بدلاً من تحويلها ضمنياً.
حالات الاستخدام
اكتشاف أخطاء الكتابة المحتملة
قيسوا عدد التعديلات بين كلمة أو اسم مُدخل والقيمة المتوقعة قبل تطبيق حد يناسب مجال الاستخدام.
مقارنة معرّفات السجلات
ضعوا علامة للمراجعة على المعرّفات التي تختلف بعملية أو عمليتي إدراج أو حذف أو استبدال فقط.
تقييم تصحيحات النص
قيسوا التغيير على مستوى المحارف بين النص الأصلي والنسخة المصححة بعدد صحيح قابل لإعادة الإنتاج.
الأسئلة الشائعة
ما العمليات التي تدخل في حساب المسافة؟
تُحسب كل عملية إدراج أو حذف أو استبدال لمحرف واحد بقيمة واحد، ويُعاد أصغر مجموع ممكن.
هل تميّز المقارنة حالة الأحرف؟
نعم. وحّدوا حالة النصين قبل الإرسال إذا أردتم تجاهل هذا الفرق.
هل يجوز أن تكون إحدى السلسلتين فارغة؟
نعم. تكون المسافة عندئذ عدد نقاط ترميز Unicode في السلسلة الأخرى.
هل تطبّع الحاسبة نص Unicode؟
لا. تقارن نقاط الترميز كما تصل؛ طبّعوا الصيغ المركبة مسبقاً إذا كان ينبغي عدّها متكافئة.
هل تعيد نسبة مئوية للتشابه؟
لا. تعيد أقل عدد مطلق من التعديلات، ويمكنكم تطبيعه بمقام يناسب تطبيقكم.
ما كلفة طلب API؟
تبلغ كلفة كل طلب API $0.002. ويمكن أيضاً تشغيل القدرة في المتصفح للاستخدام التفاعلي.
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/text/text-similarity-levenshtein \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"first":"kitten","second":"sitting"}'const res = await fetch("https://api.kit.forhosting.com/text/text-similarity-levenshtein", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"first": "kitten",
"second": "sitting"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/text/text-similarity-levenshtein",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"first": "kitten",
"second": "sitting"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/text/text-similarity-levenshtein", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"first":"kitten","second":"sitting"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"first":"kitten","second":"sitting"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/text/text-similarity-levenshtein", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"first": "kitten",
"second": "sitting"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "text.text_similarity_levenshtein",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الحدود
max_tokens | 20000 |
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |