ابحث عن مطابقات تقريبية مع دوال أوتار ضبابية

مكتمل

نادرا ما تتطابق البيانات الواقعية بشكل مثالي. قد تكون أسماء العملاء مكتوبة بشكل خاطئ، أو اختصر العناوين بشكل مختلف، أو تم إدخال وصف المنتجات بشكل غير متسق. تساعدك وظائف مطابقة السلاسل الغامضة في العثور على سجلات متشابهة لكنها ليست مطابقة، مما يتيح تحسينات جودة البيانات، واكتشاف التكرار، وقدرات بحث أكثر مرونة.

فهم مفاهيم التشابه بين السلاسل النصية

تقيس خوارزميات المطابقة الضبابية مدى تشابه سلسلتين من خلال حساب الفروق بينهما. يستخدم نهجان رئيسيان بشكل شائع:

تعد مسافة التحرير (مسافة ليفنشتين) الحد الأدنى لعدد العمليات ذات الحرف الواحد (الإدخالات، الحذف، الاستبدالات) اللازمة لتحويل سلسلة إلى أخرى. تشير القيم الأدنى إلى وجود سلاسل أكثر تشابها.

تعبر درجات التشابه عن العلاقة بين السلاسل كنسبة مئوية أو نسبة، حيث تشير القيم الأعلى إلى تشابه أكبر.

خذ بعين الاعتبار هذه الأمثلة:

  • "اللون" → "اللون": مسافة التعديل = 1 (أدخل 'u')
  • "قاعدة بيانات" → "databaes": المسافة التحريرية = 2 (تبديل 'e' و 's')
  • "مايكروسوفت" → "ميكروسفت": مسافة التعديل = 1 (حذف 'o')

‏‫ملاحظة‬

المطابقة الضبابية مكلفة حسابيا مقارنة بالمطابقة الدقيقة. استخدمه بشكل استراتيجي، عادة على مجموعات مرشحة تم تصفيتها مسبقا باستخدام معايير أخرى.

حساب مسافة التحرير باستخدام EDIT_DISTANCE

تعيد الدالة EDIT_DISTANCE مسافة ليفنشتين بين وترتين، وهي الحد الأدنى لعدد التعديلات المطلوبة لتحويل سلسلة إلى أخرى. الهدف هو إيجاد سلاسل متشابهة بناء على عتبة محددة.

المثال التالي يوضح كيفية استخدام EDIT_DISTANCE:

SELECT 
    EDIT_DISTANCE('color', 'colour') AS ColorVariant,     -- Returns 1
    EDIT_DISTANCE('database', 'databaes') AS Typo,        -- Returns 2
    EDIT_DISTANCE('SQL Server', 'SQL Server') AS Exact,   -- Returns 0
    EDIT_DISTANCE('hello', 'world') AS Different;         -- Returns 4

يمكنك استخدامها EDIT_DISTANCE للعثور على سجلات قد تكون مكررة أو مطابقة رغم بعض الاختلافات الطفيفة:

-- Find customers with similar names to a search term
DECLARE @searchName NVARCHAR(100) = 'Jon Smith';

SELECT 
    CustomerID,
    FirstName,
    LastName,
    FirstName + ' ' + LastName AS FullName,
    EDIT_DISTANCE(@searchName, FirstName + ' ' + LastName) AS EditDistance
FROM SalesLT.Customer
WHERE EDIT_DISTANCE(@searchName, FirstName + ' ' + LastName) <= 3
ORDER BY EDIT_DISTANCE(@searchName, FirstName + ' ' + LastName);

أيضا، يمكنك العثور على منتجات مكررة محتملة:

-- Find product pairs with similar names
SELECT 
    p1.ProductID AS Product1ID,
    p1.Name AS Product1Name,
    p2.ProductID AS Product2ID,
    p2.Name AS Product2Name,
    EDIT_DISTANCE(p1.Name, p2.Name) AS EditDistance
FROM SalesLT.Product AS p1
INNER JOIN SalesLT.Product AS p2
    ON p1.ProductID < p2.ProductID
WHERE EDIT_DISTANCE(p1.Name, p2.Name) <= 5
ORDER BY EDIT_DISTANCE(p1.Name, p2.Name);

نصيحة

أقصى مسافة تعديل ذات معنى تعتمد على طول الوتر. بالنسبة للسلاسل القصيرة (5-10 أحرف)، تشير مسافة التحرير من 1 إلى 2 إلى التشابه. بالنسبة للأوتار الطويلة، قد تسمح بمسافات تتراوح بين 3-5.

قياس التشابه مع EDIT_DISTANCE_SIMILARITY

EDIT_DISTANCE_SIMILARITY يرجع درجة تشابه مطبعة بين 0 و100، حيث 100 تمثل سلاسل متطابقة. هذا المقياس القائم على النسبة المئوية أسهل في التفسير من مسافة التحرير الخام، خاصة عند مقارنة سلاسل بأطوال مختلفة:

SELECT 
    EDIT_DISTANCE_SIMILARITY('color', 'colour') AS ColorSimilarity,     -- ~85
    EDIT_DISTANCE_SIMILARITY('database', 'databaes') AS TypoSimilarity, -- ~75
    EDIT_DISTANCE_SIMILARITY('SQL', 'SQL Server') AS PartialMatch,      -- ~30
    EDIT_DISTANCE_SIMILARITY('hello', 'hello') AS Exact;                -- 100

يمكنك استخدام درجات التشابه للعثور على تطابقات تقريبية مع عتبة مثل المثال التالي:

