في نهاية الأسبوع الماضي (14-15 يوليو) ، تم عقد هاكاثون SmartMailHack آخر في مكتب Mail.Ru Group. لقد طُلب منا "ابتكار ميزة تسمح لك بالوصول إلى البيانات من البريد والتفاعل معها بشكل أكثر فعالية."
وصف البيانات والأفكار والحلول
لقد حصلنا على مربع اختبار يحتوي على أكثر من 1500 رسالة ، بالإضافة إلى الوصول الكامل إليه من خلال واجهة برمجة التطبيقات. قدم المنظمون دليلاً مفصلاً حول استخدامه (كتاب من 547 صفحة). بمساعدة طلبات JSON المميزة والمميزة ، يمكننا تلقي جميع المعلومات اللازمة حول البريد: الرسائل وأسماء المرسلين والخصائص المختلفة.
بعد أن ناقشنا أن كل واحد منا لديه عدة آلاف من الرسائل غير المقروءة من القوائم البريدية في البريد ، قررنا التعامل مع هذه المشكلة. في حالتنا ، لم يتم تحديد مدى صلة الرسالة بالوقت الذي ظهرت فيه في صندوق البريد. واستنادا إلى حقيقة أنه لن يتم فتح جميع الرسائل ، فمن الأفضل أن تظهر للمستخدم فقط تلك التي من المحتمل أن يفتحها. ويمكن إزالة كل شيء آخر إلى الجحيم. لذلك قررنا القيام بفرز للبريد.
كان من المفترض أن تكون حروف الفرز حسب الفئة ، ويجب وضع الفئات داخل البلاط (hi ، Trello). ضم الصف العلوي من البلاط معنى الحروف من مرسلين مختلفين. يمكن أن يكون هناك "رحلات" ، "تسجيل" ، "مراسلات مع Vasya" ، "أحداث" ، "تمويل" وما إلى ذلك ، في المجموع حوالي 10 فئات. وكان الصف الثاني عبارة عن بلاط بأروع عروض الشركات. لقد بحثنا عن الرموز الترويجية الأكثر صلة ، وأكثر العروض الترويجية للخصومات ، والعروض الأكثر قيمة ، وعرضناها هنا ، مجمعة حسب الشركة. ثم اتبعت جميع الرسائل الأخرى الموزعة بين الشركات المرسلة ، وتناثر هؤلاء المرسلون بدورهم في فئات ("طعام" ، "مستحضرات تجميل" ، "إلكترونيات" وغيرها). علاوة على ذلك ، تم تصنيف الفئات أيضًا حسب مدى ملاءمة الرسائل ، ولم يتم عرض سوى الحروف التي تجاوزت حدًا معينًا من الملاءمة. بعد أن عززنا الفكرة بعبارة "اعثر على ما هو مطلوب وتخلص من الفائض" ، صعدنا إلى ML.
التعلم الآلي
قررنا بناء ثلاثة نماذج:
- مصنف من أكثر من 30 فئة قمنا بتعيينها كأساسي لجميع المستخدمين ؛
- تجميع وإبراز الفئات الجديدة بناءً على تفضيلات المستخدم ؛
- ترتيب الرسائل ضمن الفئة ، من الأكثر ارتباطًا بالأقل.

علامات
يبدو أنه يجب وصف هذا البند بشكل فردي لكل مهمة. ومع ذلك ، أنشأنا مجموعة بيانات واحدة مشتركة ودربنا جميع النماذج عليها. لم يكن هناك وقت للاختيار الدقيق.
كانت هناك مجموعة من العلامات الثنائية التي تم إلغاء تحميلها باستخدام واجهة برمجة التطبيقات. ومع ذلك ، تم إنشاء معظمها على النصوص:
- tf-idf على مجموعة من المستندات ؛
- تلقي التضمينات مع Word2Vec ؛
- الأعراض السلوكية مثل:
- عدد الرسائل التي تمت قراءتها في النافذة الأخيرة (1 ، 2 ، 5 أسابيع مضت) ؛
- عدد الرسائل من هذا.
مهمة التصنيف
قمنا بتمييز 1000 حرف للتدريب. اتضح أن هذا ليس عملًا بطيئًا ومملاً كما قد يبدو في البداية. إذا كنت تستخدم العناوين والعناوين ، يمكنك تسريع العمل بشكل كبير. على سبيل المثال ، يرسل Lamoda دائمًا رسائل إلى فئة "الملابس".
بعد ذلك ، نقوم بتدريب LightGBM على مجموعة كاملة من اللافتات ونحصل على جودة 0.913 دقة و 0.892 قياس f1 ، والتي حددناها كنتيجة جيدة جدًا على مستوى خط الأساس. هذا يدل على أنه يمكن تصنيف الرسائل بشكل جيد للغاية.
مهمة الترتيب
كمتغير هدف ، استخدمنا العلامة الثنائية 0/1 - ما إذا كان المستخدم قد قرأ الرسالة. تم تصنيفها أيضًا وفقًا للاحتمال الذي توقعه النموذج ، لأن هذا هو بالضبط ما يعكس مدى ثقة النموذج في ما إذا كان الشخص سيقرأ الرسالة أم لا.
هنا قمنا أيضًا بتدريب LightGBM على مجموعة الميزات الكاملة وحصلنا على جودة تبلغ حوالي 0.816 auc-roc.
تجميع وإبراز فئات جديدة
بالإضافة إلى الفئات الرئيسية ، لدينا فئة "أخرى". من خلالها يمكنك تسليط الضوء على مواضيع جديدة.
قمنا بتدريب DBSCAN القياسي على رسائل من هذه المجموعة ، ثم اخترنا تلك المجموعات التي كان بها الكثير من الرسائل (يمكن تحسين العتبة ، ولكن تم إصلاحها عن طريق الصدفة). على سبيل المثال ، يمكن تعيين النمذجة المواضيعية على مجموعة من مستندات مجموعة ما ، والحصول على الموضوع الأكثر صلة بمجموعة معينة ، وتحديدها في مجموعة منفصلة. لم يكن هناك وقت كاف للتحقق من هذه الخوارزمية.
لذلك ، يتم تمرير الرسائل الواردة من خلال المصنف ، إذا كانت تندرج في فئة "أخرى" - يتم تجميعها ، وتحاول مواضيع جديدة أن تبرز ، ثم يتم الترتيب. يتم إرسال طلب الواجهة الخلفية ، الذي يجمع كل شيء ، ويتم تقديم الواجهة الأمامية.

الأفكار المتبقية
- تحسين نماذج تعلُم الآلة ؛
- جمع البيانات من المزيد من المستخدمين للتنبؤ بشكل أفضل بسلوك كل منهم ؛
- التحقق الشامل من الفئات الناشئة الجديدة ؛
- استخدام الصور كعلامات ، على سبيل المثال ، تخصيص التضمين من الشبكات العصبية المدربة مسبقًا.