مهمتها بسيطة: إنها تخبرك باللغة التي يتم فيها كتابة بعض البيانات النصية. وهذا مفيد للغاية كخطوة للمعالجة المسبقة للبيانات اللغوية في تطبيقات معالجة اللغة الطبيعية مثل تصنيف النص والتحقق الإملائي. قد تتضمن حالات الاستخدام الأخرى ، على سبيل المثال ، توجيه رسائل البريد الإلكتروني إلى قسم خدمة العملاء في موقع جغرافي ، استنادًا إلى لغات رسائل البريد الإلكتروني.
غالبًا ما يتم اكتشاف اللغة كجزء من أطر التعلم الآلي الكبيرة أو تطبيقات معالجة اللغة الطبيعية. في الحالات التي لا تحتاج فيها إلى الوظائف الكاملة لتلك الأنظمة أو لا ترغب في تعلم حبالها ، تأتي مكتبة مرنة صغيرة في متناول يدي.
حتى الآن ، هناك ثلاث مكتبات شاملة مفتوحة المصادر التي تعمل على JVM لهذه المهمة هي Apache Tika و Apache OpenNLP وكاشف اللغة Optimaize. لسوء الحظ ، لا سيما أن الأخير لديه ثلاثة عيوب رئيسية:
Lingua تهدف إلى القضاء على هذه المشاكل. لا يحتاج إلى أي تكوين تقريبًا ويؤدي إلى نتائج دقيقة جدًا على كل من النص الطويل والقصير ، حتى على الكلمات والعبارات المفردة. إنه يعتمد على كل من الأساليب القائمة على القواعد والإحصائية ولكنه لا يستخدم أي قواميس للكلمات. لا يحتاج إلى اتصال بأي واجهة برمجة تطبيقات خارجية أو خدمة أيضًا. بمجرد تنزيل المكتبة ، يمكن استخدامها في وضع عدم الاتصال تمامًا.
مقارنةً بمكتبات الكشف عن اللغة الأخرى ، فإن تركيز Lingua على الجودة على الكمية ، أي الحصول على الكشف بشكل صحيح لمجموعة صغيرة من اللغات أولاً قبل إضافة لغات جديدة. حاليًا ، يتم دعم الـ 75 لغة التالية:
Lingua قادرة على الإبلاغ عن إحصائيات الدقة لبعض بيانات الاختبار المجمعة المتاحة لكل لغة مدعومة. يتم تقسيم بيانات الاختبار لكل لغة إلى ثلاثة أجزاء:
تم إنشاء كل من نماذج اللغة وبيانات الاختبار من وثائق منفصلة لشركة Wortschatz التي تقدمها جامعة لايبزيغ ، ألمانيا. تم استخدام البيانات التي تم زحفها من مواقع الأخبار المختلفة للتدريب ، حيث تضم كل مجموعة مليون جملة. للاختبار ، تم استخدام Corpora المصنوع من مواقع الويب التي تم اختيارها بشكل تعسفي ، ويضم كل منها عشرة آلاف من الجمل. من كل مجموعة اختبار ، تم استخراج مجموعة فرعية عشوائية غير مصنفة من 1000 كلمة واحدة ، 1000 زوج من كلمة و 1000 جملة ، على التوالي.
نظرًا لبيانات الاختبار التي تم إنشاؤها ، قارنت نتائج اكتشاف Lingua و Apache Tika و Apache OpenNLP وكاشف اللغة الممنوحة باستخدام اختبارات Junit المعلمة التي تعمل على بيانات 75 لغة مدعومة باللغة . يتم تجاهل اللغات التي لا تدعمها المكتبات الأخرى ببساطة لأولئك أثناء عملية الكشف.
يحتوي كل من الأقسام التالية على قطعتين. تُظهر مؤامرة الشريط نتائج الدقة التفصيلية لكل لغة مدعومة. توضح مؤامرة المربع توزيعات قيم الدقة لكل مصنف. تمثل الصناديق نفسها المناطق التي تقع فيها 50 ٪ من البيانات في منتصفها. داخل الصناديق الملونة ، تمثل الخطوط الأفقية الوسيطة في التوزيعات.
يوضح الجدول أدناه إحصائيات مفصلة لكل لغة ومصنف بما في ذلك الانحراف المتوسط والمتوسط والمعياري.
| لغة | متوسط | كلمات واحدة | أزواج الكلمات | جمل | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | تيكا | OpenNLP | Optimaize | لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | تيكا | OpenNLP | Optimaize | لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | تيكا | OpenNLP | Optimaize | لغة (وضع الدقة العالية) | لغة (وضع الدقة المنخفض) | تيكا | OpenNLP | Optimaize | |
| أفريكانيين | 79 | 64 | 71 | 72 | 39 | 58 | 38 | 44 | 41 | 3 | 81 | 62 | 70 | 75 | 22 | 97 | 93 | 98 | 99 | 93 |
| الألبانية | 88 | 80 | 79 | 71 | 70 | 69 | 54 | 54 | 40 | 38 | 95 | 86 | 84 | 73 | 73 | 100 | 99 | 99 | 100 | 98 |
| عربي | 98 | 94 | 97 | 84 | 89 | 96 | 88 | 94 | 65 | 72 | 99 | 96 | 99 | 88 | 94 | 100 | 99 | 100 | 99 | 100 |
| أرمني | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - |
| أذربيجاني | 90 | 82 | - | 82 | - | 77 | 71 | - | 60 | - | 92 | 78 | - | 86 | - | 99 | 96 | - | 99 | - |
| الباسك | 84 | 74 | 83 | 77 | 66 | 71 | 56 | 64 | 56 | 33 | 87 | 76 | 86 | 82 | 70 | 93 | 91 | 98 | 92 | 95 |
| البيلاروسي | 97 | 92 | 96 | 91 | 87 | 92 | 80 | 92 | 78 | 69 | 99 | 95 | 98 | 95 | 92 | 100 | 100 | 100 | 100 | 99 |
| البنغالية | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| بوكمال | 58 | 49 | - | 66 | - | 39 | 27 | - | 42 | - | 59 | 47 | - | 69 | - | 75 | 74 | - | 87 | - |
| البوسني | 35 | 29 | - | 26 | - | 29 | 23 | - | 12 | - | 35 | 29 | - | 22 | - | 40 | 36 | - | 44 | - |
| البلغارية | 87 | 78 | 73 | 83 | 48 | 70 | 56 | 52 | 62 | 18 | 91 | 81 | 69 | 87 | 36 | 99 | 96 | 96 | 100 | 91 |
| كاتالونية | 70 | 58 | 58 | 42 | 31 | 51 | 33 | 32 | 11 | 2 | 74 | 60 | 57 | 32 | 16 | 86 | 81 | 84 | 81 | 77 |
| الصينية | 100 | 100 | 69 | 78 | 31 | 100 | 100 | 20 | 40 | 0 | 100 | 100 | 86 | 94 | 2 | 100 | 100 | 100 | 100 | 91 |
| الكرواتية | 72 | 60 | 74 | 50 | 41 | 53 | 36 | 54 | 23 | 8 | 74 | 57 | 72 | 44 | 24 | 90 | 85 | 97 | 81 | 91 |
| التشيكية | 80 | 71 | 72 | 67 | 49 | 66 | 54 | 54 | 42 | 21 | 84 | 72 | 75 | 70 | 46 | 91 | 87 | 88 | 90 | 81 |
| دانماركي | 81 | 70 | 83 | 60 | 55 | 61 | 45 | 63 | 34 | 19 | 84 | 70 | 86 | 52 | 51 | 98 | 95 | 99 | 94 | 96 |
| هولندي | 77 | 64 | 60 | 61 | 39 | 55 | 36 | 31 | 31 | 6 | 81 | 61 | 52 | 57 | 19 | 96 | 94 | 98 | 97 | 91 |
| إنجليزي | 81 | 62 | 64 | 52 | 41 | 55 | 29 | 30 | 10 | 2 | 89 | 62 | 62 | 46 | 23 | 99 | 96 | 99 | 99 | 97 |
| إسبرانتو | 84 | 66 | - | 76 | - | 67 | 44 | - | 50 | - | 85 | 61 | - | 78 | - | 98 | 92 | - | 100 | - |
| الإستونية | 92 | 83 | 84 | 59 | 61 | 80 | 62 | 66 | 29 | 23 | 96 | 88 | 88 | 60 | 63 | 100 | 99 | 100 | 88 | 98 |
| الفنلندية | 96 | 91 | 94 | 86 | 79 | 90 | 77 | 86 | 68 | 51 | 98 | 95 | 96 | 91 | 86 | 100 | 100 | 100 | 100 | 100 |
| فرنسي | 89 | 77 | 78 | 59 | 54 | 74 | 52 | 55 | 25 | 18 | 94 | 83 | 80 | 55 | 48 | 99 | 97 | 99 | 98 | 97 |
| غاندا | 91 | 84 | - | - | - | 79 | 65 | - | - | - | 95 | 87 | - | - | - | 100 | 100 | - | - | - |
| الجورجي | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - | 100 | 100 | - | 100 | - |
| الألمانية | 89 | 80 | 74 | 67 | 55 | 74 | 57 | 50 | 38 | 21 | 94 | 84 | 71 | 66 | 46 | 100 | 99 | 100 | 98 | 99 |
| اليونانية | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| غوجاراتية | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| العبرية | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| الهندية | 73 | 33 | 80 | 58 | 51 | 61 | 11 | 65 | 28 | 16 | 64 | 20 | 75 | 49 | 38 | 93 | 67 | 99 | 99 | 98 |
| المجري | 95 | 90 | 88 | 78 | 77 | 87 | 77 | 75 | 53 | 51 | 98 | 94 | 91 | 82 | 82 | 100 | 100 | 100 | 100 | 99 |
| الأيسلندية | 93 | 88 | 90 | 76 | 78 | 83 | 72 | 76 | 53 | 53 | 97 | 92 | 94 | 76 | 82 | 100 | 99 | 100 | 99 | 99 |
| إندونيسي | 60 | 48 | 60 | 29 | 18 | 39 | 25 | 37 | 10 | 0 | 61 | 46 | 62 | 25 | 1 | 81 | 72 | 82 | 52 | 54 |
| الأيرلندية | 91 | 85 | 90 | 78 | 80 | 82 | 70 | 80 | 56 | 58 | 94 | 90 | 92 | 82 | 85 | 96 | 95 | 99 | 97 | 98 |
| إيطالي | 87 | 71 | 80 | 64 | 51 | 69 | 42 | 58 | 31 | 12 | 92 | 74 | 84 | 61 | 43 | 100 | 98 | 99 | 100 | 98 |
| اليابانية | 100 | 100 | 25 | 95 | 98 | 100 | 100 | 1 | 87 | 99 | 100 | 100 | 5 | 100 | 100 | 100 | 100 | 68 | 100 | 96 |
| كازاخاخية | 92 | 90 | - | 85 | - | 80 | 78 | - | 66 | - | 96 | 93 | - | 90 | - | 99 | 99 | - | 100 | - |
| كوري | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| اللاتينية | 87 | 73 | - | 70 | - | 72 | 49 | - | 43 | - | 93 | 76 | - | 71 | - | 97 | 93 | - | 96 | - |
| لاتفيا | 93 | 87 | 90 | 86 | 78 | 85 | 75 | 78 | 72 | 56 | 97 | 90 | 93 | 88 | 82 | 99 | 97 | 98 | 98 | 97 |
| الليتواني | 95 | 87 | 89 | 79 | 72 | 86 | 76 | 74 | 56 | 40 | 98 | 89 | 92 | 83 | 77 | 100 | 98 | 99 | 99 | 98 |
| مقدوني | 84 | 72 | 83 | 68 | 46 | 66 | 52 | 66 | 37 | 10 | 86 | 70 | 83 | 68 | 32 | 99 | 95 | 100 | 98 | 97 |
| الملايو | 31 | 31 | 23 | 19 | 4 | 26 | 22 | 19 | 10 | 0 | 38 | 36 | 22 | 20 | 0 | 30 | 36 | 28 | 27 | 11 |
| الماوري | 92 | 83 | - | 92 | - | 84 | 64 | - | 85 | - | 92 | 88 | - | 90 | - | 99 | 98 | - | 100 | - |
| المهاراتية | 85 | 41 | 90 | 81 | 71 | 74 | 20 | 81 | 62 | 43 | 85 | 30 | 92 | 83 | 74 | 96 | 72 | 98 | 98 | 96 |
| المنغولي | 97 | 96 | - | 84 | - | 93 | 89 | - | 66 | - | 99 | 98 | - | 88 | - | 99 | 99 | - | 99 | - |
| نينورسك | 66 | 52 | - | 55 | - | 41 | 25 | - | 24 | - | 66 | 49 | - | 47 | - | 90 | 81 | - | 92 | - |
| فارسي | 90 | 80 | 81 | 75 | 62 | 78 | 62 | 65 | 53 | 29 | 94 | 80 | 79 | 74 | 58 | 100 | 98 | 99 | 99 | 99 |
| بولندي | 95 | 90 | 90 | 83 | 81 | 85 | 77 | 76 | 61 | 57 | 98 | 93 | 93 | 89 | 86 | 100 | 99 | 100 | 100 | 100 |
| البرتغالية | 81 | 69 | 63 | 58 | 40 | 59 | 42 | 34 | 22 | 7 | 85 | 70 | 58 | 54 | 19 | 98 | 95 | 98 | 98 | 94 |
| البنجابية | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| روماني | 87 | 72 | 78 | 67 | 55 | 69 | 49 | 57 | 34 | 24 | 92 | 74 | 80 | 68 | 50 | 99 | 94 | 97 | 99 | 91 |
| الروسية | 90 | 78 | 80 | 50 | 53 | 76 | 59 | 62 | 20 | 22 | 95 | 84 | 85 | 43 | 50 | 98 | 92 | 94 | 86 | 87 |
| الصربي | 88 | 78 | 73 | 73 | 46 | 74 | 62 | 57 | 46 | 18 | 90 | 80 | 70 | 74 | 39 | 99 | 91 | 90 | 98 | 80 |
| شونا | 91 | 81 | - | - | - | 78 | 56 | - | - | - | 96 | 86 | - | - | - | 100 | 100 | - | - | - |
| سلوفاك | 84 | 75 | 76 | 70 | 47 | 64 | 49 | 53 | 39 | 12 | 90 | 78 | 76 | 73 | 38 | 99 | 97 | 98 | 99 | 92 |
| سلوفيني | 82 | 67 | 74 | 71 | 37 | 61 | 39 | 53 | 43 | 3 | 87 | 68 | 72 | 72 | 18 | 99 | 93 | 98 | 99 | 90 |
| صومالي | 92 | 85 | 91 | 69 | 79 | 82 | 64 | 78 | 35 | 50 | 96 | 90 | 94 | 74 | 88 | 100 | 100 | 100 | 98 | 100 |
| سوثو | 85 | 72 | - | - | - | 67 | 43 | - | - | - | 90 | 75 | - | - | - | 99 | 97 | - | - | - |
| الأسبانية | 70 | 56 | 59 | 42 | 32 | 44 | 26 | 29 | 8 | 0 | 69 | 49 | 50 | 25 | 6 | 97 | 94 | 97 | 93 | 91 |
| السواحيلية | 81 | 70 | 75 | 73 | 60 | 60 | 43 | 50 | 45 | 26 | 84 | 68 | 75 | 74 | 58 | 98 | 97 | 99 | 99 | 98 |
| السويدية | 84 | 72 | 71 | 69 | 50 | 64 | 46 | 44 | 41 | 15 | 88 | 76 | 72 | 69 | 42 | 99 | 95 | 97 | 97 | 94 |
| التاغالوغ | 78 | 66 | 77 | 61 | 61 | 52 | 36 | 53 | 27 | 23 | 83 | 67 | 79 | 57 | 62 | 99 | 96 | 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 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 |
| التايلاندية | 99 | 99 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 100 | 98 | 98 | 100 | 99 | 100 |
| تسونجا | 84 | 72 | - | - | - | 66 | 46 | - | - | - | 89 | 73 | - | - | - | 98 | 97 | - | - | - |
| Tswana | 84 | 71 | - | - | - | 65 | 44 | - | - | - | 88 | 73 | - | - | - | 99 | 96 | - | - | - |
| التركية | 94 | 87 | 81 | 72 | 70 | 84 | 71 | 62 | 48 | 43 | 98 | 91 | 83 | 71 | 70 | 100 | 99 | 99 | 98 | 96 |
| الأوكرانية | 92 | 86 | 81 | 79 | 68 | 84 | 75 | 62 | 54 | 39 | 97 | 92 | 84 | 83 | 69 | 95 | 93 | 97 | 99 | 94 |
| الأردية | 91 | 80 | 83 | 68 | 72 | 80 | 65 | 68 | 45 | 49 | 94 | 78 | 84 | 62 | 71 | 98 | 96 | 96 | 98 | 96 |
| الفيتنامي | 91 | 87 | 85 | 84 | 87 | 79 | 76 | 63 | 66 | 65 | 94 | 87 | 92 | 86 | 95 | 99 | 98 | 100 | 100 | 100 |
| الويلزية | 91 | 82 | 85 | 77 | 77 | 78 | 61 | 68 | 50 | 50 | 96 | 87 | 88 | 81 | 82 | 99 | 99 | 100 | 99 | 99 |
| Xhosa | 82 | 69 | - | - | - | 64 | 45 | - | - | - | 85 | 67 | - | - | - | 98 | 94 | - | - | - |
| يوروبا | 75 | 62 | - | - | - | 50 | 33 | - | - | - | 77 | 61 | - | - | - | 97 | 93 | - | - | - |
| زولو | 81 | 70 | - | 78 | - | 62 | 45 | - | 51 | - | 83 | 72 | - | 82 | - | 97 | 94 | - | 100 | - |
| يقصد | 86 | 77 | 80 | 74 | 65 | 74 | 61 | 64 | 53 | 41 | 89 | 78 | 81 | 74 | 61 | 96 | 93 | 96 | 95 | 93 |
| متوسط | 89.23 | 79.63 | 81.3 | 75.55 | 63.85 | 74.3 | 56.7 | 63.39 | 48.7 | 30.75 | 93.7 | 80.6 | 84.25 | 75.55 | 65.95 | 99.0 | 96.9 | 99.15 | 99.0 | 97.4 |
| الانحراف المعياري | 13.12 | 17.26 | 16.2 | 18.56 | 23.87 | 18.43 | 24.81 | 23.9 | 27.37 | 33.87 | 13.13 | 18.96 | 18.74 | 21.32 | 31.32 | 11.02 | 11.86 | 10.77 | 12.59 | 13.54 |
يستخدم كل كاشف لغة نموذج N-Gram الاحتمالي المدرب على توزيع الأحرف في بعض مجموعة التدريب. تستخدم معظم المكتبات فقط n-grams من الحجم 3 (trigrams) والتي تعد مرضية لاكتشاف لغة شظايا النص الأطول التي تتكون من جمل متعددة. بالنسبة للعبارات القصيرة أو الكلمات الفردية ، ومع ذلك ، فإن trigrams ليست كافية. كلما كان نص الإدخال أقصر ، تتوفر أقل من n-grams. الاحتمالات المقدرة من مثل هذه n-grams غير موثوقة. هذا هو السبب في أن Lingua تستخدم n-grams من الأحجام 1 حتى 5 مما يؤدي إلى تنبؤ أكثر دقة للغة الصحيحة.
الاختلاف المهم الثاني هو أن Lingua لا تستخدم هذا النموذج الإحصائي فحسب ، بل يستخدم أيضًا محركًا قائمًا على القواعد. يحدد هذا المحرك أولاً الأبجدية لنص الإدخال ويبحث عن الأحرف الفريدة من نوعها بلغة واحدة أو أكثر. إذا كان من الممكن اختيار لغة واحدة بشكل موثوق بهذه الطريقة ، فإن النموذج الإحصائي لم يعد ضروريًا بعد الآن. في أي حال ، يقوم المحرك القائم على القواعد بتصفية اللغات التي لا تلبي شروط نص الإدخال. عندها فقط ، في خطوة ثانية ، يتم أخذ نموذج N-Gram الاحتمالي في الاعتبار. هذا أمر منطقي لأن تحميل نماذج اللغة أقل يعني استهلاكًا للذاكرة وأداء وقت تشغيل أفضل.
بشكل عام ، من الجيد دائمًا تقييد مجموعة اللغات التي يجب مراعاتها في عملية التصنيف باستخدام أساليب API المعنية. إذا كنت تعرف مسبقًا أن بعض اللغات لن تحدث أبدًا في نص الإدخال ، فلا تدع هؤلاء المشاركين في عملية التصنيف. ومع ذلك ، فإن آلية التصفية للمحرك القائم على القواعد جيدة جدًا ، فإن التصفية بناءً على معرفتك الخاصة بنص الإدخال هو الأفضل دائمًا.
إذا كنت ترغب في إعادة إنتاج نتائج الدقة أعلاه ، فيمكنك إنشاء تقارير الاختبار بنفسك لجميع المصنفات الأربعة وجميع اللغات عن طريق القيام:
./gradlew accuracyReport
يمكنك أيضًا تقييد المصنفات واللغات لإنشاء تقارير من خلال نقل الحجج إلى مهمة Gradle. تولد المهمة التالية تقارير لـ Lingua واللغات الإنجليزية والألمانية فقط:
./gradlew accuracyReport -Pdetectors=Lingua -Planguages=English,German
بشكل افتراضي ، يتم استخدام جوهر وحدة المعالجة المركزية فقط لتوليد التقارير. إذا كان لديك وحدة المعالجة المركزية متعددة النواة في جهازك ، فيمكنك أن تتفوق على العديد من العمليات التي لديك نوى وحدة المعالجة المركزية. هذا يسرع التقارير توليد بشكل كبير. ومع ذلك ، كن على دراية بأن Forking أكثر من عملية يمكن أن تستهلك الكثير من ذاكرة الوصول العشوائي. أنت تفعل ذلك مثل هذا:
./gradlew accuracyReport -PcpuCores=2
لكل كاشف ولغة ، يتم بعد ذلك كتابة ملف تقرير الاختبار في /accuracy-reports ، يمكن العثور عليها بجانب دليل src . على سبيل المثال ، إليك الإخراج الحالي للتقرير الألماني اللغوي :
##### GERMAN #####
Legend: 'low accuracy mode | high accuracy mode'
>>> Accuracy on average: 79.80% | 89.23%
>> Detection of 1000 single words (average length: 9 chars)
Accuracy: 56.70% | 73.90%
Erroneously classified as DUTCH: 2.80% | 2.30%, DANISH: 2.20% | 2.10%, ENGLISH: 1.90% | 2.00%, LATIN: 1.90% | 1.90%, BOKMAL: 2.40% | 1.60%, BASQUE: 1.60% | 1.20%, ITALIAN: 1.00% | 1.20%, FRENCH: 1.60% | 1.20%, ESPERANTO: 1.10% | 1.10%, SWEDISH: 3.20% | 1.00%, AFRIKAANS: 1.30% | 0.80%, TSONGA: 1.50% | 0.70%, NYNORSK: 1.40% | 0.60%, PORTUGUESE: 0.50% | 0.60%, YORUBA: 0.40% | 0.60%, SOTHO: 0.70% | 0.50%, FINNISH: 0.80% | 0.50%, WELSH: 1.30% | 0.50%, SPANISH: 1.20% | 0.40%, SWAHILI: 0.60% | 0.40%, TSWANA: 2.20% | 0.40%, POLISH: 0.70% | 0.40%, ESTONIAN: 0.90% | 0.40%, IRISH: 0.50% | 0.40%, TAGALOG: 0.10% | 0.30%, ICELANDIC: 0.30% | 0.30%, BOSNIAN: 0.10% | 0.30%, LITHUANIAN: 0.80% | 0.20%, MAORI: 0.50% | 0.20%, INDONESIAN: 0.40% | 0.20%, ALBANIAN: 0.60% | 0.20%, CATALAN: 0.70% | 0.20%, ZULU: 0.30% | 0.20%, ROMANIAN: 1.20% | 0.20%, CROATIAN: 0.10% | 0.20%, XHOSA: 0.40% | 0.20%, TURKISH: 0.70% | 0.10%, MALAY: 0.50% | 0.10%, LATVIAN: 0.40% | 0.10%, SLOVENE: 0.00% | 0.10%, SLOVAK: 0.30% | 0.10%, SOMALI: 0.00% | 0.10%, HUNGARIAN: 0.40% | 0.00%, SHONA: 0.80% | 0.00%, VIETNAMESE: 0.40% | 0.00%, CZECH: 0.30% | 0.00%, GANDA: 0.20% | 0.00%, AZERBAIJANI: 0.10% | 0.00%
>> Detection of 1000 word pairs (average length: 18 chars)
Accuracy: 83.50% | 94.10%
Erroneously classified as DUTCH: 1.50% | 0.90%, LATIN: 1.00% | 0.80%, ENGLISH: 1.40% | 0.70%, SWEDISH: 1.40% | 0.60%, DANISH: 1.20% | 0.50%, FRENCH: 0.60% | 0.40%, BOKMAL: 1.40% | 0.30%, TAGALOG: 0.10% | 0.20%, IRISH: 0.20% | 0.20%, TURKISH: 0.10% | 0.10%, NYNORSK: 0.90% | 0.10%, TSONGA: 0.40% | 0.10%, ZULU: 0.10% | 0.10%, ESPERANTO: 0.30% | 0.10%, AFRIKAANS: 0.60% | 0.10%, ITALIAN: 0.10% | 0.10%, ESTONIAN: 0.30% | 0.10%, FINNISH: 0.40% | 0.10%, SOMALI: 0.00% | 0.10%, SWAHILI: 0.20% | 0.10%, MAORI: 0.00% | 0.10%, WELSH: 0.10% | 0.10%, LITHUANIAN: 0.40% | 0.00%, INDONESIAN: 0.10% | 0.00%, CATALAN: 0.30% | 0.00%, LATVIAN: 0.20% | 0.00%, XHOSA: 0.30% | 0.00%, SPANISH: 0.50% | 0.00%, MALAY: 0.10% | 0.00%, SLOVAK: 0.10% | 0.00%, BASQUE: 0.40% | 0.00%, YORUBA: 0.20% | 0.00%, TSWANA: 0.30% | 0.00%, SHONA: 0.10% | 0.00%, PORTUGUESE: 0.10% | 0.00%, SOTHO: 0.30% | 0.00%, CZECH: 0.10% | 0.00%, ALBANIAN: 0.40% | 0.00%, AZERBAIJANI: 0.10% | 0.00%, ICELANDIC: 0.10% | 0.00%, SLOVENE: 0.10% | 0.00%
>> Detection of 1000 sentences (average length: 111 chars)
Accuracy: 99.20% | 99.70%
Erroneously classified as DUTCH: 0.00% | 0.20%, LATIN: 0.20% | 0.10%, NYNORSK: 0.10% | 0.00%, SPANISH: 0.10% | 0.00%, DANISH: 0.10% | 0.00%, SOTHO: 0.20% | 0.00%, ZULU: 0.10% | 0.00%
يتم استضافة Lingua على حزم GitHub و Maven Central.
// Groovy syntax
implementation 'com.github.pemistahl:lingua:1.2.2'
// Kotlin syntax
implementation("com.github.pemistahl:lingua:1.2.2")
<dependency>
<groupId>com.github.pemistahl</groupId>
<artifactId>lingua</artifactId>
<version>1.2.2</version>
</dependency>
تستخدم Lingua Gradle للبناء وتتطلب Java> = 1.8 لذلك.
git clone https://github.com/pemistahl/lingua.git
cd lingua
./gradlew build
يمكن إنشاء عدة أرشيفات جرة من المشروع.
./gradlew jar lingua-1.2.2.jar./gradlew sourcesJar lingua-1.2.2-sources.jar./gradlew jarWithDependencies lingua-1.2.2-with-dependencies.jar يمكن تضمين ملف الجرة هذا في المشاريع دون أنظمة إدارة التبعية. يمكن استخدامه أيضًا لتشغيل Lingua في الوضع المستقل (انظر أدناه). يمكن استخدام Lingua برمجيًا في الكود الخاص بك أو في الوضع المستقل.
واجهة برمجة تطبيقات واضحة ومباشرة ويمكن استخدامها في كل من كود كوتلين وجافا.
/* Kotlin */
import com.github.pemistahl.lingua.api.*
import com.github.pemistahl.lingua.api.Language.*
val detector : LanguageDetector = LanguageDetectorBuilder .fromLanguages( ENGLISH , FRENCH , GERMAN , SPANISH ).build()
val detectedLanguage : Language = detector.detectLanguageOf(text = " languages are awesome " ) لا تعود واجهة null تطبيقات Lingua العامة أبدًا إلى مكان ما ، لذلك من الآمن استخدامها من داخل كود Java أيضًا.
/* Java */
import com . github . pemistahl . lingua . api .*;
import static com . github . pemistahl . lingua . api . Language .*;
final LanguageDetector detector = LanguageDetectorBuilder . fromLanguages ( ENGLISH , FRENCH , GERMAN , SPANISH ). build ();
final Language detectedLanguage = detector . detectLanguageOf ( "languages are awesome" );بشكل افتراضي ، تقوم Lingua بإرجاع اللغة الأكثر احتمالًا لنص إدخال معين. ومع ذلك ، هناك بعض الكلمات التي يتم توضيحها في أكثر من لغة واحدة. كلمة Prologue ، على سبيل المثال ، هي كلمة اللغة الإنجليزية والفرنسية صالحة. سوف تنتج Lingua إما اللغة الإنجليزية أو الفرنسية والتي قد تكون خاطئة في السياق المحدد. بالنسبة لحالات كهذه ، من الممكن تحديد المسافة النسبية الدنيا التي يجب أن تلبيها اللوغاريتمية وتلخيص الاحتمالات لكل لغة ممكنة. يمكن ذكره بالطريقة التالية:
val detector = LanguageDetectorBuilder
.fromAllLanguages()
.withMinimumRelativeDistance( 0.25 ) // minimum: 0.00 maximum: 0.99 default: 0.00
.build() انتبه إلى أن المسافة بين احتمالات اللغة تعتمد على طول نص الإدخال. كلما طالت نص الإدخال ، كلما زادت المسافة بين اللغات. لذلك إذا كنت ترغب في تصنيف عبارات نص قصيرة جدًا ، فلا تقم بتعيين الحد الأدنى للمسافة النسبية عالية جدًا. وإلا فإنك ستحصل على معظم النتائج التي يتم إرجاعها Language.UNKNOWN وهي قيمة الإرجاع للحالات التي يكون فيها اكتشاف اللغة غير ممكن بشكل موثوق.
إن معرفة اللغة الأكثر ترجيحًا أمر رائع ولكن مدى موثوقية الاحتمال المحسوب؟ وما مدى احتمالية احتمال أن تكون اللغات الأخرى التي تم فحصها بالمقارنة مع اللغات الأكثر ترجيحًا؟ يمكن الإجابة على هذه الأسئلة أيضًا:
val detector = LanguageDetectorBuilder .fromLanguages( GERMAN , ENGLISH , FRENCH , SPANISH ).build()
val confidenceValues = detector.computeLanguageConfidenceValues(text = " Coding is fun. " )
// {
// ENGLISH=1.0,
// GERMAN=0.8665738136456169,
// FRENCH=0.8249537317466078,
// SPANISH=0.7792362923625288
// }في المثال أعلاه ، يتم إرجاع خريطة لجميع اللغات الممكنة ، مرتبة حسب قيمة الثقة في ترتيب تنازلي. القيم التي يحسبها الكاشف هي جزء من مقياس الثقة النسبي ، وليس من المطلق. كل قيمة هي رقم بين 0.0 و 1.0. يتم إرجاع اللغة الأكثر ترجيحًا دائمًا مع القيمة 1.0. جميع اللغات الأخرى تحصل على قيم مخصصة أقل من 1.0 ، مما يدل على أقل احتمال أن تكون هذه اللغات مقارنة باللغة الأكثر احتمالا.
لا تحتوي الخريطة التي تم إرجاعها على هذه الطريقة بالضرورة على جميع اللغات التي تم تصميم مثيل الاتصال لـ LanguageDetector . إذا قرر المحرك القائم على القواعد أن لغة معينة مستحيلة حقًا ، فلن تكون جزءًا من الخريطة التي تم إرجاعها. وبالمثل ، إذا لم يتم العثور على احتمالات NGRAM داخل لغات الكاشف لنص الإدخال المحدد ، فستكون الخريطة التي تم إرجاعها فارغة. من المفترض أن تكون قيمة الثقة لكل لغة جزءًا من الخريطة التي تم إرجاعها 0.0.
بشكل افتراضي ، تستخدم Lingua التحميل الكسول لتحميل نماذج اللغة فقط عند الطلب والتي تعتبر ذات صلة بمحرك المرشح القائم على القواعد. بالنسبة لخدمات الويب ، على سبيل المثال ، من المفيد أن نتحمل جميع نماذج اللغة في الذاكرة لتجنب الكمون غير المتوقع أثناء انتظار استجابة الخدمة. إذا كنت ترغب في تمكين وضع التحميل المتحمس ، فيمكنك القيام بذلك على هذا النحو:
LanguageDetectorBuilder .fromAllLanguages().withPreloadedLanguageModels().build() تشترك مثيلات متعددة من LanguageDetector في نفس نماذج اللغة في الذاكرة التي يتم الوصول إليها بشكل غير متزامن بواسطة الحالات.
تأتي دقة الكشف العالية لـ Lingua على حساب كونها أبطأ بشكل ملحوظ من أجهزة الكشف عن اللغة الأخرى. تستهلك نماذج اللغة الكبيرة أيضًا كميات كبيرة من الذاكرة. قد لا تكون هذه المتطلبات ممكنة للأنظمة التي تنخفض على الموارد. إذا كنت ترغب في تصنيف النصوص الطويلة في الغالب أو الحاجة إلى توفير الموارد ، فيمكنك تمكين وضع دقة منخفض لا يعمل فقط على تحميل مجموعة فرعية صغيرة من نماذج اللغة في الذاكرة:
LanguageDetectorBuilder .fromAllLanguages().withLowAccuracyMode().build()الجانب السلبي لهذا النهج هو أن دقة الكشف للنصوص القصيرة التي تتكون من أقل من 120 حرفًا ستنخفض بشكل كبير. ومع ذلك ، فإن دقة الكشف للنصوص التي تزيد عن 120 حرفًا ستبقى في الغالب غير متأثرة.
يتمثل بديل في البصمة الأصغر للذاكرة والأداء الأسرع في تقليل مجموعة اللغات عند إنشاء كاشف اللغة. في معظم الحالات ، لا ينصح ببناء الكاشف من جميع اللغات المدعومة. عندما تكون لديك معرفة بالنصوص التي تريد تصنيفها ، يمكنك دائمًا استبعاد بعض اللغات على أنها مستحيلة أو من غير المرجح أن تحدث.
قد تكون هناك مهام تصنيف حيث تعرف مسبقًا أن بيانات لغتك ليست بالتأكيد مكتوبة باللغة اللاتينية ، على سبيل المثال (يا لها من مفاجأة :-). يمكن أن تصبح دقة الكشف أفضل في مثل هذه الحالات إذا استبعدت بعض اللغات من عملية اتخاذ القرار أو تضمين اللغات ذات الصلة بشكل صريح:
// include all languages available in the library
// WARNING: in the worst case this produces high memory
// consumption of approximately 3.5GB
// and slow runtime performance
// (in high accuracy mode)
LanguageDetectorBuilder .fromAllLanguages()
// include only languages that are not yet extinct (= currently excludes Latin)
LanguageDetectorBuilder .fromAllSpokenLanguages()
// include only languages written with Cyrillic script
LanguageDetectorBuilder .fromAllLanguagesWithCyrillicScript()
// exclude only the Spanish language from the decision algorithm
LanguageDetectorBuilder .fromAllLanguagesWithout( Language . SPANISH )
// only decide between English and German
LanguageDetectorBuilder .fromLanguages( Language . ENGLISH , Language . GERMAN )
// select languages by ISO 639-1 code
LanguageDetectorBuilder .fromIsoCodes639_1( IsoCode639_1 . EN , IsoCode639_3 . DE )
// select languages by ISO 639-3 code
LanguageDetectorBuilder .fromIsoCodes639_3( IsoCode639_3 . ENG , IsoCode639_3 . DEU )داخليًا ، تستخدم Lingua بكفاءة جميع نوى وحدة المعالجة المركزية الخاصة بك من أجل تسريع تحميل نماذج اللغة واكتشاف اللغة نفسها. لهذا الغرض ، يتم استخدام الشوكة الداخلية. إذا تم استخدام المكتبة داخل خادم التطبيق ، فلن يتم تحرير الذاكرة المستهلكة تلقائيًا عند عدم نشر التطبيق.
إذا كنت ترغب في تحرير جميع موارد Lingua ، فسيتعين عليك القيام بذلك يدويًا عن طريق استدعاء detector.unloadLanguageModels() أثناء عدم النشر. سيؤدي ذلك إلى مسح جميع نماذج اللغة المحملة من الذاكرة ولكن تجمع مؤشرات الترابط سيستمر في تشغيله.
إذا كنت ترغب في تجربة Lingua قبل أن تقرر ما إذا كنت تريد استخدامه أم لا ، فيمكنك تشغيله في استبدال ورؤية نتائج الكشف على الفور.
./gradlew runLinguaOnConsole --console=plainjava -jar lingua-1.2.2-with-dependencies.jarثم فقط العب:
This is Lingua.
Select the language models to load.
1: enter language iso codes manually
2: all supported languages
Type a number and press <Enter>.
Type :quit to exit.
> 1
List some language iso 639-1 codes separated by spaces and press <Enter>.
Type :quit to exit.
> en fr de es
Loading language models...
Done. 4 language models loaded lazily.
Type some text and press <Enter> to detect its language.
Type :quit to exit.
> languages
ENGLISH
> Sprachen
GERMAN
> langues
FRENCH
> :quit
Bye! Ciao! Tschüss! Salut!
في حال كنت ترغب في المساهمة بشيء ما في Lingua ، يتم تشجيعك على القيام بذلك. هل لديك أفكار لتحسين واجهة برمجة التطبيقات؟ هل هناك بعض اللغات المحددة التي تريد دعمها مبكرًا؟ أو هل وجدت أي أخطاء حتى الآن؟ لا تتردد في فتح مشكلة أو إرسال طلب سحب. إنه موضع تقدير كبير.
لطلبات السحب ، يرجى التأكد من تمرير جميع اختبارات الوحدة وأن الرمز يتم تنسيقه وفقًا لدليل نمط Kotlin الرسمي. يمكنك التحقق من ذلك عن طريق تشغيل Kotlin Linter Ktlint باستخدام ./gradlew ktlintCheck . يمكن إصلاح معظم المشكلات التي يحددها Linter عن طريق التشغيل ./gradlew ktlintFormat . لا يمكن إصلاح جميع المشكلات الأخرى ، وخاصة الخطوط التي تزيد عن 120 حرفًا ، تلقائيًا. في هذه الحالة ، يرجى تنسيق الخطوط المعنية باليد. ستلاحظ أن البناء سيفشل إذا لم يكن التنسيق صحيحًا.
جميع أنواع طلبات السحب مرحب بها. الأكثر تفضيلًا هي إضافات لغة جديدة. إذا كنت ترغب في المساهمة لغات جديدة في Lingua ، فهناك دليل مفصل يشرح كيفية تحقيق ذلك.
شكرًا جزيلاً لك مقدمًا على جميع المساهمات ، مهما كانت صغيرة.
من أجل تنفيذ الخطوات أدناه ، ستحتاج إلى Java 8 أو أكثر. على الرغم من أن المكتبة نفسها تعمل على java> = 6 ، فإن فئات FilesWriter تستفيد من java.nio API التي تم تقديمها مع Java 8.
IsoCode639_1 و IsoCode639_3 وأضف رموز ISO للغة. من بين مواقع أخرى ، توفر ويكيبيديا قائمة شاملة.Language التعداد وأضف إدخالًا جديدًا لغتك. إذا كانت اللغة مكتوبة باستخدام برنامج نصي لم يتم دعمه بعد من خلال تعداد Lingua's Alphabet ، فأضف إدخالًا جديدًا له أيضًا.Language . ومع ذلك ، إذا حدثت الأحرف بلغة واحدة ولكن ليس في جميع اللغات ، فأضفها إلى ثابت CHARS_TO_LANGUAGES_MAPPING في الفصل Constant بدلاً من ذلك.LanguageModelFilesWriter لإنشاء ملفات نموذج اللغة. ملف بيانات التدريب المستخدم لتقدير احتمال NGRAM ليس مطلوبًا أن يكون له تنسيق محدد بخلاف ملف TXT صالح./src/main/resources/language-models with وضع ملفات نموذج اللغة التي تم إنشاؤها هناك. لا تعيد تسمية ملفات نموذج اللغة. يجب أن يكون اسم الدليل الفرعي هو رمز ISO 639-1 للغة ، منخفضة تمامًا.TestDataFilesWriter لإنشاء ملفات بيانات الاختبار المستخدمة لتوليد تقرير الدقة. يجب أن يكون لكل جملة على ملف الإدخال الذي يجب إنشاء بيانات الاختبار كل جملة على سطر منفصل./src/accuracyReport/resources/language-testdata . لا تقم بإعادة تسمية ملفات بيانات الاختبار./src/accuracyReport/kotlin/com/github/pemistahl/lingua/report/config . انظر إلى ملفات اللغات الأخرى في هذا الدليل لمعرفة كيف يجب أن يبدو الفصل. يجب أن تكون جميلة الذات./src/accuracyReport/kotlin/com/github/pemistahl/lingua/report/lingua . انظر إلى ملفات اللغات الأخرى في هذا الدليل لمعرفة كيف يجب أن يبدو الفصل. يجب أن تكون جميلة الذات. إذا كانت إحدى مكتبات كاشف اللغة الأخرى تدعم لغتك بالفعل ، فيمكنك إضافة فصول اختبار لتلك أيضًا. كل مكتبة لها دليل خاص بها لهذا الغرض. إذا لم يتم دعم لغتك من قبل مكتبات كاشف اللغة الأخرى ، فاستبعدها في AbstractLanguageDetectionAccuracyReport .linguaSupportedLanguages in /gradle.properties ../gradlew accuracyReport وأضف تقارير الدقة المحدثة إلى طلب السحب الخاص بك../gradlew drawAccuracyPlots./gradlew writeAccuracyTableألق نظرة على القضايا المخطط لها.