-- Find products similar to a search term (at least 70% similar)
DECLARE @searchTerm NVARCHAR(100) = 'Mountain Bike Frame';

SELECT 
    ProductID,
    Name,
    EDIT_DISTANCE_SIMILARITY(@searchTerm, Name) AS SimilarityScore
FROM SalesLT.Product
WHERE EDIT_DISTANCE_SIMILARITY(@searchTerm, Name) >= 70
ORDER BY EDIT_DISTANCE_SIMILARITY(@searchTerm, Name) DESC;

احسب التشابه الصوتي مع JARO_WINKLER_DISTANCE

خوارزمية Jaro-Winkler مصممة خصيصا لمقارنة الأسماء والسلاسل القصيرة. يمنح درجات أعلى للسلاسل التي تتطابق من البداية، مما يجعله فعالا بشكل خاص لأسماء الأشخاص حيث تكون البادئات أكثر أهمية:

SELECT 
    JARO_WINKLER_DISTANCE('MARTHA', 'MARHTA') AS NameTypo,      -- ~0.96
    JARO_WINKLER_DISTANCE('JONES', 'JOHNSON') AS SimilarNames,  -- ~0.83
    JARO_WINKLER_DISTANCE('JOHN', 'JON') AS NameVariant,        -- ~0.93
    JARO_WINKLER_DISTANCE('SMITH', 'SMYTH') AS SpellingVar;     -- ~0.96

تتراوح درجة Jaro-Winkler من 0 إلى 1، حيث يشير 1 إلى الأوتار المتطابقة. عادة ما تشير الدرجة فوق 0.9 إلى تطابق قوي للأسماء.

يجد المثال التالي عملاء بأسماء مشابهة لأسماء البحث:

-- Find customers with names similar to a search
DECLARE @searchFirst NVARCHAR(50) = 'John';
DECLARE @searchLast NVARCHAR(50) = 'Smythe';

SELECT 
    CustomerID,
    FirstName,
    LastName,
    JARO_WINKLER_DISTANCE(@searchFirst, FirstName) AS FirstNameScore,
    JARO_WINKLER_DISTANCE(@searchLast, LastName) AS LastNameScore,
    (JARO_WINKLER_DISTANCE(@searchFirst, FirstName) + 
     JARO_WINKLER_DISTANCE(@searchLast, LastName)) / 2 AS CombinedScore
FROM SalesLT.Customer
WHERE JARO_WINKLER_DISTANCE(@searchFirst, FirstName) > 0.85
  AND JARO_WINKLER_DISTANCE(@searchLast, LastName) > 0.85
ORDER BY CombinedScore DESC;

‏‫ملاحظة‬

Jaro-Winkler محسن للسلاسل القصيرة مثل الأسماء. بالنسبة للسلاسل الأطول مثل العناوين أو الوصف، EDIT_DISTANCE_SIMILARITY غالبا ما يعطي نتائج أفضل.

الاعتبارات الخاصة بالأداء

تفحص دوال المطابقة الضبابية كل حرف في كلتا السلسلتين، مما يجعلها مكثفة حسابيا. يمكن أن تتوقف المقارنة الدقيقة بين السلاسل بمجرد اختلاف الحروف، وتستخدم عمليات البحث المفهرسة تجاوزا فعالا لشجرة B. على النقيض من ذلك، يجب على الخوارزميات الضبابية حساب درجات التشابه حرفا بحرف تلو الآخر. بالنسبة لجدول يحتوي على مليون صف، قد يجري بحث ضبابي غير محسن مليون حساب تشابه، كل حساب يتضمن عشرات مقارنات الحروف.

مفتاح المطابقة الضبابية الفعالة هو تقليل مجموعة المرشحين قبل تطبيق الدوال الضبابية المكلفة. استخدم الأعمدة المفهرسة مع LIKE الأنماط، أو تطابقات دقيقة في الحقول ذات الصلة، أو مرشحات النطاق لتضييق النتائج أولا. فقط بعد ذلك تطبق المطابقة الضبابية على مجموعة المرشحين الأصغر.

تظهر الأمثلة التالية هذا النهج التدريجي في التصفية:

-- Not good: Fuzzy match against entire table
SELECT * FROM LargeCustomerTable
WHERE EDIT_DISTANCE_SIMILARITY('John Smith', FullName) > 70;

-- Better: Pre-filter before fuzzy matching
SELECT * FROM LargeCustomerTable
WHERE FullName LIKE 'J%'  -- First letter filter
  AND EDIT_DISTANCE_SIMILARITY('John Smith', FullName) > 70;

-- Best: Use multiple pre-filters
SELECT * FROM LargeCustomerTable
WHERE FirstName LIKE 'Jo%'
  AND LastName LIKE 'Sm%'
  AND JARO_WINKLER_DISTANCE('John', FirstName) > 0.85
  AND JARO_WINKLER_DISTANCE('Smith', LastName) > 0.85;

مهم

وظائف مطابقة السلاسل النصية الضبابية مثل EDIT_DISTANCE، EDIT_DISTANCE_SIMILARITY، ومتوفرة JARO_WINKLER_DISTANCE في SQL Server 2025 وما بعده، وقاعدة بيانات Azure SQL، وقواعد بيانات SQL في Microsoft Fabric. تحقق من وثائق منصتك لمعرفة توفر الميزات المحددة.

لمزيد من المعلومات حول مطابقة الأوتار الضبابية، راجع دوال الأوتار.