
مهمتها بسيطة: إنها تخبرك باللغة التي يتم كتابتها بعض النص. وهذا مفيد للغاية كخطوة للمعالجة المسبقة للبيانات اللغوية في تطبيقات معالجة اللغة الطبيعية مثل تصنيف النص والتحقق الإملائي. قد تتضمن حالات الاستخدام الأخرى ، على سبيل المثال ، توجيه رسائل البريد الإلكتروني إلى قسم خدمة العملاء في موقع جغرافي ، استنادًا إلى لغات رسائل البريد الإلكتروني.
غالبًا ما يتم اكتشاف اللغة كجزء من أطر التعلم الآلي الكبيرة أو تطبيقات معالجة اللغة الطبيعية. في الحالات التي لا تحتاج فيها إلى الوظائف الكاملة لتلك الأنظمة أو لا ترغب في تعلم حبالها ، تأتي مكتبة مرنة صغيرة في متناول يدي.
حتى الآن ، فإن مكتبة المصادر الشاملة الوحيدة الشاملة في النظام الإيكولوجي لهذه المهمة هي Whatlanggo . لسوء الحظ ، لديها عيبان رئيسيان:
Lingua تهدف إلى القضاء على هذه المشاكل. إنها لا تحتاج تقريبًا إلى أي تكوين وتؤدي إلى نتائج دقيقة جدًا على كل من النص الطويل والقصير ، حتى على الكلمات والعبارات المفردة. إنها تعتمد على كل من الأساليب القائمة على القواعد والإحصائية ولكنها لا تستخدم أي قواميس للكلمات. إنها لا تحتاج إلى اتصال بأي واجهة برمجة تطبيقات خارجية أو خدمة أيضًا. بمجرد تنزيل المكتبة ، يمكن استخدامها في وضع عدم الاتصال تمامًا.
مقارنةً بمكتبات الكشف عن اللغة الأخرى ، فإن تركيز Lingua على الجودة على الكمية ، أي الحصول على الكشف بشكل صحيح لمجموعة صغيرة من اللغات أولاً قبل إضافة لغات جديدة. حاليًا ، يتم دعم الـ 75 لغة التالية:
Lingua قادرة على الإبلاغ عن إحصائيات الدقة لبعض بيانات الاختبار المجمعة المتاحة لكل لغة مدعومة. يتم تقسيم بيانات الاختبار لكل لغة إلى ثلاثة أجزاء:
تم إنشاء كل من نماذج اللغة وبيانات الاختبار من وثائق منفصلة لشركة Wortschatz التي تقدمها جامعة لايبزيغ ، ألمانيا. تم استخدام البيانات التي تم زحفها من مواقع الأخبار المختلفة للتدريب ، حيث تضم كل مجموعة مليون جملة. للاختبار ، تم استخدام Corpora المصنوع من مواقع الويب التي تم اختيارها بشكل تعسفي ، ويضم كل منها عشرة آلاف من الجمل. من كل مجموعة اختبار ، تم استخراج مجموعة فرعية عشوائية غير مصنفة من 1000 كلمة واحدة ، 1000 زوج من كلمة و 1000 جملة ، على التوالي.
بالنظر إلى بيانات الاختبار التي تم إنشاؤها ، قارنت نتائج اكتشاف Lingua و Whatlanggo التي تعمل على بيانات Lingua المدعومة من 75 لغة. بالإضافة إلى ذلك ، لقد أضفت CLD3 من Google إلى المقارنة بمساعدة روابط GOCLD3. يتم تجاهل اللغات التي لا تدعمها CLD3 أو Whatlanggo ببساطة أثناء عملية الكشف.
يحتوي كل من الأقسام التالية على قطعتين. تُظهر مؤامرة الشريط نتائج الدقة التفصيلية لكل لغة مدعومة. توضح مؤامرة المربع توزيعات قيم الدقة لكل مصنف. تمثل الصناديق نفسها المناطق التي تقع فيها 50 ٪ من البيانات في منتصفها. داخل الصناديق الملونة ، تمثل الخطوط الأفقية الوسيطة في التوزيعات.
يوضح الجدول أدناه إحصائيات مفصلة لكل لغة ومصنف بما في ذلك الانحراف المتوسط والمتوسط والمعياري.
| لغة | متوسط | كلمات واحدة | أزواج الكلمات | جمل | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | CLD3 | Whatlang | لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | CLD3 | Whatlang | لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | CLD3 | Whatlang | لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | CLD3 | Whatlang | |
| أفريكانيين | 79 | 64 | 55 | 51 | 58 | 38 | 22 | 21 | 81 | 62 | 46 | 39 | 97 | 93 | 98 | 92 |
| الألبانية | 88 | 80 | 55 | - | 69 | 54 | 18 | - | 95 | 86 | 48 | - | 100 | 99 | 98 | - |
| عربي | 98 | 94 | 90 | 89 | 96 | 88 | 79 | 77 | 99 | 96 | 92 | 91 | 100 | 99 | 100 | 99 |
| أرمني | 100 | 100 | 99 | - | 100 | 100 | 100 | - | 100 | 100 | 100 | - | 100 | 100 | 97 | - |
| أذربيجاني | 90 | 82 | 81 | 64 | 77 | 71 | 62 | 45 | 92 | 78 | 82 | 58 | 99 | 96 | 99 | 91 |
| الباسك | 84 | 75 | 62 | - | 71 | 56 | 33 | - | 87 | 76 | 62 | - | 93 | 92 | 92 | - |
| البيلاروسي | 97 | 92 | 84 | 81 | 92 | 80 | 67 | 64 | 99 | 95 | 86 | 80 | 100 | 100 | 100 | 98 |
| البنغالية | 100 | 100 | 99 | 100 | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 |
| بوكمال | 58 | 50 | - | 34 | 39 | 27 | - | 15 | 59 | 47 | - | 28 | 77 | 75 | - | 60 |
| البوسني | 35 | 29 | 33 | - | 29 | 23 | 19 | - | 35 | 29 | 28 | - | 41 | 36 | 52 | - |
| البلغارية | 87 | 78 | 70 | 61 | 70 | 56 | 45 | 37 | 91 | 81 | 66 | 57 | 99 | 96 | 98 | 89 |
| كاتالونية | 70 | 58 | 48 | - | 51 | 33 | 19 | - | 74 | 60 | 42 | - | 87 | 82 | 84 | - |
| الصينية | 100 | 100 | 92 | 100 | 100 | 100 | 92 | 100 | 100 | 100 | 83 | 100 | 100 | 100 | 100 | 100 |
| الكرواتية | 73 | 60 | 42 | 55 | 53 | 36 | 26 | 28 | 74 | 57 | 42 | 44 | 90 | 86 | 58 | 91 |
| التشيكية | 80 | 71 | 64 | 50 | 66 | 54 | 39 | 31 | 84 | 72 | 65 | 46 | 91 | 87 | 88 | 71 |
| دانماركي | 81 | 70 | 58 | 47 | 61 | 45 | 26 | 24 | 84 | 70 | 54 | 38 | 98 | 95 | 95 | 79 |
| هولندي | 77 | 64 | 58 | 47 | 55 | 36 | 29 | 22 | 81 | 61 | 47 | 36 | 96 | 94 | 97 | 82 |
| إنجليزي | 81 | 63 | 54 | 49 | 55 | 29 | 22 | 17 | 89 | 62 | 44 | 35 | 99 | 97 | 97 | 94 |
| إسبرانتو | 84 | 66 | 57 | 52 | 67 | 44 | 22 | 25 | 85 | 61 | 51 | 45 | 98 | 93 | 98 | 88 |
| الإستونية | 92 | 83 | 70 | 61 | 80 | 62 | 41 | 36 | 96 | 88 | 69 | 53 | 100 | 99 | 99 | 94 |
| الفنلندية | 96 | 91 | 80 | 71 | 90 | 77 | 58 | 45 | 98 | 95 | 84 | 70 | 100 | 100 | 99 | 98 |
| فرنسي | 89 | 77 | 55 | 64 | 74 | 52 | 22 | 37 | 94 | 83 | 49 | 59 | 99 | 98 | 94 | 97 |
| غاندا | 91 | 84 | - | - | 79 | 65 | - | - | 95 | 87 | - | - | 100 | 100 | - | - |
| الجورجي | 100 | 100 | 98 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 96 | 100 |
| الألمانية | 89 | 80 | 66 | 65 | 74 | 57 | 40 | 38 | 94 | 84 | 62 | 60 | 100 | 99 | 98 | 97 |
| اليونانية | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| غوجاراتية | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| العبرية | 100 | 100 | - | 90 | 100 | 100 | - | 76 | 100 | 100 | - | 94 | 100 | 100 | - | 99 |
| الهندية | 73 | 33 | 58 | 52 | 61 | 11 | 34 | 27 | 64 | 20 | 45 | 40 | 95 | 67 | 95 | 88 |
| المجري | 95 | 90 | 76 | 62 | 87 | 77 | 53 | 37 | 98 | 94 | 76 | 53 | 100 | 100 | 99 | 95 |
| الأيسلندية | 93 | 88 | 71 | - | 83 | 72 | 42 | - | 97 | 92 | 70 | - | 100 | 99 | 99 | - |
| إندونيسي | 61 | 47 | 46 | 67 | 39 | 25 | 26 | 39 | 61 | 46 | 45 | 66 | 83 | 71 | 66 | 95 |
| الأيرلندية | 91 | 85 | 67 | - | 82 | 70 | 42 | - | 94 | 90 | 66 | - | 96 | 95 | 94 | - |
| إيطالي | 87 | 71 | 62 | 56 | 69 | 42 | 31 | 25 | 92 | 74 | 57 | 47 | 100 | 98 | 98 | 96 |
| اليابانية | 100 | 100 | 98 | 99 | 100 | 100 | 97 | 100 | 100 | 100 | 96 | 100 | 100 | 100 | 100 | 97 |
| كازاخاخية | 92 | 90 | 82 | - | 80 | 78 | 62 | - | 96 | 93 | 83 | - | 99 | 99 | 99 | - |
| كوري | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 100 |
| اللاتينية | 87 | 73 | 62 | - | 72 | 49 | 44 | - | 93 | 76 | 58 | - | 97 | 94 | 83 | - |
| لاتفيا | 93 | 87 | 75 | 59 | 85 | 75 | 51 | 36 | 97 | 90 | 77 | 54 | 99 | 97 | 98 | 87 |
| الليتواني | 95 | 87 | 72 | 62 | 86 | 76 | 42 | 38 | 98 | 89 | 75 | 56 | 100 | 98 | 99 | 92 |
| مقدوني | 84 | 72 | 60 | 62 | 66 | 52 | 30 | 39 | 86 | 70 | 54 | 55 | 99 | 95 | 97 | 94 |
| الملايو | 31 | 31 | 22 | - | 26 | 22 | 11 | - | 38 | 36 | 22 | - | 28 | 35 | 34 | - |
| الماوري | 91 | 82 | 52 | - | 82 | 62 | 22 | - | 92 | 87 | 43 | - | 99 | 98 | 91 | - |
| المهاراتية | 85 | 39 | 84 | 73 | 74 | 16 | 69 | 52 | 85 | 30 | 84 | 74 | 96 | 72 | 98 | 93 |
| المنغولي | 97 | 95 | 83 | - | 93 | 89 | 63 | - | 99 | 98 | 87 | - | 99 | 99 | 99 | - |
| نينورسك | 66 | 52 | - | 34 | 41 | 25 | - | 10 | 66 | 49 | - | 24 | 91 | 81 | - | 69 |
| فارسي | 90 | 80 | 76 | 70 | 78 | 62 | 57 | 46 | 94 | 80 | 70 | 66 | 100 | 98 | 99 | 99 |
| بولندي | 95 | 90 | 77 | 66 | 85 | 77 | 51 | 45 | 98 | 93 | 80 | 59 | 100 | 99 | 99 | 94 |
| البرتغالية | 81 | 69 | 53 | 57 | 59 | 42 | 21 | 26 | 85 | 70 | 40 | 48 | 99 | 95 | 97 | 96 |
| البنجابية | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| روماني | 87 | 72 | 53 | 59 | 69 | 49 | 24 | 34 | 92 | 74 | 48 | 52 | 99 | 94 | 88 | 90 |
| الروسية | 90 | 78 | 71 | 53 | 76 | 59 | 48 | 40 | 95 | 84 | 72 | 52 | 98 | 92 | 93 | 68 |
| الصربي | 88 | 78 | 78 | 57 | 74 | 62 | 63 | 34 | 90 | 80 | 75 | 51 | 99 | 91 | 95 | 86 |
| شونا | 91 | 81 | 76 | 68 | 78 | 56 | 51 | 44 | 96 | 86 | 79 | 65 | 100 | 100 | 99 | 95 |
| سلوفاك | 84 | 75 | 63 | - | 64 | 49 | 32 | - | 90 | 78 | 61 | - | 99 | 97 | 96 | - |
| سلوفيني | 82 | 67 | 63 | 48 | 61 | 39 | 29 | 25 | 87 | 68 | 60 | 38 | 99 | 93 | 99 | 81 |
| صومالي | 92 | 85 | 69 | 68 | 82 | 64 | 38 | 38 | 96 | 90 | 70 | 66 | 100 | 100 | 100 | 99 |
| سوثو | 86 | 72 | 49 | - | 67 | 43 | 15 | - | 90 | 75 | 33 | - | 100 | 97 | 98 | - |
| الأسبانية | 70 | 56 | 48 | 48 | 44 | 26 | 16 | 19 | 69 | 49 | 32 | 33 | 97 | 94 | 96 | 93 |
| السواحيلية | 81 | 70 | 57 | - | 60 | 43 | 25 | - | 84 | 68 | 49 | - | 98 | 97 | 98 | - |
| السويدية | 84 | 72 | 61 | 49 | 64 | 46 | 30 | 24 | 88 | 76 | 56 | 40 | 99 | 94 | 96 | 83 |
| التاغالوغ | 78 | 66 | - | 52 | 52 | 36 | - | 23 | 83 | 67 | - | 43 | 98 | 96 | - | 90 |
| التاميل | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| التيلجو | 100 | 100 | 99 | 100 | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 99 | 100 |
| التايلاندية | 100 | 100 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 99 |
| تسونجا | 84 | 72 | - | - | 66 | 46 | - | - | 89 | 73 | - | - | 98 | 97 | - | - |
| Tswana | 84 | 71 | - | - | 65 | 44 | - | - | 88 | 73 | - | - | 99 | 96 | - | - |
| التركية | 94 | 87 | 69 | 54 | 84 | 71 | 41 | 26 | 98 | 91 | 70 | 44 | 100 | 100 | 97 | 92 |
| الأوكرانية | 92 | 86 | 81 | 72 | 84 | 75 | 62 | 53 | 97 | 92 | 83 | 71 | 95 | 93 | 98 | 93 |
| الأردية | 91 | 80 | 61 | 57 | 80 | 65 | 39 | 31 | 94 | 78 | 53 | 46 | 98 | 96 | 92 | 94 |
| الفيتنامي | 91 | 87 | 66 | 73 | 79 | 76 | 26 | 36 | 94 | 87 | 74 | 85 | 99 | 98 | 99 | 97 |
| الويلزية | 91 | 82 | 69 | - | 78 | 61 | 43 | - | 96 | 87 | 66 | - | 99 | 99 | 98 | - |
| Xhosa | 82 | 69 | 66 | - | 64 | 45 | 40 | - | 85 | 67 | 65 | - | 98 | 94 | 92 | - |
| يوروبا | 74 | 62 | 15 | 22 | 50 | 33 | 5 | 11 | 77 | 61 | 11 | 14 | 96 | 92 | 28 | 41 |
| زولو | 81 | 70 | 63 | 70 | 62 | 45 | 35 | 44 | 83 | 72 | 63 | 68 | 97 | 94 | 92 | 98 |
| يقصد | 86 | 77 | 69 | 67 | 74 | 61 | 48 | 48 | 89 | 78 | 67 | 63 | 96 | 93 | 93 | 91 |
| متوسط | 89.0 | 80.0 | 68.0 | 62.0 | 74.0 | 57.0 | 41.0 | 38.0 | 94.0 | 81.0 | 66.0 | 57.0 | 99.0 | 97.0 | 98.0 | 94.0 |
| الانحراف المعياري | 13.08 | 17.29 | 19.04 | 20.22 | 18.41 | 24.9 | 27.86 | 29.28 | 13.12 | 18.93 | 21.83 | 24.22 | 11.05 | 11.91 | 13.95 | 11.24 |
يستخدم كل كاشف لغة نموذج N-Gram الاحتمالي المدرب على توزيع الأحرف في بعض مجموعة التدريب. تستخدم معظم المكتبات فقط n-grams من الحجم 3 (trigrams) والتي تعد مرضية لاكتشاف لغة شظايا النص الأطول التي تتكون من جمل متعددة. بالنسبة للعبارات القصيرة أو الكلمات الفردية ، ومع ذلك ، فإن trigrams ليست كافية. كلما كان نص الإدخال أقصر ، تتوفر أقل من n-grams. الاحتمالات المقدرة من مثل هذه n-grams غير موثوقة. هذا هو السبب في أن Lingua تستخدم n-grams من الأحجام 1 حتى 5 مما يؤدي إلى تنبؤ أكثر دقة للغة الصحيحة.
الاختلاف المهم الثاني هو أن Lingua لا تستخدم هذا النموذج الإحصائي فحسب ، بل يستخدم أيضًا محركًا قائمًا على القواعد. يحدد هذا المحرك أولاً الأبجدية لنص الإدخال ويبحث عن الأحرف الفريدة من نوعها بلغة واحدة أو أكثر. إذا كان من الممكن اختيار لغة واحدة بشكل موثوق بهذه الطريقة ، فإن النموذج الإحصائي لم يعد ضروريًا بعد الآن. في أي حال ، يقوم المحرك القائم على القواعد بتصفية اللغات التي لا تلبي شروط نص الإدخال. عندها فقط ، في خطوة ثانية ، يتم أخذ نموذج N-Gram الاحتمالي في الاعتبار. هذا أمر منطقي لأن تحميل نماذج اللغة أقل يعني استهلاكًا للذاكرة وأداء وقت تشغيل أفضل.
بشكل عام ، من الجيد دائمًا تقييد مجموعة اللغات التي يجب مراعاتها في عملية التصنيف باستخدام أساليب API المعنية. إذا كنت تعرف مسبقًا أن بعض اللغات لن تحدث أبدًا في نص الإدخال ، فلا تدع هؤلاء المشاركين في عملية التصنيف. ومع ذلك ، فإن آلية التصفية للمحرك القائم على القواعد جيدة جدًا ، فإن التصفية بناءً على معرفتك الخاصة بنص الإدخال هو الأفضل دائمًا.
إذا كنت ترغب في إعادة إنتاج نتائج الدقة أعلاه ، فيمكنك إنشاء تقارير الاختبار بنفسك لكل من المصنفات وجميع اللغات عن طريق القيام:
cd cmd
go run accuracy_reporter.go
لكي يتم تشغيل GOCLD3 بنجاح ، تحتاج إلى تثبيت الإصدار الدقيق 3.17.3 من مخازن بروتوكول Google وهو أمر مؤسف بعض الشيء. لكل كاشف ولغة ، يتم بعد ذلك كتابة ملف تقرير اختبار في /accuracy-reports . على سبيل المثال ، إليك الإخراج الحالي للتقرير الألماني اللغوي :
##### German #####
>>> Accuracy on average: 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 73.90%
Erroneously classified as Dutch: 2.30%, Danish: 2.10%, English: 2.00%, Latin: 1.90%, Bokmal: 1.60%, Basque: 1.20%, French: 1.20%, Italian: 1.20%, Esperanto: 1.10%, Swedish: 1.00%, Afrikaans: 0.80%, Tsonga: 0.70%, Nynorsk: 0.60%, Portuguese: 0.60%, Yoruba: 0.60%, Finnish: 0.50%, Sotho: 0.50%, Welsh: 0.50%, Estonian: 0.40%, Irish: 0.40%, Polish: 0.40%, Spanish: 0.40%, Swahili: 0.40%, Tswana: 0.40%, Bosnian: 0.30%, Icelandic: 0.30%, Tagalog: 0.30%, Albanian: 0.20%, Catalan: 0.20%, Croatian: 0.20%, Indonesian: 0.20%, Lithuanian: 0.20%, Maori: 0.20%, Romanian: 0.20%, Xhosa: 0.20%, Zulu: 0.20%, Latvian: 0.10%, Malay: 0.10%, Slovak: 0.10%, Slovene: 0.10%, Somali: 0.10%, Turkish: 0.10%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 94.10%
Erroneously classified as Dutch: 0.90%, Latin: 0.80%, English: 0.70%, Swedish: 0.60%, Danish: 0.50%, French: 0.40%, Bokmal: 0.30%, Irish: 0.20%, Tagalog: 0.20%, Afrikaans: 0.10%, Esperanto: 0.10%, Estonian: 0.10%, Finnish: 0.10%, Italian: 0.10%, Maori: 0.10%, Nynorsk: 0.10%, Somali: 0.10%, Swahili: 0.10%, Tsonga: 0.10%, Turkish: 0.10%, Welsh: 0.10%, Zulu: 0.10%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.70%
Erroneously classified as Dutch: 0.20%, Latin: 0.10%
go get github.com/pemistahl/lingua-go
تتطلب Lingua على الأقل الإصدار 1.18.
git clone https://github.com/pemistahl/lingua-go.git
cd lingua-go
go build
يرافق رمز المصدر جناح اختبار الوحدة الواسع. لتشغيل الاختبارات ، ببساطة قل:
go test
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
if language , exists := detector . DetectLanguageOf ( "languages are awesome" ); exists {
fmt . Println ( language )
}
// Output: English
}بشكل افتراضي ، تقوم Lingua بإرجاع اللغة الأكثر احتمالًا لنص إدخال معين. ومع ذلك ، هناك بعض الكلمات التي يتم توضيحها في أكثر من لغة واحدة. كلمة Prologue ، على سبيل المثال ، هي كلمة اللغة الإنجليزية والفرنسية صالحة. سوف تنتج Lingua إما اللغة الإنجليزية أو الفرنسية والتي قد تكون خاطئة في السياق المحدد. بالنسبة لحالات كهذه ، من الممكن تحديد المسافة النسبية الدنيا التي يجب أن تلبيها اللوغاريتمية وتلخيص الاحتمالات لكل لغة ممكنة. يمكن ذكره بالطريقة التالية:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
WithMinimumRelativeDistance ( 0.9 ).
Build ()
language , exists := detector . DetectLanguageOf ( "languages are awesome" )
fmt . Println ( language )
fmt . Println ( exists )
// Output:
// Unknown
// false
} انتبه إلى أن المسافة بين احتمالات اللغة تعتمد على طول نص الإدخال. كلما طالت نص الإدخال ، كلما زادت المسافة بين اللغات. لذلك إذا كنت ترغب في تصنيف عبارات نص قصيرة جدًا ، فلا تقم بتعيين الحد الأدنى للمسافة النسبية عالية جدًا. وإلا سيتم إرجاع Unknown معظم الوقت كما في المثال أعلاه. هذه هي قيمة الإرجاع للحالات التي يكون فيها اكتشاف اللغة غير ممكن بشكل موثوق. لا يُقصد من هذه القيمة أن يتم تضمينها في مجموعة لغات الإدخال عند إنشاء كاشف اللغة. إذا قمت بتضمينها ، فسيتم إزالتها تلقائيًا من مجموعة لغات الإدخال.
إن معرفة اللغة الأكثر ترجيحًا أمر رائع ولكن مدى موثوقية الاحتمال المحسوب؟ وما مدى احتمالية احتمال أن تكون اللغات الأخرى التي تم فحصها بالمقارنة مع اللغات الأكثر ترجيحًا؟ يمكن الإجابة على هذه الأسئلة أيضًا:
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
lingua . Spanish ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
confidenceValues := detector . ComputeLanguageConfidenceValues ( "languages are awesome" )
for _ , elem := range confidenceValues {
fmt . Printf ( "%s: %.2f n " , elem . Language (), elem . Value ())
}
// Output:
// English: 0.93
// French: 0.04
// German: 0.02
// Spanish: 0.01
} في المثال أعلاه ، يتم إرجاع شريحة من ConfidenceValue التي تحتوي على جميع اللغات الممكنة المرتبة حسب قيمة الثقة في ترتيب التنازلي. كل قيمة هي احتمال بين 0.0 و 1.0. سيتم تجميع احتمالات جميع اللغات إلى 1.0. إذا تم تحديد اللغة بشكل لا لبس فيه بواسطة محرك القاعدة ، فسيتم دائمًا إرجاع القيمة 1.0 لهذه اللغة. سوف تتلقى اللغات الأخرى قيمة 0.0.
هناك أيضًا طريقة لإرجاع قيمة الثقة للغة المحددة فقط:
confidence := detector . ComputeLanguageConfidence ( "languages are awesome" , lingua . French )
fmt . Printf ( "%.2f" , confidence )
// Output:
// 0.04القيمة التي يحسبها هذه الطريقة هي رقم بين 0.0 و 1.0. إذا تم تحديد اللغة بشكل لا لبس فيه بواسطة محرك القاعدة ، فسيتم دائمًا إرجاع القيمة 1.0. إذا لم يتم دعم اللغة المحددة بواسطة مثيل الكاشف ، فسيتم دائمًا إرجاع القيمة 0.0.
بشكل افتراضي ، تستخدم Lingua التحميل الكسول لتحميل نماذج اللغة فقط عند الطلب والتي تعتبر ذات صلة بمحرك المرشح القائم على القواعد. بالنسبة لخدمات الويب ، على سبيل المثال ، من المفيد أن نتحمل جميع نماذج اللغة في الذاكرة لتجنب الكمون غير المتوقع أثناء انتظار استجابة الخدمة. إذا كنت ترغب في تمكين وضع التحميل المتحمس ، فيمكنك القيام بذلك على هذا النحو:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithPreloadedLanguageModels ().
Build () تشترك مثيلات متعددة من LanguageDetector في نفس نماذج اللغة في الذاكرة التي يتم الوصول إليها بشكل غير متزامن بواسطة الحالات.
تأتي دقة الكشف العالية لـ Lingua على حساب كونها أبطأ بشكل ملحوظ من أجهزة الكشف عن اللغة الأخرى. تستهلك نماذج اللغة الكبيرة أيضًا كميات كبيرة من الذاكرة. قد لا تكون هذه المتطلبات ممكنة للأنظمة التي تنخفض على الموارد. إذا كنت ترغب في تصنيف النصوص الطويلة في الغالب أو الحاجة إلى توفير الموارد ، فيمكنك تمكين وضع دقة منخفض لا يعمل فقط على تحميل مجموعة فرعية صغيرة من نماذج اللغة في الذاكرة:
lingua . NewLanguageDetectorBuilder ().
FromAllLanguages ().
WithLowAccuracyMode ().
Build ()الجانب السلبي لهذا النهج هو أن دقة الكشف للنصوص القصيرة التي تتكون من أقل من 120 حرفًا ستنخفض بشكل كبير. ومع ذلك ، فإن دقة الكشف للنصوص التي تزيد عن 120 حرفًا ستبقى في الغالب غير متأثرة.
في وضع الدقة العالية (الافتراضي) ، يستهلك كاشف اللغة حوالي 1800 ميجابايت من الذاكرة إذا تم تحميل جميع نماذج اللغة. في وضع الدقة المنخفض ، يتم تقليل استهلاك الذاكرة إلى حوالي 110 ميغابايت. الهدف هو زيادة استهلاك الذاكرة في الإصدارات اللاحقة.
يتمثل بديل في البصمة الأصغر للذاكرة والأداء الأسرع في تقليل مجموعة اللغات عند إنشاء كاشف اللغة. في معظم الحالات ، لا ينصح ببناء الكاشف من جميع اللغات المدعومة. عندما تكون لديك معرفة بالنصوص التي تريد تصنيفها ، يمكنك دائمًا استبعاد بعض اللغات على أنها مستحيلة أو من غير المرجح أن تحدث.
على عكس معظم أجهزة الكشف عن اللغة الأخرى ، فإن Lingua قادرة على اكتشاف لغات متعددة في النصوص المختلطة. يمكن أن تسفر هذه الميزة عن نتائج معقولة جدًا ولكنها لا تزال في حالة تجريبية ، وبالتالي فإن نتيجة الكشف تعتمد بشكل كبير على نص الإدخال. إنه يعمل بشكل أفضل في وضع الدقة العالية مع كلمات طويلة متعددة لكل لغة. كلما كانت العبارات وأجملها أقصر ، كانت النتائج أقل دقة. يمكن أن يؤدي تقليل مجموعة اللغات عند إنشاء كاشف اللغة أيضًا إلى تحسين دقة هذه المهمة إذا كانت اللغات التي تحدث في النص تساوي اللغات التي تدعمها مثيل كاشف اللغة المعني.
package main
import (
"fmt"
"github.com/pemistahl/lingua-go"
)
func main () {
languages := []lingua. Language {
lingua . English ,
lingua . French ,
lingua . German ,
}
detector := lingua . NewLanguageDetectorBuilder ().
FromLanguages ( languages ... ).
Build ()
sentence := "Parlez-vous français? " +
"Ich spreche Französisch nur ein bisschen. " +
"A little bit is better than nothing."
for _ , result := range detector . DetectMultipleLanguagesOf ( sentence ) {
fmt . Printf ( "%s: '%s' n " , result . Language (), sentence [ result . StartIndex (): result . EndIndex ()])
}
// Output:
// French: 'Parlez-vous français? '
// German: 'Ich spreche Französisch nur ein bisschen. '
// English: 'A little bit is better than nothing.'
} في المثال أعلاه ، يتم إرجاع شريحة من DetectionResult . يصف كل إدخال في الشريحة قسم نص واحد متناثر ، يوفر مؤشرات بدء ونهاية للفرعية المعنية.
قد تكون هناك مهام تصنيف حيث تعرف مسبقًا أن بيانات لغتك ليست بالتأكيد مكتوبة باللغة اللاتينية ، على سبيل المثال. يمكن أن تصبح دقة الكشف أفضل في مثل هذه الحالات إذا استبعدت بعض اللغات من عملية اتخاذ القرار أو تضمين اللغات ذات الصلة بشكل صريح:
// Include all languages available in the library.
lingua . NewLanguageDetectorBuilder (). FromAllLanguages ()
// Include only languages that are not yet extinct (= currently excludes Latin).
lingua . NewLanguageDetectorBuilder (). FromAllSpokenLanguages ()
// Include only languages written with Cyrillic script.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithCyrillicScript ()
// Exclude only the Spanish language from the decision algorithm.
lingua . NewLanguageDetectorBuilder (). FromAllLanguagesWithout ( lingua . Spanish )
// Only decide between English and German.
lingua . NewLanguageDetectorBuilder (). FromLanguages ( lingua . English , lingua . German )
// Select languages by ISO 639-1 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_1 ( lingua . EN , lingua . DE )
// Select languages by ISO 639-3 code.
lingua . NewLanguageDetectorBuilder (). FromIsoCodes639_3 ( lingua . ENG , lingua . DEU )ألق نظرة على القضايا المخطط لها.
أي مساهمات في اللغات موضع تقدير كبير. يرجى قراءة التعليمات في CONTRIBUTING.md .