SELECT
FirstName,
SOUNDEX(FirstName) AS SoundTest
FROM
NamesTable
وقد تكون المخرجات شبيه بـ:
الدالة DIFFERENCE
يبدو أن سر اللعبة بدأ بالانكشاف، فقد فهمنا ان الدالة SOUNDEX تقوم بتحويل الاسم إلى قيمة مكونة من 4 خانات، والان يأتي دور الدالة DIFFERENCE والتي تقوم بحساب الفرق بين قيمتين ومن ثم تعتمدها او لا، يمكنك إرسال القيمة التي تود اختبارها كوسيط ثانية للدالة:
SELECT
FirstName,
SOUNDEX(FirstName) AS SoundTest,
DIFFERENCE(FirstName, 'Turki') As DiffTest
FROM
NamesTable
الاضافة السابقة ستظهر حقل جديد (بالاسم DiffTest) يظهر فرق القيم عن الكلمة "Turki" كما بالشكل التالي:
تلاحظ في الشكل السابق نتائج حساب الفرق بالدالة DIFFERENCE مع الاسم Turki، حيث كان الفرق 4 عند الاسماء التي تشبه Turki وقل كثيرا مع الاسماء الاخرى، وحتى تتحكم اكثر في عملية الفلترة لاحقا، عليك معرفة كيف تحسب نتيجة الفرق.
عندما تستخدم الدالة DIFFERENCE(x, y) ستعود بقيمة تمثل مستوى الفرق الصوتي بين الكلمة x و الكلمة y، نتيجة هذه القيمة تكون بين 0 إلى 4، الرقم 4 يشير بأن الكلمتان x و y متشابهتان جدا بينما القيمة 0 تشير إلى عدم وجود أي تشابه صوتي بينهما، طريق حساب الفرق تكون كالتالي:
1. يتم تحويل الكلمة x إلى القيمة الصوتية sx (والتي تتكون من اربع خانات باستخدام SOUNDEX).
2. يتم تحويل الكلمة y إلى القيمة الصوتية sy.
3. اذا كان جميع خانات القيمة sx تماثل خانات القيمة sy فستعود الدالة DIFFERENCE بالقيمة 4، وتنتهي المقارنة.
4. ان كانت الخانة الأول لـ sx لا تساوي الخانة الأولى لـ sy فستكون النتيجة الابتدائية 0.
5. يتم مقارنة الخانة الثانية لكلا القيمتين، ان توافقا زادت النتيجة بواحد، وان لم يتوافقا تتم مقارنة القيمة الثالثة ... وهكذا.
وقت العرض Show Time
لست متأكدا إن كنت فهمت طريقة حساب الفرق ام لا، ولكن استيعابك لها يعتبر بالغ الاهمية حتى تظهر نتائج اكثر دقة، فلو اردنا تطبيق الفلترة ورغبنا بالبحث عن الاسم Khaled، قد نكتب:
SELECT
FirstName
FROM
NamesTable
WHERE
DIFFERENCE(FirstName, 'Khalid') = 4
لتكون النتيجة:
تلاحظ في الشرط السابق اني طلبت ان يكون الفرق 4 (متشابهة تماما)، ولكن في حالات كثيرة (خاصة ان وجد اختلاف في الحرف الأول) يفضل تقليص الفرق إلى 3، فلو كنا نبحث عن الاسم "قاسم" فهناك من يكتبه Kasem وهناك من يكتبه Qasem:
SELECT
FirstName
FROM
NamesTable
WHERE
DIFFERENCE(FirstName, 'Qasem') >= 3
لست بحاجة لأخبرك بأنك كلما قلصت الفرق كلما اصبحت النتائج اكثر تباعدا! (1)
لا تتحمس كثيرا!!
قد يكون شد انتباهك هذا الخوارزم كثيرا وأثار شهوتك البرمجية، وقد تنوي الاعتماد عليه في ((كل)) جملة استعلام ينطق بها برنامجك القادم، ولكن اتمنى ان تطفئ لهيب الحماس قليلا وتنظر إلى الوجه المظلم من هذا الخوارزم!
قلت في بداية هذا المقال ان الخطوة الاولى التي يفعلها الخوارزم (بالتحديد الدالة SOUNDEX) هي تحويل الكلمات إلى قيم صوتية خاصة مكونة من 4 خانات، وقد تسألني سؤال وتقول ماهي القاعدة او ما هو الاساس الذي بنت عليه الدالة SOUNDEX لتوليد هذه القيم؟ والاجابة لست مضطرا لمعرفتها (بكل أمانة لم أتعمق في هذه المسألة كثيرا ولا أدري كيف ولدت)، ولكنك مضطر لمعرفة بضعة أمور خطيرة جدا حول هذه العملية، اولها (كما سبق ذكره) ان الخانة الأولى تكون الحرف الأول من الكلمة.
بخصوص الأرقام، فيتم توليدها بناء على حروف الكلمة الأصلية، ولكن عليك معرفة ان الدالة SOUNDEX تقوم بتجاهل حروف العلة Vowel Letters الانجليزية (a e i o u) بالاضافة إلى الحرفين h و y، مع العلم ان الحرف الأول لا يتم تجاهله حتى لو كان حرف علة، فالاسم Ahmed يعطي القيمة A530 بعد تحويله.
المزيد أيضا، بعد تجاهل حروف العلة تبدأ الدالة بفهم حرف حرف من الاسم، وبمجرد وجود مسافة او رقم او أي رمز أخر غير الحروف سيتم تجاهل باقي الحقل، فالاسم Al-Asiri يعطي القيمة A400 والاسم Al-Qahtani يعطي القيمة A400 ايضا، والسبب ان الدالة اختبرت الحروف Al فقط (والتي دائما تعطي القيمة A400). (2)
في حالة كون جميع الحروف التي تلي الحرف الأول هي حروف علة (او من ضمن الحروف المتجاهلة) مثل الاسم Maya، فسيتم تجاهلها كما ذكرت وتصفيرها لتعطي القيمة M000.
المزيد من العيوب ايضا، تقوم الدالة بتحويل 3 حروف (ثابتة Constant غير العلة) من بعد الحرف الأول للكلمة فقط، وان وجد اكثر فلا تؤخذ بعين الاعتبار، فالاسماء Abdullah و Abdullrahman تعودان بالقيمة A134.
كما ان الدالة SOUNDEX ليست صوتية بشكل واقعي، فهي –مثلا- لا تميز الحروف الساكنة Silent Letters، فالكلمة Knife تعطي القيمة K510 بينما (اختها في النطق) Nife تعطي القيمة N100.
اخيرا (معذرة على التطفيش)، الارقام المولدة لا تفرق بين الحرفان m و n، نطق الاسماء Smeef و Snaaf يبدوان مختلفان كثيرا، ولكن مع الجانب المظلم للدالة SOUNDEX، كلامها يعطي القيمة S510! (احذف حروف العلة وستفهم السبب).
ألهذه الدرجة هي سيئة؟
في الحقيقة ليست سيئة بل على العكس من ذلك فهي مفيدة جدا (على الاقل ستعطي نتائج اضافية مع عملية البحث)، ولكن (من واقع خبرتي الشخصية) انصحك بالاعتماد عليها عند حالات كون الكلمات غير موحدة الهجاء مثل الاسماء، او يمكنك جعل برنامجك يدعمها كخدمة او خيار اضافي للمستخدم، فهي ان لم تفيده لن تضره.
عرضت في هذا المقال اسلوب البحث الصوتي والذي يدعمه SQL Server منذ اصداره 2000، أتمنى من جميع المبرمجين ((مساعدة)) و ((تسهيل)) حياة المستخدمين فهم استخدموا انظمتنا لمساعدتهم في حل مشاكلهم وليس زيادتها، كما ارجوا من شركة الاتصالات اعادة عبود اللوح إلى مكان عمله فالذنب ليس ذنبه!
-- تركي
________________________
(1) سيكون من الرائع اعطاء فرصة لمستخدم برنامجك امكانية تعديل قيمة الفرق.
(2) نفهم انها لا تصلح للاستخدام مع الحقول التي تحتوي على اكثر من كلمة.