مسافة Damerau–Levenshtein
المسافة بين form وfrom تعديل واحد لأن تبديل حرفين متجاورين يُحسب خطوة واحدة، أما kitten وsitting فتحتاجان إلى 3. وتحصل أيضًا على درجة تشابه من 0 إلى 1 لاكتشاف الأخطاء المطبعية. مجاني في متصفحك.
- مجاني
- يعمل في متصفحك
- دون تسجيل
- بياناتك لا تغادر جهازك
شغّل الأداة مجانًا
مثال محلول
- النص a
- kitten
- النص b
- sitting
- المسافة
- 3
- Len a
- 6
- Len b
- 7
- الطول الأقصى
- 7
مسافة Damerau–Levenshtein مقياس تحرير كلاسيكي يعدّ عدد عمليات الحرف الواحد اللازمة لتحويل سلسلة إلى أخرى عندما تكون العمليات المسموحة هي الإدراج والحذف والاستبدال وتبديل حرفين متجاورين. هذه العملية الأخيرة هي ما يميزها عن مسافة Levenshtein البسيطة ويجعلها مفيدة خصوصًا للأخطاء المطبعية الواقعية: غالبًا ما يبدّل الناس مفتاحين متجاورين (form مقابل from، وteh مقابل the) ويجب أن يكلّف ذلك خطوة واحدة لا استبدالين. تنفّذ هذه القدرة شكل Optimal String Alignment للمسافة بجدول برمجة ديناميكية خالص، فيعطي كل زوج من المدخلات العدد الصحيح نفسه على أي بيئة تشغيل. ترسلون نصّين وعلامة اختيارية لحساسية حالة الأحرف؛ وتتلقّون المسافة وطولي السلسلتين وتشابهًا مُطبَّعًا بين صفر وواحد وعلامة identical منطقية.
ما الذي تقيسه Damerau–Levenshtein وكيف تختلف عن Levenshtein البسيطة
تسأل مسافة التحرير كم تغييرًا وحدويًا يلزم لإعادة كتابة سلسلة مصدر كسلسلة هدف. تسمح Levenshtein الكلاسيكية بثلاث عمليات وحدوية: إدراج حرف واحد، أو حذف حرف واحد، أو استبدال حرف بآخر. تكلفة كل منها واحد.
تضيف إضافة Damerau عملية رابعة: تبديل حرفين متجاورين بتكلفة وحدوية واحدة. تتوافق هذه الإضافة مع كيفية الخطأ الفعلي على لوحة المفاتيح. على سبيل المثال، تختلف السلسلتان ab وba بتبديل متجاور واحد تحت Damerau–Levenshtein وباستبدالين تحت Levenshtein البسيطة.
لا تزال kitten مقابل sitting تكلّف ثلاثة (كما في مثال كتاب Levenshtein) لأن أرخص مسار يستخدم استبدالات وإدراجًا لا تبديلًا واحدًا. يستخدم هذا الطرف تكرار Optimal String Alignment (OSA): مصفوفة برمجة ديناميكية تكون فيها الخلية (i, j) الحد الأدنى للحذف والإدراج والاستبدال أو المطابقة—وعندما يكون آخر حرفين من كل بادئة زوجًا متقاطعًا—التبديل من الخلية (i−2, j−2). OSA هو الشكل الذي تسميه معظم المكتبات Damerau–Levenshtein لتصحيح الأخطاء المطبعية؛ ويمنع تطبيق تبديلين متداخلين على السلسلة الفرعية نفسها، فيبقى المقياس بسيطًا وO(n·m) في الزمن والمساحة.
السلاسل الفارغة صالحة: المسافة من الفارغة إلى أي سلسلة هي طول تلك السلسلة، والمسافة بين فارغتين صفر. السلاسل المتطابقة تعطي دائمًا مسافة صفر وتشابهًا واحدًا، بما في ذلك بعد طي حالة الأحرف الاختياري.
أين تُثبت واجهة Damerau–Levenshtein قيمتها
تستخدم أدوات بحث المنتجات والمخزون مسافة التحرير مع التبديلات لترتيب رموز SKU وأسماء العلامات شبه المطابقة قبل الرجوع إلى نماذج دلالية أبطأ. تُعلّم خطوط CRM وإزالة التكرار الصفوف المرشحة للتكرار عندما تكون المسافة واحدًا أو اثنين على الأكثر والتشابه فوق عتبة ثابتة، فتلتقط أحرفًا مبدّلة كانت المساواة البسيطة أو حتى Levenshtein البحتة تُقلّل من شأنها. تحتاج عروض التدقيق الإملائي وتمارين الصف إلى مُحكّم حتمي يُعلّم form مقابل from مسافة واحد ويفرض رسومًا ثابتة شفافة بدل تكلفة الرموز.
تستفيد مواقع المحتوى التي تستهدف مسافة damerau levenshtein من ودجت حي يطابق مساره المجاني في المتصفح مسار الأتمتة المدفوع بايتًا ببايت على الوحدة الخالصة نفسها. الإدخال غير الصالح لا يستهلك الرصيد. اقرنوا المسافة الصحيحة بسياسة عتبة خاصة بكم—اقبلوا مسافة صفر للمفاتيح الدقيقة فقط، ومسافة واحد لتصحيح أخطاء مطبعية عدواني، وتشابهًا فوق 0.8 لإشارات دمج مرنة—فتحصلون على لبنة قابلة للتدقيق للمطابقة الضبابية دون بناء محرك بحث كامل أو حزمة NLP خاصة بكم.
حالات الاستخدام
مطابقة منتجات وSKU متسامحة مع الأخطاء المطبعية
رتّبوا مرشحي الكتالوج عندما تكون سلسلة المشتري أو المورّد على بعد تبديل واحد أو تحرير واحد من رمز SKU الحقيقي، دون استدعاء نموذج تضمين.
إزالة تكرار CRM والسجلات
علّموا الأسماء والعناوين شبه المكررة حيث تكثر تبديلات الأحرف المتجاورة، باستخدام عتبة ثابتة للمسافة أو التشابه.
واجبات وعروض خوارزميات
أظهروا للطلاب برنامج OSA الديناميكي على kitten/sitting وab/ba حتى تظهر تكلفة التبديل بجانب Levenshtein البسيطة.
الأسئلة الشائعة
ما مسافة Damerau–Levenshtein؟
هي الحد الأدنى لعدد الإدراجات والحذف والاستبدالات وتبديلات الأحرف المتجاورة اللازمة لتحويل سلسلة إلى أخرى.
كيف تختلف عن مسافة Levenshtein العادية؟
Levenshtein البسيطة بلا عملية تبديل، فالجيران المبدّلون يكلّفان استبدالين. Damerau–Levenshtein (OSA) تعدّ التبديل المتجاور تحريرًا واحدًا، بما يناسب أخطاء لوحة المفاتيح الواقعية.
هل تُسمح السلاسل الفارغة؟
نعم. المسافة من فارغة إلى غير فارغة تساوي طول تلك السلسلة؛ والفارغتان مسافتهما صفر وتشابههما واحد.
ماذا تعني درجة التشابه؟
هي 1 ناقص المسافة مقسومة على طول النص الأطول. فالمسافة بين kitten وsitting هي 3 والكلمة الأطول من 7 أحرف، لذا يبلغ التشابه نحو 0.571428571429. والنصان المتطابقان يعطيان 1.
هل تميّز الأداة بين الأحرف الكبيرة والصغيرة؟
نعم افتراضيًا، فالمسافة بين Kitten وkitten تعديل واحد. وإذا ألغيت هذا التمييز تُحوَّل الكلمتان إلى أحرف صغيرة قبل الحساب، فلا تُضاف فروق حالة الأحرف إلى المسافة.
أدوات ذات صلة
للمطوّرين — الوصول عبر API
كل ما في هذه الصفحة متاح برمجيًا. هذا القسم موجّه للفرق التقنية التي تريد ربط الأداة بأنظمتها الخاصة؛ بقية المستخدمين يمكنهم استخدام الأداة أعلاه مباشرة دون الحاجة لقراءة ما يلي.
الـEndpoint
صادِق على طلبك بترويسة Bearer، وأرسل طلب POST واحدًا لتدخل مهمتك قائمة التنفيذ فورًا؛ ثم تستلم النتيجة عبر webhook أو رابط موقّع.
استدعِ الخدمة من بيئتك
curl -X POST https://api.kit.forhosting.com/str/damerau-levenshtein \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text_a":"kitten","text_b":"sitting"}'const res = await fetch("https://api.kit.forhosting.com/str/damerau-levenshtein", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text_a": "kitten",
"text_b": "sitting"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/str/damerau-levenshtein",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text_a": "kitten",
"text_b": "sitting"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/str/damerau-levenshtein", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text_a":"kitten","text_b":"sitting"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text_a":"kitten","text_b":"sitting"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/str/damerau-levenshtein", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)مثال على الطلب
{
"text_a": "kitten",
"text_b": "sitting"
}مثال على الاستجابة
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "str.damerau_levenshtein",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}الواجهة غير متزامنة: تستلم task_id فور الإرسال، ويمكنك الاستعلام عن الحالة بمعدل طلب واحد في الثانية.
الأسعار
السعر معلن كما تراه: لا tokens ولا نظام نقاط؛ وإن فشلت المهمة فلن تُحاسَب عليها.
الأخطاء
| HTTP | الرمز | المعنى |
|---|---|---|
401 | unauthorized | مفتاح الوصول مفقود أو غير صالح؛ تحقق من ترويسة Bearer في طلبك. |
402 | insufficient_balance | رصيدك لا يكفي لتنفيذ هذه المهمة؛ أعد شحن الرصيد ثم أعد المحاولة. |
404 | unknown_type | نوع المهمة المطلوب غير موجود في الكتالوج — راجع الاسم المرسل في الطلب. |
429 | rate_limited | تجاوزت الحد المسموح من الطلبات؛ انتظر قليلًا ثم أعد المحاولة. |
ملاحظات تقنية
مسار المتصفح المجاني ومسار API المدفوع مسبقًا يشتركان في الوحدة نفسها، فلا تختلف فحوصات الواجبات وعتبات المطابقة الضبابية وخطوط الإنتاج حول ما إذا كانت تسميتان قريبتين بما يكفي للدمج.
عقد الإدخال وحقول الاستجابة وقواعد التحقق
كل سلسلة محدودة بخمسة آلاف حرف حتى يبقى الجدول التربيعي محدودًا على مسار الحافة المجاني. سلسلة formula قصيرة توثّق تكرار OSA للعرض بجانب الجواب. فشل التحقق لا يُفوتر. أبقوا المدخلات قصيرة بما يكفي للاستخدام التفاعلي، وثبّتوا المسافة الصحيحة والتشابه المقرب في الاختبارات، فتحصلون على درجات ضبابية قابلة للتكرار دون نموذج لغوي أو قاموس خارجي. أرسلوا جسم JSON بحقلين نصيين إلزاميين: text_a (أسماء بديلة a وstring1 وs1 وleft وfirst وsource) وtext_b (أسماء بديلة b وstring2 وs2 وright وsecond وtarget). يجوز أن يكونا فارغين؛ والقيم الناقصة أو غير النصية تفشل بـ invalid_input مع اسم الحقل. الاختيارية case_sensitive قيمتها الافتراضية true حتى يختلف Kitten وkitten؛ اضبطوها false لتصغير الحالتين قبل ملء الجدول. عند النجاح يعيد الجسم text_a وtext_b وcase_sensitive؛ ويبلّغ distance كعدد صحيح غير سالب؛ وlen_a وlen_b وmax_len للسلاسل المُطبَّعة؛ وsimilarity بصيغة (max_len − distance) / max_len مع تقريب إلى اثنتي عشرة منزلة عشرية (أو واحد عندما يكون الطولان صفرًا)؛ ويضبط identical إلى true تمامًا عندما تكون distance صفرًا. مثال: text_a kitten وtext_b sitting تعطي distance ثلاثة وأطوالًا ستة وسبعة وmax_len سبعة وsimilarity حوالي 0.571 وidentical false. مثال: text_a ab وtext_b ba تعطي distance واحد بسبب التبديل المتجاور.
أين تُثبت واجهة Damerau–Levenshtein قيمتها
ولأن التنفيذ parse خالص من المستوى A، يكلّف كل استدعاء ناجح السعر الأساسي المنشور $0.002 بلا رموز نموذج ولا شبكة صادرة.
أسئلة تقنية
هل المقارنة حسّاسة لحالة الأحرف؟
افتراضيًا نعم (case_sensitive true). اضبطوا case_sensitive إلى false لتصغير السلسلتين قبل حساب المسافة حتى يتطابق Kitten وkitten.
كم تكلفة حاسبة Damerau–Levenshtein؟
أداة المتصفح مجانية. طلبات API تستخدم رصيد KIT المدفوع مسبقًا بسعر $0.002 لكل استدعاء ناجح؛ والإدخال غير الصالح لا يُفوتر.