Am vergangenen Wochenende (14.-15. Juli) fand im Büro der Mail.Ru Group ein weiterer SmartMailHack-Hackathon statt. Wir wurden gebeten, "eine Funktion zu entwickeln, mit der Sie auf Daten aus der Mail zugreifen und effektiver mit ihnen interagieren können".
Datenbeschreibung, Ideen und Lösungen
Wir haben eine Testbox mit mehr als 1500 Nachrichten sowie vollen Zugriff über die API. Die Organisatoren stellten ein umfangreiches, detailliertes Handbuch zur Verwendung zur Verfügung (547-seitiges Buch). Mit Hilfe eines Tokens und einfacher JSON-Anfragen konnten wir alle notwendigen Informationen über die Mail erhalten: Briefe, Absendernamen, verschiedene Merkmale.
Nachdem wir besprochen hatten, dass jeder von uns ungefähr mehrere tausend ungelesene Briefe aus den Mailinglisten in der Mail hat, beschlossen wir, uns mit diesem Problem zu befassen. In unserem Fall wird die Relevanz des Briefes nicht mehr durch den Zeitpunkt bestimmt, zu dem er im Postfach angezeigt wurde. Und basierend auf der Tatsache, dass nicht alle Buchstaben geöffnet werden, ist es besser, dem Benutzer nur diejenigen von ihnen zu zeigen, die er wahrscheinlich öffnen wird. Und alles andere kann zur Hölle gebracht werden. Also beschlossen wir, eine Art Post zu machen.
Sortierbuchstaben sollten kategorisiert und die Kategorien innerhalb der Kacheln platziert werden (hi, Trello). In der oberen Kachelreihe wurde die Bedeutung von Briefen verschiedener Absender kombiniert. Es kann "Reisen", "Registrierung", "Korrespondenz mit Vasya", "Veranstaltungen", "Finanzen" usw. geben, insgesamt etwa 10 Kategorien. Die zweite Reihe waren Fliesen mit den coolsten Angeboten von Unternehmen. Wir haben nach den relevantesten Aktionscodes, den meisten Rabattaktionen und den wertvollsten Angeboten gesucht und diese hier nach Unternehmen gruppiert angezeigt. Dann folgten alle anderen Briefe, die unter den sendenden Unternehmen verteilt wurden, und diese Absender wurden wiederum in Kategorien eingeteilt ("Lebensmittel", "Kosmetik", "Elektronik" und andere). Darüber hinaus wurden die Kategorien auch nach der Relevanz von Buchstaben eingestuft, und es wurden nur Buchstaben angezeigt, die eine bestimmte Relevanzschwelle überschritten haben. Nachdem wir die Idee mit den Worten „Finde, was gebraucht wird und überschüssiges loswerden“ bekräftigt haben, stiegen wir in ML ein.
Maschinelles Lernen
Wir haben beschlossen, drei Modelle zu bauen:
- ein Klassifikator aus mehr als 30 Kategorien, den wir als Basis für alle Benutzer festgelegt haben;
- Clustering und Hervorheben neuer Kategorien basierend auf Benutzerpräferenzen;
- Rangfolge der Buchstaben innerhalb der Kategorie, von den relevantesten bis zu den am wenigsten relevanten.

Zeichen
Es scheint, dass dieser Punkt für jede Aufgabe einzeln beschrieben werden sollte. Wir haben jedoch einen gemeinsamen Feature-Datensatz generiert und alle Modelle darauf trainiert. Es war keine Zeit für eine sorgfältige Auswahl.
Es gab eine Reihe von Binärzeichen, die mithilfe der API entladen wurden. Die meisten davon wurden jedoch auf den Texten generiert:
- tf-idf auf einer Sammlung von Dokumenten;
- Mit Word2Vec empfangene Einbettungen;
- Verhaltenssymptome wie:
- die Anzahl der im letzten Fenster gelesenen Nachrichten (vor 1, 2, 5 Wochen);
- die Anzahl der Nachrichten davon.
Klassifizierungsaufgabe
Wir haben mit den Händen 1000 Buchstaben für das Training markiert. Es stellte sich heraus, dass dies keine so langsame und mühsame Arbeit ist, wie es zunächst scheinen mag. Wenn Sie Adressen und Header verwenden, können Sie die Arbeit erheblich beschleunigen. Zum Beispiel sendet Lamoda fast immer Briefe an die Kategorie „Kleidung“.
Als nächstes trainieren wir LightGBM für den gesamten Zeichensatz und erhalten die Qualität von 0,913 Genauigkeit und 0,892 f1 Messungen, die wir als sehr gutes Ergebnis auf der Basislinienebene ermittelt haben. Dies zeigt, dass Buchstaben sehr gut klassifiziert werden können.
Ranglistenaufgabe
Als Zielvariable haben wir das Binärflag 0/1 verwendet - ob die Nachricht vom Benutzer gelesen wurde. Sie wurden weiter nach der vom Modell vorhergesagten Wahrscheinlichkeit eingestuft, da genau dies widerspiegelt, wie sicher das Modell ist, ob die Person die Nachricht lesen wird oder nicht.
Hier haben wir auch LightGBM für alle Funktionen geschult und eine Qualität von ca. 0,816 auc-roc erhalten.
Clustering und Hervorheben neuer Kategorien
Zusätzlich zu den Hauptkategorien haben wir die Kategorie „Sonstige“. Daraus können Sie neue Themen hervorheben.
Wir haben den Standard-DBSCAN für Briefe aus dieser Gruppe trainiert und dann die Cluster ausgewählt, in denen viele Nachrichten vorhanden waren (der Schwellenwert kann optimiert werden, wurde jedoch versehentlich festgelegt). Beispielsweise kann die thematische Modellierung für eine Sammlung von Dokumenten eines Clusters festgelegt werden, um das relevanteste Thema für einen bestimmten Cluster abzurufen und es in einer separaten Gruppe auszuwählen. Es war nicht genügend Zeit vorhanden, um diesen Algorithmus zu validieren.
Eingehende Briefe werden also durch den Klassifikator geleitet, wenn sie in die Kategorie „Andere“ fallen - sie werden gruppiert, neue Themen versuchen herauszustechen, und dann findet eine Rangfolge statt. Es wird eine Backend-Anfrage gesendet, die alles zusammenfasst, und das Frontend wird gerendert.

Verbleibende Ideen
- Verbesserung der Modelle für maschinelles Lernen;
- Sammeln von Daten von mehr Benutzern, um das Verhalten jedes einzelnen von ihnen besser vorhersagen zu können;
- gründliche Validierung neu aufkommender Kategorien;
- die Verwendung von Bildern als Zeichen, zum Beispiel die Zuordnung von Einbettungen aus vorab trainierten neuronalen Netzen.