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