كان لكل مستخدم أخطاء مطبعية عند كتابة طلبات البحث. يؤدي غياب الآليات التي تصحح الأخطاء المطبعية إلى إصدار نتائج غير ذات صلة ، أو حتى غيابها. لذلك ، لجعل محرك البحث أكثر توجهاً نحو المستخدم ، يتم إنشاء آليات تصحيح الأخطاء فيه.
تبدو مهمة تصحيح الأخطاء المطبعية ، للوهلة الأولى ، غير معقدة إلى حد ما. لكن إذا بدأت من مجموعة متنوعة من الأخطاء ، فقد يكون تطبيق حل ما أمرًا صعبًا. بشكل عام ، يتم تصحيح الخطأ المطبعي في سياق مستقل عن السياق وحساس للسياق
(حيث يتم أخذ بيئة القاموس في الاعتبار) . في الحالة الأولى ، يتم تصحيح الأخطاء لكل كلمة على حدة ، في الحالة الثانية - مع مراعاة السياق (على سبيل المثال ، بالنسبة لعبارة "ذهبت إلى المنزل" في الحالة المستقلة عن السياق ، يحدث التصحيح لكل كلمة على حدة ، حيث يمكننا الحصول على "لقد ذهبت إلى المنزل" ، وفي الحالة الثانية ، فإن التصحيح الصحيح سوف يعطي "ذهبت إلى المنزل").
في استعلامات البحث الخاصة بالمستخدم الناطق باللغة الروسية ، يمكن تمييز أربع مجموعات رئيسية من الأخطاء فقط للتصحيح المستقل للسياق [
1 ]:
1) الأخطاء في الكلمات نفسها (على سبيل المثال
mr → hi) ، تشمل هذه الفئة جميع أنواع الإغفالات والإدخالات والتعبير من الحروف - 63.7 ٪ ،
2) الإملاء المستمر للكلمات - 16.9 ٪ ،
3) تخطيط مشوه (ghbdtn → مرحبا) - 9.7 ٪ ،
4) حرفي (privet → مرحبا) - 1.3 ٪ ،
5) أخطاء مختلطة - 8.3 ٪.
المستخدمين جعل الأخطاء المطبعية في حوالي 10-15 ٪ من الحالات. في الوقت نفسه ، يوجد لدى 83.6٪ من الطلبات خطأ واحد ، 11.7٪ - اثنان ، 4.8٪ - أكثر من ثلاثة. السياق مهم في 26 ٪ من الحالات.
تم تجميع هذه الإحصاءات على أساس عينة عشوائية من سجل Yandex اليومي في عام 2013 استنادًا إلى 10000 استفسار. في المجال العام ، يوجد عرض تقديمي أقدم من ياندكس لعام 2008 ، والذي يوضح توزيعًا مشابهًا للإحصاءات [
2 ]. من هذا المنطلق يمكننا أن نستنتج أن توزيع أنواع الأخطاء لاستعلامات البحث ، في المتوسط ، لا يتغير مع مرور الوقت.
بشكل عام ، تعتمد آلية تصحيح الأخطاء المطبعية على نموذجين: نموذج الخطأ ونموذج اللغة. علاوة على ذلك ، من أجل تصحيح مستقل عن السياق ، يتم استخدام نموذج الخطأ فقط ، وفي تصحيح يعتمد على السياق ، يتم استخدام نموذجين مرة واحدة. عادة ما يكون نموذج الخطأ هو المسافة التحريرية
( مسافة
Levenshtein ، Damerau-Levenshtein ، عوامل ترجيح مختلفة ، طرق مشابهة لـ Soundex ، وما إلى ذلك. يمكن أيضًا إضافتها هنا - في هذه الحالة ، تُسمى المسافة الموزونة) ، أو نموذج Bril-Moore ، يعمل على احتمالات التحولات من سطر إلى آخر. يضع Bril and Moore نموذجهما على أنه أكثر كمالا ، ومع ذلك ، في أحد أحدث مسابقات SpellRuEval ، أظهر مقاربة Damerau-Levenshtein نتيجة أفضل [
3 ] ، على الرغم من أن مسافة Damerau-Levenshtein
(التوضيح غير مرجح) لا تستخدم معلومات مسبقة عن إحصائيات خارج الحراسة . هذه الملاحظة تدل بشكل خاص إذا تم استخدام نصوص التدريب نفسها في تطبيقات مختلفة من مصححات تلقائية في مكتبة DeepPavlov.
من الواضح ، أن إمكانية التصحيح الحساسة للسياق تعقد بناء المصحح التلقائي ، لأنه بالإضافة إلى نموذج الخطأ ، تتم إضافة الحاجة إلى نموذج اللغة. ولكن إذا كنت تهتم بإحصائيات الأخطاء المطبعية ، فيمكن تصحيح جميع طلبات البحث المكتوبة بطريقة غير صحيحة دون أي سياق. يشير هذا إلى أن فائدة مصحح تلقائي مستقل عن السياق على الأقل يمكن أن تكون كبيرة جدًا.
أيضا ، تصحيح السياق الحساسة لتصحيح الأخطاء المطبعية في طلبات كثيفة الاستخدام للموارد. على سبيل المثال ، في إحدى خطب ياندكس ، تختلف قائمة الأزواج لتصحيح الأخطاء المطبعية
(bigrams) للكلمات 10 مرات مقارنة بعدد الكلمات
(unigrams) ، فماذا عن التريغرامات؟ من الواضح أن هذا يعتمد إلى حد كبير على تباين الاستعلامات. يبدو غريبا بعض الشيء عندما يأخذ المصحح التلقائي نصف ذاكرة منتج الشركة المقترح ، والذي لا يركز الغرض منه على حل مشكلة الإملاء. لذا فإن مسألة تطبيق التصحيحات الحساسة للسياق في محركات البحث لمنتجات البرامج يمكن أن تكون مثيرة للجدل.
للوهلة الأولى ، لدى المرء انطباع بأن هناك العديد من الحلول الجاهزة لأي لغة برمجة يمكن استخدامها دون الكثير من الانغماس في تفاصيل تشغيل الخوارزميات ، بما في ذلك النظم التجارية. لكن في الممارسة العملية ، يستمر تطوير حلولهم. على سبيل المثال ، في الآونة الأخيرة نسبيًا ، اتخذ Joom قرارًا خاصًا بتصحيح الأخطاء المطبعية باستخدام نماذج اللغة لاستعلامات البحث [
4 ]. هل الوضع صعب حقًا مع توفر حلول تسليم المفتاح؟ تحقيقًا لهذه الغاية ، تم إجراء نظرة عامة واسعة النطاق على الحلول الحالية. قبل البدء في المراجعة ، سنقرر كيفية التحقق من جودة المصحح التلقائي.
مراقبة الجودة
مسألة التحقق من جودة المصحح التلقائي مثيرة للجدل للغاية. نهج واحد بسيط للتحقق من صحة هو من خلال الدقة والتذكر. وفقًا لمعايير ISO ، يتم استكمال الدقة والكمال بالصحة (باللغة الإنجليزية "corectness").
يتم احتساب اكتمال (Recall) على النحو التالي: سيتم تقديم قائمة بالكلمات الصحيحة إلى المصحح التلقائي (Total_list_true) ، وسيتم اعتبار عدد الكلمات الذي يعتبره المصحح التلقائي صحيحًا (Spellchecker_true) مقسومًا على إجمالي عدد الكلمات الصحيحة (Total_list_true).
لتحديد الدقة (الدقة) ، يتم تقديم قائمة بالكلمات غير الصحيحة (Total_list_false) لإدخال المصحح التلقائي ، وعدد الكلمات التي يعتبرها المصحح التلقائي غير صحيحة (Spell_checker_false) ، مقسومة على إجمالي عدد الكلمات غير الصحيحة (Total_list_false) ، يتم تعريفها على أنها دقة.
إلى أي مدى تكون هذه المقاييس مفيدة بالمعلومات وكيف يمكن أن تكون مفيدة ، يحدد كل منها بشكل مستقل. بعد كل شيء ، في الواقع ، فإن جوهر هذا الاختبار هو أنه يتم فحص الكلمة في قاموس التدريب. يمكن اعتبار الصدق مقياسًا أكثر وضوحًا ، حيث يشكل
المصحح التلقائي لكل كلمة من مجموعة اختبار الكلمات غير الصحيحة قائمة بالمرشحين البديلين الذين يمكن تصحيح هذه الكلمة غير الصحيحة
(ضع في اعتبارك أنه قد تكون هناك كلمات غير موجودة في قاموس التدريب) . لنفترض أن حجم قائمة المرشحين البديلين هو 5. بناءً على حقيقة أن حجم القائمة هو 5 ، سيتم تشكيل 6 مجموعات ، في واحدة منها سنضع كل كلمة خاطئة أصلية وفقًا للمبدأ التالي: في المجموعة الأولى - في قائمة المرشحين البديلين ، الكلمة الصحيحة التي من المفترض أن نكون فيها هي الأولى ، والثانية إذا كانت الثانية ، إلخ ، وفي المجموعة الأخيرة ، إذا لم تكن الكلمة الصحيحة المفترضة في قائمة المرشحين البديلين. بالطبع ، كلما سقطت الكلمات في المجموعة الأولى وأقل في المجموعة السادسة ، كلما كان المصحح التلقائي يعمل بشكل أفضل.
نظر المؤلفون في النهج المتبع في المادة [
5 ] ، حيث تمت مقارنة مصححات تلقائية مستقلة عن السياق مع تحيز لمعيار ISO. كما يوفر روابط لطرق تقييم الجودة الأخرى.
من ناحية ، لا يعتمد هذا النهج على الإحصاءات الإجمالية ، والتي يمكن أن تستند إلى نموذج الخطأ Brill - Moore [
6 ] أو نموذج الخطأ عن بعد الموزون Damerau - Levenshtein.
للتحقق من جودة عمل المصحح التلقائي المستقل للسياق ، أنشأنا مولد الأخطاء المطبعية الخاص بنا ، مما أدى إلى إنشاء أخطاء مطبعية للتخطيط الخاطئ والأخطاء الإملائية الخاطئة استنادًا إلى إحصائيات الأخطاء المطبعية المقدمة من Yandex. بالنسبة للأخطاء الإملائية ، تم إنشاء عمليات الإدراج العشوائية والاستبدال والحذف وإعادة الترتيب ، كما تباين عدد الأخطاء وفقًا لهذه الإحصاءات. بالنسبة للأخطاء في التخطيط المشوه ، تم تغيير الكلمة الصحيحة حرفًا تلو الآخر تمامًا وفقًا لجدول ترجمة الأحرف.
ثم تم إجراء سلسلة من التجارب لقائمة الكلمات الكاملة في قاموس التدريب
(تم تصحيح كلمات قاموس التدريب للكلمات غير الصحيحة وفقًا لاحتمال وجود خطأ مطبعي معين) . في المتوسط ، يصحح المصحح التلقائي الكلمات بشكل صحيح في 75٪ من الحالات. دون أدنى شك ، سيتم تخفيض هذا الرقم عندما يتم تجديد قاموس التعلم بكلمات قريبة من التحرير ، ومجموعة كبيرة ومتنوعة من أشكال الكلمات. يمكن حل هذه المشكلة عن طريق استكمال نماذج اللغة ، ولكن يجب أن يؤخذ في الاعتبار أن حجم الموارد المطلوبة سيزداد بشكل كبير.
حلول جاهزة
تم تنفيذ الحلول الجاهزة مع التركيز على استخدامها الخاص ، وتم إعطاء الأولوية للمصححات التلقائية التي تلبي ثلاثة معايير:
1) لغة التنفيذ ،
2) نوع الترخيص ،
3) التحديث.
في تطوير المنتجات ، تعتبر Java واحدة من أكثرها شعبية ، لذلك تم منحها الأولوية عند البحث عن المكتبات. من التراخيص ذات الصلة: معهد ماساتشوستس للتكنولوجيا ، العامة ، أباتشي ، بي إس دي. التحديث - ما لا يزيد عن سنتين من التحديث الأخير. أثناء البحث ، تم تسجيل معلومات إضافية ، على سبيل المثال ، حول النظام الأساسي المدعوم ، والبرامج الإضافية المطلوبة ، وميزات التطبيق ، والصعوبات المحتملة للاستخدام الأول ، وما إلى ذلك. يتم توفير الروابط مع المصادر الأساسية والمفيدة للمصادر في نهاية المقالة. بشكل عام ، إن لم يكن مقصوراً على المعايير المذكورة أعلاه ، فإن عدد الحلول الحالية كبير. دعونا نلقي نظرة سريعة على أهمها ، ونولي المزيد من الاهتمام لعدد قليل فقط.
تاريخياً ، يعد
Ispell (International Spell) ، أحد أقدم
المصحّحين التلقائيين ، الذي تم كتابته في المجمع عام 1971 ، وتم نقله لاحقًا إلى C ويستخدم مسافة التحرير Damerau-Levenshtein كنموذج للأخطاء. بالنسبة له ، هناك حتى قاموس باللغة الروسية. بعد ذلك ، تم استبداله
بمصححين تلقائيين هما
HunSpell (المعروف سابقًا باسم
MySpell ) و
Aspell . يتم تطبيق كلاهما في C ++ ويتم توزيعهما بموجب تراخيص GPL.
تتم تغطية
HunSpell أيضًا بواسطة GPL / MPL ويستخدم لتصحيح الأخطاء المطبعية في OpenOffice و LibreOffice و Google Chrome وأدوات أخرى.
هناك الكثير من حلول JS للإنترنت والمتصفحات (ويشمل ذلك:
جمل nodehun و
nspell و
node-markdown-spellcheck و
Proofreader و
Spellcheck-API - مجموعة من الحلول القائمة على
مصحح Hunspell التلقائي ؛
grunt-spell - لـ NodeJS؛
yaspeller- ci - wrapper لـ
Yandex.Speller مصحح تلقائي ، موزع تحت MIT ؛
rousseau - مصحح ضوئي خفيف في JS - يستخدم
للتهجئة ).
تتضمن فئة الحلول المدفوعة:
Spellex ؛
كود المصدر الإملائي مدقق - كتطبيق سطح المكتب. ل JS:
نانوسبيل . لجافا:
Keyoti RapidSpell Spellchecker ،
JSpell SDK ،
WinterTree (يمكن لـ WinterTree شراء حتى شفرة المصدر بمبلغ 5000 دولار).
يستخدم المصحح التلقائي لبيتر نورويغ على نطاق واسع ، كود بيثون الذي يتوفر للجمهور في مقال "
كيفية كتابة مصحح إملائي " [
7 ]. استنادًا إلى هذا الحل البسيط ، تم بناء
مصححات تلقائية
بلغات أخرى ، على سبيل المثال:
Norvig-spell-check ،
scala-norvig-spell-check (على Scala) ،
مصحح الهجاء الإملائي للعبة -
Golang Spellcheck (على GO) ،
pyspellchecker (على Python) . بالطبع ، نحن هنا لا نتحدث عن نماذج اللغة وتصحيح السياق الحساسة.
بالنسبة للمحررين النصيين ، وخاصةً للغة VIM التي صنعت
لهجة vim-vitt-ditto - موزعة بموجب ترخيص عام ؛ ل Notepad ++ التي وضعتها
DspellCheck في C ++ ، رخصة GPL ؛ لدى Emacs أداة لاكتشاف اللغات تلقائيًا عند الطباعة ، تسمى
لغة التخمين ، ويتم توزيعها بموجب ترخيص عام.
هناك خدمات منفصلة عن عمالقة البحث:
Yandex.Speller - من Yandex ، حول المجمع الذي تم ذكره أعلاه ،
google-api-الهجاء - جافا (على التوالي ، من Google).
مكتبات مجانية لـ Java:
languagetool (مرخصة بموجب LGPL) ، تتكامل مع مكتبة بحث النصوص Lucene وتسمح باستخدام نماذج اللغة ، مطلوب إصدار Java 8 ؛ مرخص Jazzy (التناظرية من
Aspell ) بموجب LGPLv2 ولم يتم تحديثه منذ عام 2005 ، وفي عام 2013 تم نقله إلى GitHub. في شبه هذا المصحح التلقائي ، تم صنع حل منفصل [
8 ] ؛ يتم توزيع
Jortho (Java Orthography) بموجب الترخيص العام ، ويسمح بالاستخدام المجاني حصريًا لأغراض غير تجارية ، لأغراض تجارية - مقابل رسوم إضافية ؛
Jaspell (مرخص بموجب BSD ولم يتم تحديثه منذ عام 2005) ؛
Open Source Java Suggester - لم يتم تحديثه منذ عام 2013 ، ووزعت بواسطة SoftCorporation LLC وتسمح بالاستخدام التجاري ؛
LuceneSpellChecker هو
مصحح ضوئي Lucene مكتوب بلغة Java ويتم توزيعه بموجب ترخيص Apache.
لفترة طويلة ، تعامل Wolf Garbe مع الأخطاء المطبعية ، اقترح الخوارزميات
SymSpell (بموجب ترخيص MIT) و
LinSpell (تحت LGPL) مع تطبيقات C # [
9 ] التي تستخدم مسافة Damerau-Levenshtein لنموذج الخطأ. خصوصية تنفيذها هي أنه في مرحلة توليد الأخطاء المحتملة لكلمة الإدخال ، يتم استخدام عمليات الحذف فقط ، بدلاً من جميع أنواع الحذف والإدراج والاستبدال والتباديل. بالمقارنة مع تنفيذ المصحح التلقائي لبيتر نورويغ ، تعمل الخوارزميات بشكل أسرع بسبب هذا ، في حين أن الزيادة في السرعة تزيد بشكل كبير إذا أصبحت مسافة Damerau-Levenshtein أكثر من اثنين. أيضًا ، نظرًا لحقيقة استخدام الحذف فقط ، يتم تقليل وقت تكوين القاموس. الفرق بين الخوارزميات هو أن
LinSpell هو أكثر اقتصادا في الذاكرة وأبطأ في سرعة البحث ،
SymSpell - بالعكس. في إصدار لاحق ،
يعمل SymSpell على إصلاح أخطاء التهجئة. لا تستخدم نماذج اللغة.
من بين أحدث واعد استخدام مصححات تلقائية تعمل مع نماذج اللغة وتصحيح الأخطاء المطبعية الحساسة
للسياق ، تشمل
Yandex.Speller و
JamSpell [
10 ] و DeepPavlov [
11 ]. يتم توزيع آخر 2 بحرية:
JamSpell (MIT) ،
DeepPavlov (تحت Apache).
يستخدم Yandex.Speller خوارزمية CatBoost ، ويعمل مع عدة لغات ويصحح جميع أنواع الأخطاء ، حتى مع مراعاة السياق. تم العثور على الحل الوحيد الذي يصحح أخطاء التخطيط والحروف غير الصحيحة. الحل لديه براعة ، مما يجعلها شعبية. عيبها هو أنها خدمة عن بعد ، ويمكن الاطلاع على القيود وشروط الاستخدام هنا [
12 ]. تعمل الخدمة مع عدد محدود من اللغات ؛ لا يمكنك إضافة كلمات بنفسك وإدارة عملية التصحيح. وفقًا للمصدر [
3 ] وفقًا لنتائج مسابقة RuSpellEval ، أظهر هذا المصحح التلقائي أعلى جودة من التصحيحات.
JamSpell هو أسرع
مصحح تلقائي معروف (تطبيق C ++) ، وهناك مجلدات جاهزة للغات أخرى. يصحح الأخطاء فقط في الكلمات نفسها ويعمل مع لغة معينة. لا يمكنك استخدام الحل على مستوى unigrams و bigrams. للحصول على جودة مقبولة ، مطلوب نص تدريب كبير.
لدى DeepPavlov بعض الممارسات الجيدة ، ومع ذلك ، فإن تكامل هذه الحلول والدعم اللاحق في المنتج الخاص بهم يمكن أن يسبب صعوبات ،
لأن العمل معهم يتطلب توصيل بيئة افتراضية واستخدام إصدار سابق من Python 3.6. يوفر
DeepPavlov خيارًا من بين ثلاثة تطبيقات جاهزة من
مصححات تلقائية ، يتم استخدام نماذج خطأ Bril-Moore بها في نموذجين للغة. إنه يصحح فقط الأخطاء الإملائية ، والخيار مع نموذج من الأخطاء على أساس المسافة Damerau-Levenshtein يمكن تصحيح أخطاء الكتابة المستمرة.
سوف أذكر واحدة أخرى من الأساليب الحديثة لتصحيح الأخطاء المطبعية ، والتي تقوم على استخدام تمثيلات متجهة للكلمات (Word Embeddings). ميزته هي أنه يمكن استخدامه لإنشاء مصحح تلقائي لتصحيح الكلمات بناءً على السياق. يمكن الاطلاع على مزيد من التفاصيل حول هذا النهج هنا [
13 ]. ولكن من أجل استخدامه لتصحيح الأخطاء المطبعية لاستعلامات البحث ، ستحتاج إلى تجميع سجل كبير من الاستعلامات. بالإضافة إلى ذلك ، يمكن أن يكون النموذج نفسه واسعًا للغاية من حيث استهلاك الذاكرة ، مما سيؤثر على تعقيد الاندماج في المنتج.
اختيار نعمين
من بين الحلول الجاهزة لنظام Java ، تم اختيار مصحح تلقائي من Lucene (تم توزيعه بموجب ترخيص من Apache). يسمح لك لتصحيح الأخطاء المطبعية في الكلمات. عملية التعلم سريعة: على سبيل المثال ، تم تكوين بنية بيانات القاموس الخاصة - فهرسة مكونة من 3 ملايين سطر كانت 30 ثانية على معالج Intel Core i5-8500 3.00GHz و 32 جيجا بايت RAM و Lucene 8.0.0. في الإصدارات السابقة ، قد يكون الوقت أطول مرتين. حجم قاموس التدريب هو 3 ملايين سطر (~ 73 ميجا بايت TXT- ملف) ، بنية الفهرس ~ 235 ميجا بايت. بالنسبة لنموذج الخطأ ، يمكنك اختيار مسافة Jaro-Winkler و Levenshtein و Damerau-Levenshtein و N-Gram ، إذا لزم الأمر ، يمكنك إضافة الخاصة بك. إذا لزم الأمر ، فمن الممكن توصيل نموذج اللغة [
14 ]. كانت النماذج معروفة منذ عام 2001 ، ولكن لم يتم العثور على مقارنتها بالحلول الحديثة المعروفة في المجال العام. والخطوة التالية هي التحقق من عملهم.
يعمل الحل الذي يستند إلى لوسين على تصحيح الأخطاء في الكلمات نفسها فقط. ليس من الصعب إضافة تصحيح لتخطيط لوحة المفاتيح المشوه لأي حل من هذا القبيل عن طريق جدول ترجمة مناسب ، مما يقلل من إمكانية الإخراج غير ذي الصلة إلى 10٪ (وفقًا للإحصائيات المطبعية). بالإضافة إلى ذلك ، فمن السهل أن تضيف كتابة منفصلة لكلمتين مصطنعتين ونص حرفي.
العيوب الرئيسية للحل هي الحاجة إلى معرفة Java ، والافتقار إلى حالات الاستخدام المفصلة والوثائق التفصيلية ، وهو ما ينعكس في انخفاض سرعة تطوير الحلول لمتخصصي علوم البيانات. بالإضافة إلى ذلك ، لا يتم تصحيح الأخطاء المطبعية مع مسافة Damerau-Levenshtein أكثر من 2. مرة أخرى ، إذا تابعنا الإحصائيات الخاطئة ، فإن أكثر من خطأين في كلمة ما يحدث بشكل متكرر أقل من 5٪ من الحالات. هل الحاجة إلى تعقيد الخوارزمية ، على وجه الخصوص ، زيادة في استهلاك الذاكرة ، لها ما يبررها؟ ذلك يعتمد بالفعل على حالة العميل. إذا كانت هناك موارد إضافية ، فلماذا لا تستخدمها؟
الموارد الرئيسية لمصحي السيارات ذات الأسعار المعقولة :- . .
- .
- DeepPavlov.
- Joom.
- Dall'Oglio P. Evaluation of legal words in three Java open source spell checkers: Hunspell, Basic Suggester, and Jazzy
- Eric B. and Robert M. An Improved Error Model for Noisy Channel Spelling Correction
- Norvig P. How to Write a Spelling Corrector
- Jazzy
- Garbe W. SymSpell vs. BK-tree: 100x faster fuzzy string search & spell checking
- Jamspell.
- DeepPavlov. Automatic spelling correction pipelines
- «API .»
- Singularis. ,
- Apache Lucene.