
في YouScan ، نعالج حوالي 100 مليون رسالة يوميًا ، يتم تطبيق العديد من القواعد والوظائف الذكية المختلفة. لعملهم الصحيح ، من الضروري تحديد اللغة بشكل صحيح ، لأنه لا يمكن جعل كل الوظائف غير ملزمة فيما يتعلق باللغة. في هذه المقالة ، سنتحدث بإيجاز عن دراستنا لهذه المشكلة ونعرض تقييم الجودة على مجموعة بيانات الشبكة الاجتماعية. شبكات.
مخطط المقالة
- مشاكل تعريف اللغة
- حلول عامة بأسعار معقولة
- كاشف اللغة المدمجة 2
- Fasttext
- تقييم الجودة
- الاستنتاجات
1. مشاكل تعريف اللغة
إن تعريف اللغة هو مشكلة قديمة نوعًا ما ويحاول الكثير حلها في إطار تعدد اللغات في منتجاتهم. تستخدم المناهج القديمة حلولًا تستند إلى n-grams ، عندما يتم النظر في عدد مرات حدوث n-gram معينة وبناءً على ذلك ، يتم حساب "سرعة" كل لغة ، وبعد ذلك يتم تحديد اللغة الأكثر احتمالًا وفقًا لنموذجنا. العيب الرئيسي لهذه النماذج هو أن السياق لا يؤخذ في الاعتبار على الإطلاق ، وبالتالي ، من الصعب تعريف لغة لمجموعات لغوية مماثلة. ولكن بسبب بساطة النماذج ، ينتهي بنا الأمر بسرعة عالية ، مما يوفر الموارد للأنظمة المحملة بشكل كبير. خيار آخر ، أكثر حداثة ، هو حل على الشبكات العصبية المتكررة. لا يعتمد هذا الحل بالفعل على n-grams فحسب ، بل يأخذ أيضًا في الاعتبار السياق ، والذي يجب أن يعطي زيادة في جودة العمل.
يعتمد تعقيد إنشاء الحل الخاص بك على جمع البيانات للتدريب وعملية التعلم نفسها. الحل الأكثر وضوحًا هو تدريب النموذج على مقالات ويكيبيديا ، لأننا نعرف اللغة بالتأكيد ، وهناك نصوص موثوقة عالية الجودة يسهل تجميعها نسبيًا. ولتدريب نموذجك ، تحتاج إلى قضاء الكثير من الوقت لتجميع مجموعة البيانات ومعالجتها ، ثم اختيار أفضل بنية. على الأرجح قام شخص ما بذلك بالفعل أمامنا. في الكتلة التالية ، ننظر في الحلول الحالية.
2. الحلول العامة المتاحة
كاشف اللغة المدمجة 2
CLD2 هو نموذج احتمالي قائم على التعلم الآلي (مصنف Naive Baessian) يمكنه تحديد 83 لغة مختلفة للنص بتنسيق UTF-8 أو html / xml. بالنسبة للغات المختلطة ، يعرض النموذج أعلى 3 لغات ، حيث يتم حساب الاحتمال كنسبة مئوية تقريبية من نص إجمالي عدد وحدات البايت. إذا لم يكن النموذج متأكدًا من إجابته ، فسوف تُرجع العلامة "unc".
دقة واكتمال هذا النموذج على مستوى جيد إلى حد ما ، ولكن الميزة الرئيسية هي السرعة. يدعي المبدعون حوالي 30 كيلوبايت في 1 مللي ثانية ، في اختباراتنا لغطاء بايثون الذي تلقيناه من 21 إلى 26 كيلوبايت في 1 مللي ثانية (70،000-85000 رسالة في الثانية ، متوسط حجمها 0.8 كيلوبايت والوسيط 0.3 كيلوبايت).
هذا الحل سهل الاستخدام للغاية. تحتاج أولاً إلى تثبيت غلاف بايثون أو استخدام عامل إرساء .
لإجراء توقعات ، ما pycld2
سوى استيراد مكتبة pycld2
وكتابة سطر إضافي من التعليمات البرمجية:
تعريف لغة باستخدام cld2 import pycld2 as cld2 cld2.detect("Bonjour, Habr!")
استجابة الكاشف هي مجموعة ثلاثية العناصر:
- يتم تعريف اللغة أم لا ؛
- عدد الحروف
- مجموعة من اللغات الثلاث الأكثر احتمالاً ، حيث يأتي الاسم الكامل أولاً ،
والثاني هو الاختصار وفقًا لمعيار ISO 3166 ، والثالث هو نسبة الأحرف التي تنتمي إلى هذه اللغة ، والرابع هو عدد وحدات البايت.
Fasttext
FastText هي مكتبة كتبها Facebook للتعلم الفعال وتصنيف النصوص. في إطار هذا المشروع ، قدم Facebook Research عمليات التضمين لـ 157 لغة تظهر نتائج حديثة لأداء مهام مختلفة ، بالإضافة إلى نموذج لتحديد اللغة والمهام الإشرافية الأخرى.
بالنسبة لنموذج تعريف اللغة ، استخدموا بيانات من Wikipedia و Tatoeba و SETimes ، وكمصنف ، استخدموا حل النص السريع الخاص بهم.
يقدم مطورو أبحاث الفيسبوك نموذجين:
- lid.176.bin ، وهو أسرع قليلاً وأكثر دقة من النموذج الثاني ، ولكنه يزن 128 ميغابايت ؛
- lid.176.ftz - نسخة مضغوطة من النموذج الأصلي.
لاستخدام هذه النماذج في python ، تحتاج أولاً إلى تثبيت غلاف python للنص السريع . قد يكون من الصعب تثبيته ، لذلك تحتاج إلى اتباع التعليمات بعناية على github أو استخدام عامل الميناء لدينا . من الضروري أيضًا تنزيل النموذج من الرابط أعلاه. سوف نستخدم النسخة الأصلية في هذه المقالة.
يعد تصنيف لغة باستخدام نموذج من Facebook أكثر تعقيدًا بعض الشيء ، لذلك نحتاج إلى ثلاثة أسطر من التعليمات البرمجية:
تحديد لغة باستخدام نموذج FastText from pyfasttext import FastText model = FastText('../model/lid.176.bin') model.predict_proba(["Bonjour, Habr!"], 3)
يسمح نموذج FastText'a بالتنبؤ باحتمالية اللغات n ، حيث افتراضيًا n = 1 ، ولكن في هذا المثال استنتجنا النتيجة لأفضل ثلاث لغات. بالنسبة لهذا النموذج ، هذا بالفعل هو الاحتمال العام لتوقع اللغة للنص ، وليس عدد الأحرف التي تنتمي إلى لغة معينة ، كما كان الحال في نموذج cld2. كما أن السرعة عالية جدًا - أكثر من 60.000 رسالة في الثانية.
3. تقييم الجودة
سنقوم بتقييم جودة الخوارزميات باستخدام البيانات من الشبكات الاجتماعية لوقت عشوائي مأخوذ من نظام YouScan (حوالي 500 ألف مرجع) ، وبالتالي ، ستحتوي العينة على المزيد من اللغات الروسية والإنجليزية ، 43٪ و 32٪ على التوالي ، الأوكرانية والإسبانية والبرتغالية - حول 2٪ من كل اللغات المتبقية أقل من 1٪. بالنسبة للهدف الصحيح ، سنأخذ الترميز من خلال ترجمة جوجل ، حيث أن Google في الوقت الحالي جيدة جدًا في إدارة ليس فقط الترجمة ، ولكن أيضًا تعريف لغة النصوص. بالطبع ، ترميزها ليس مثاليًا ، ولكن في معظم الحالات يمكن الوثوق به.
مقاييس تقييم جودة تعريفات اللغة ستكون الدقة والاكتمال و F1. دعونا نحسبها ونعرضها في الجدول:
مقارنة جودة خوارزميتين with open("../data/lang_data.txt", "r") as f: text_l, cld2_l, ft_l, g_l = [], [], [], [] s = '' for i in f: s += i if ' |end\n' in s: text, cld2, ft, g = s.strip().rsplit(" ||| ", 3) text_l.append(text) cld2_l.append(cld2) ft_l.append(ft) g_l.append(g.replace(" |end", "")) s='' data = pd.DataFrame({"text": text_l, "cld2": cld2_l, "ft": ft_l, "google": g_l}) def lang_summary(lang, col): prec = (data.loc[data[col] == lang, "google"] == data.loc[data[col] == lang, col]).mean() rec = (data.loc[data["google"] == lang, "google"] == data.loc[data["google"] == lang, col]).mean() return round(prec, 3), round(rec, 3), round(2*prec*rec / (prec + rec),3) results = {} for approach in ["cld2", "ft"]: results[approach] = {} for l in data["google"].value_counts().index[:20]: results[approach][l] = lang_summary(l, approach) res = pd.DataFrame.from_dict(results) res["cld2_prec"], res["cld2_rec"], res["cld2_f1"] = res["cld2"].apply(lambda x: [x[0], x[1], x[2]]).str res["ft_prec"], res["ft_rec"], res["ft_f1"] = res["ft"].apply(lambda x: [x[0], x[1], x[2]]).str res.drop(columns=["cld2", "ft"], inplace=True) arrays = [['cld2', 'cld2', 'cld2', 'ft', 'ft', 'ft'], ['precision', 'recall', 'f1_score', 'precision', 'recall', 'f1_score']] tuples = list(zip(*arrays)) res.columns = pd.MultiIndex.from_tuples(tuples, names=["approach", "metrics"])
نموذج | | cld2 | | | قدم | | | الجواب | |
---|
المقاييس | سابق | التوصية | و ١ | سابق | التوصية | و ١ | سابق | التوصية | و ١ |
ع | 0.992 | 0.725 | 0.838 | 0.918 | 0.697 | 0.793 | 0.968 | 0.788 | 0.869 |
من الألف إلى الياء | 0.95 | 0.752 | 0.839 | 0.888 | 0.547 | 0.677 | 0.914 | 0.787 | 0.845 |
ب | 0.529 | 0.136 | 0.217 | 0.286 | 0.178 | 0.219 | 0.408 | 0.214 | 0.281 |
en | 0.949 | 0.844 | 0.894 | 0.885 | 0.869 | 0.877 | 0.912 | 0.925 | 0.918 |
es | 0.987 | 0.653 | 0.786 | 0.709 | 0.814 | 0.758 | 0.828 | 0.834 | 0.831 |
الاب | 0.991 | 0.713 | 0.829 | 0.53 | 0.803 | 0.638 | 0.713 | 0.81 | 0.758 |
معرف | 0.763 | 0.543 | 0.634 | 0.481 | 0.404 | 0.439 | 0.659 | 0.603 | 0.63 |
عليه | 0.975 | 0.466 | 0.631 | 0.519 | 0.778 | 0.622 | 0.666 | 0.752 | 0.706 |
جا | 0.994 | 0.899 | 0.944 | 0.602 | 0.842 | 0.702 | 0.847 | 0.905 | 0.875 |
كا | 0.962 | 0.995 | 0.979 | 0.959 | 0.905 | 0.931 | 0.958 | 0.995 | 0.976 |
ك ك | 0.908 | 0.653 | 0.759 | 0.804 | 0.584 | 0.677 | 0.831 | 0.713 | 0.767 |
كو | 0.984 | 0.886 | 0.933 | 0.94 | 0.704 | 0.805 | 0.966 | 0.91 | 0.937 |
مللي ثانية | 0.801 | 0.578 | 0.672 | 0.369 | 0.101 | 0.159 | 0.73 | 0.586 | 0.65 |
نقطة | 0.968 | 0.753 | 0.847 | 0.805 | 0.771 | 0.788 | 0.867 | 0.864 | 0.865 |
رو | 0.987 | 0.809 | 0.889 | 0.936 | 0.933 | 0.935 | 0.953 | 0.948 | 0.95 |
ريال | 0.093 | 0.114 | 0.103 | 0.174 | 0.103 | 0.13 | 0.106 | 0.16 | 0.128 |
عشر | 0.989 | 0.986 | 0.987 | 0.973 | 0.927 | 0.95 | 0.979 | 0.986 | 0.983 |
tr | 0.961 | 0.639 | 0.768 | 0.607 | 0.73 | 0.663 | 0.769 | 0.764 | 0.767 |
uk | 0.949 | 0.671 | 0.786 | 0.615 | 0.733 | 0.669 | 0.774 | 0.777 | 0.775 |
عز | 0.666 | 0.512 | 0.579 | 0.77 | 0.169 | 0.278 | 0.655 | 0.541 | 0.592 |
تظهر النتائج بوضوح أن منهج cld2 يتمتع بدقة عالية جدًا في تحديد اللغة ، إلا أنه بالنسبة للغات غير المشهورة ، فإنه يقل عن 90٪ ، وفي 90٪ من الحالات تكون النتيجة أفضل من تلك الخاصة بالنص السريع. مع اكتمال نفس النهجين تقريبًا ، يكون f1 أسرع في cld2.
تكمن خصوصية نموذج cld2 في أنه يعطي توقعات فقط لتلك الرسائل حيث يكون واثقًا بما فيه الكفاية ، وهذا يفسر الدقة العالية. يعطي نموذج fasttext'a إجابة لمعظم الرسائل ، وبالتالي فإن الدقة أقل بشكل ملحوظ ، ولكن من الغريب أن الاكتمال ليس أعلى بشكل ملحوظ ، وفي نصف الحالات أقل. ولكن إذا قمت "بتحريف" العتبة لنموذج النص السريع ، فيمكنك تحسين الدقة.
4. الاستنتاجات
بشكل عام ، يعطي كلا النموذجين نتائج جيدة ويمكن استخدامه لحل مشكلة تحديد اللغة في المجالات المختلفة. ميزتها الرئيسية هي السرعة العالية ، مما يجعل من الممكن إنشاء ما يسمى "مجموعة" وإضافة المعالجة المسبقة اللازمة لتحسين الجودة.
يمكنك العثور على جميع التعليمات البرمجية لإعادة إنتاج التجارب واختبار المناهج المذكورة أعلاه في مستودعنا .
يمكنك أيضًا الاطلاع على اختبار هذه الحلول في مقال آخر يقارن الدقة والسرعة في 6 لغات في أوروبا الغربية.