نحن ببساطة نحدد لغة الرسائل


في YouScan ، نعالج حوالي 100 مليون رسالة يوميًا ، يتم تطبيق العديد من القواعد والوظائف الذكية المختلفة. لعملهم الصحيح ، من الضروري تحديد اللغة بشكل صحيح ، لأنه لا يمكن جعل كل الوظائف غير ملزمة فيما يتعلق باللغة. في هذه المقالة ، سنتحدث بإيجاز عن دراستنا لهذه المشكلة ونعرض تقييم الجودة على مجموعة بيانات الشبكة الاجتماعية. شبكات.


مخطط المقالة


  1. مشاكل تعريف اللغة
  2. حلول عامة بأسعار معقولة
    • كاشف اللغة المدمجة 2
    • Fasttext
  3. تقييم الجودة
  4. الاستنتاجات

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!") # (True, # 14, # (('FRENCH', 'fr', 92, 1102.0), # ('Unknown', 'un', 0, 0.0), # ('Unknown', 'un', 0, 0.0))) 

استجابة الكاشف هي مجموعة ثلاثية العناصر:


  • يتم تعريف اللغة أم لا ؛
  • عدد الحروف
  • مجموعة من اللغات الثلاث الأكثر احتمالاً ، حيث يأتي الاسم الكامل أولاً ،
    والثاني هو الاختصار وفقًا لمعيار 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) #[[('fr', 0.7602248429835308), # ('en', 0.05550386696556002), # ('ca', 0.04721488914800802)]] 

يسمح نموذج 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.9920.7250.8380.9180.6970.7930.9680.7880.869
من الألف إلى الياء0.950.7520.8390.8880.5470.6770.9140.7870.845
ب0.5290.1360.2170.2860.1780.2190.4080.2140.281
en0.9490.8440.8940.8850.8690.8770.9120.9250.918
es0.9870.6530.7860.7090.8140.7580.8280.8340.831
الاب0.9910.7130.8290.530.8030.6380.7130.810.758
معرف0.7630.5430.6340.4810.4040.4390.6590.6030.63
عليه0.9750.4660.6310.5190.7780.6220.6660.7520.706
جا0.9940.8990.9440.6020.8420.7020.8470.9050.875
كا0.9620.9950.9790.9590.9050.9310.9580.9950.976
ك ك0.9080.6530.7590.8040.5840.6770.8310.7130.767
كو0.9840.8860.9330.940.7040.8050.9660.910.937
مللي ثانية0.8010.5780.6720.3690.1010.1590.730.5860.65
نقطة0.9680.7530.8470.8050.7710.7880.8670.8640.865
رو0.9870.8090.8890.9360.9330.9350.9530.9480.95
ريال0.0930.1140.1030.1740.1030.130.1060.160.128
عشر0.9890.9860.9870.9730.9270.950.9790.9860.983
tr0.9610.6390.7680.6070.730.6630.7690.7640.767
uk0.9490.6710.7860.6150.7330.6690.7740.7770.775
عز0.6660.5120.5790.770.1690.2780.6550.5410.592

تظهر النتائج بوضوح أن منهج cld2 يتمتع بدقة عالية جدًا في تحديد اللغة ، إلا أنه بالنسبة للغات غير المشهورة ، فإنه يقل عن 90٪ ، وفي 90٪ من الحالات تكون النتيجة أفضل من تلك الخاصة بالنص السريع. مع اكتمال نفس النهجين تقريبًا ، يكون f1 أسرع في cld2.
تكمن خصوصية نموذج cld2 في أنه يعطي توقعات فقط لتلك الرسائل حيث يكون واثقًا بما فيه الكفاية ، وهذا يفسر الدقة العالية. يعطي نموذج fasttext'a إجابة لمعظم الرسائل ، وبالتالي فإن الدقة أقل بشكل ملحوظ ، ولكن من الغريب أن الاكتمال ليس أعلى بشكل ملحوظ ، وفي نصف الحالات أقل. ولكن إذا قمت "بتحريف" العتبة لنموذج النص السريع ، فيمكنك تحسين الدقة.


4. الاستنتاجات


بشكل عام ، يعطي كلا النموذجين نتائج جيدة ويمكن استخدامه لحل مشكلة تحديد اللغة في المجالات المختلفة. ميزتها الرئيسية هي السرعة العالية ، مما يجعل من الممكن إنشاء ما يسمى "مجموعة" وإضافة المعالجة المسبقة اللازمة لتحسين الجودة.


يمكنك العثور على جميع التعليمات البرمجية لإعادة إنتاج التجارب واختبار المناهج المذكورة أعلاه في مستودعنا .


يمكنك أيضًا الاطلاع على اختبار هذه الحلول في مقال آخر يقارن الدقة والسرعة في 6 لغات في أوروبا الغربية.

Source: https://habr.com/ru/post/ar423569/


All Articles