
Bei YouScan verarbeiten wir täglich etwa 100 Millionen Nachrichten, auf die viele Regeln und verschiedene intelligente Funktionen angewendet werden. Für ihre korrekte Arbeit ist es notwendig, die Sprache korrekt zu bestimmen, da nicht alle Funktionen in Bezug auf die Sprache agnostisch gemacht werden können. In diesem Artikel werden wir kurz auf unsere Untersuchung dieses Problems eingehen und eine Qualitätsbewertung in einem Datensatz eines sozialen Netzwerks zeigen. Netzwerke.
Artikelübersicht
- Sprachdefinitionsprobleme
- Erschwingliche öffentliche Lösungen
- Kompakter Sprachdetektor 2
- Fasttext
- Qualitätsbewertung
- Schlussfolgerungen
1. Probleme der Sprachdefinition
Die Definition von Sprache ist ein ziemlich altes Problem, und viele versuchen, es im Rahmen der Mehrsprachigkeit ihrer Produkte zu lösen. Ältere Ansätze verwenden Lösungen, die auf n-Gramm basieren. Wenn die Anzahl der Vorkommen eines bestimmten n-Gramms berücksichtigt wird und auf dieser Grundlage die "Geschwindigkeit" für jede Sprache berechnet wird, wird die wahrscheinlichste Sprache gemäß unserem Modell ausgewählt. Der Hauptnachteil dieser Modelle besteht darin, dass der Kontext absolut nicht berücksichtigt wird, weshalb die Definition einer Sprache für ähnliche Sprachgruppen schwierig ist. Aufgrund der Einfachheit der Modelle erhalten wir jedoch eine hohe Bestimmungsgeschwindigkeit, die Ressourcen für hoch belastete Systeme spart. Eine andere Option, eine modernere, ist eine Lösung für wiederkehrende neuronale Netze. Diese Lösung basiert bereits nicht nur auf n-Gramm, sondern berücksichtigt auch den Kontext, der die Arbeitsqualität verbessern sollte.
Die Komplexität der Erstellung Ihrer eigenen Lösung beruht auf der Erfassung von Daten für das Training und den Lernprozess selbst. Die naheliegendste Lösung besteht darin, das Modell auf Wikipedia-Artikeln zu trainieren, da wir die Sprache sicher kennen und es sehr hochwertige verifizierte Texte gibt, die relativ einfach zu kompilieren sind. Um Ihr Modell zu trainieren, müssen Sie viel Zeit aufwenden, um das Dataset zusammenzustellen, zu verarbeiten und dann die beste Architektur auszuwählen. Höchstwahrscheinlich hat dies bereits jemand vor uns getan. Im nächsten Block betrachten wir bestehende Lösungen.
2. Verfügbare öffentliche Lösungen
Kompakter Sprachdetektor 2
CLD2 ist ein auf maschinellem Lernen basierendes probabilistisches Modell (Naive Baessian Classifier), das 83 verschiedene Sprachen für Text im UTF-8- oder HTML / XML-Format definieren kann. Für gemischte Sprachen gibt das Modell die drei wichtigsten Sprachen zurück, wobei die Wahrscheinlichkeit als ungefährer Prozentsatz des Textes der Gesamtzahl der Bytes berechnet wird. Wenn das Modell sich seiner Antwort nicht sicher ist, gibt es das Tag "unc" zurück.
Die Genauigkeit und Vollständigkeit dieses Modells ist auf einem ziemlich guten Niveau, aber der Hauptvorteil ist die Geschwindigkeit. Die Entwickler behaupten, dass wir bei unseren Tests des Python-Wrappers in 1 ms etwa 30 KB in 21 ms erhalten haben (70.000 bis 85.000 Nachrichten pro Sekunde, deren durchschnittliche Größe 0,8 KB und deren Median 0,3 KB beträgt).
Diese Lösung ist sehr einfach zu bedienen. Zuerst müssen Sie den Python-Wrapper installieren oder unseren Docker verwenden .
Um eine Prognose zu erstellen, importieren pycld2
einfach die pycld2
Bibliothek und schreiben Sie eine zusätzliche Codezeile:
Definieren einer Sprache mit cld2 import pycld2 as cld2 cld2.detect("Bonjour, Habr!")
Die Detektorantwort ist ein Tupel mit drei Elementen:
- Sprache ist definiert oder nicht;
- Anzahl der Zeichen;
- Tupel der drei wahrscheinlichsten Sprachen, bei denen der vollständige Name an erster Stelle steht,
Die zweite ist die Abkürzung gemäß ISO 3166-Codes, die dritte ist der Prozentsatz der Zeichen, die zu dieser Sprache gehören, und die vierte ist die Anzahl der Bytes.
Fasttext
FastText ist eine von Facebook geschriebene Bibliothek zum effektiven Lernen und Klassifizieren von Texten. Im Rahmen dieses Projekts präsentierte Facebook Research Einbettungen für 157 Sprachen, die aktuelle Ergebnisse für verschiedene Aufgaben sowie ein Modell zur Bestimmung der Sprache und anderer Überwachungsaufgaben zeigen.
Für das Sprachdefinitionsmodell verwendeten sie Daten aus Wikipedia, Tatoeba und SETimes und als Klassifikator ihre Fasttext-Lösung.
Die Entwickler der Facebook-Forschung bieten zwei Modelle an:
- lid.176.bin , der etwas schneller und genauer als das zweite Modell ist, aber 128 MB wiegt;
- lid.176.ftz - eine komprimierte Version des Originalmodells.
Um diese Modelle in Python zu verwenden, müssen Sie zuerst den Python-Wrapper für Fasttext installieren. Die Installation kann schwierig sein. Befolgen Sie daher die Anweisungen auf dem Github oder verwenden Sie unseren Docker . Es ist auch erforderlich, das Modell über den obigen Link herunterzuladen. Wir werden die Originalversion in diesem Artikel verwenden.
Das Klassifizieren einer Sprache mithilfe eines Modells von Facebook ist etwas komplizierter. Dazu benötigen wir drei Codezeilen:
Definieren einer Sprache mithilfe des FastText-Modells from pyfasttext import FastText model = FastText('../model/lid.176.bin') model.predict_proba(["Bonjour, Habr!"], 3)
Das FastText'a-Modell ermöglicht die Vorhersage der Wahrscheinlichkeit für n-Sprachen, wobei standardmäßig n = 1 ist. In diesem Beispiel haben wir jedoch das Ergebnis für die drei besten Sprachen abgeleitet. Für dieses Modell ist dies bereits die allgemeine Wahrscheinlichkeit einer Sprachvorhersage für den Text und nicht die Anzahl der Zeichen, die zu einer bestimmten Sprache gehören, wie dies im cld2-Modell der Fall war. Die Geschwindigkeit ist auch ziemlich hoch - mehr als 60.000 Nachrichten pro Sekunde.
3. Qualitätsbewertung
Wir werden die Qualität der Algorithmen anhand von Daten aus sozialen Netzwerken für zufällige Zeiträume bewerten, die aus dem YouScan- System entnommen wurden (ca. 500.000 Referenzen). Daher wird die Stichprobe mehr russische und englische Sprachen enthalten, 43% bzw. 32%, ukrainisch, spanisch und portugiesisch - ungefähr Jeweils 2% der übrigen Sprachen weniger als 1%. Für das richtige Ziel werden wir das Markup über Google Übersetzer durchführen, da Google derzeit nicht nur die Übersetzung, sondern auch die Definition der Sprache der Texte sehr gut verwaltet. Natürlich ist das Markup nicht ideal, aber in den meisten Fällen kann man ihm vertrauen.
Metriken zur Bewertung der Qualität von Sprachdefinitionen sind Genauigkeit, Vollständigkeit und f1. Zählen wir sie und zeigen sie in der Tabelle an:
Vergleich der Qualität zweier Algorithmen 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"])
Modell | | cld2 | | | ft | | | ans | |
---|
Metriken | vor | rec | f1 | vor | rec | f1 | vor | rec | f1 |
ar | 0,992 | 0,725 | 0,838 | 0,918 | 0,697 | 0,793 | 0,968 | 0,788 | 0,869 |
az | 0,95 | 0,752 | 0,839 | 0,888 | 0,547 | 0,677 | 0,914 | 0,787 | 0,845 |
bg | 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 |
fr | 0,991 | 0,713 | 0,829 | 0,53 | 0,803 | 0,638 | 0,713 | 0,81 | 0,758 |
id | 0,763 | 0,543 | 0,634 | 0,481 | 0,404 | 0,439 | 0,659 | 0,603 | 0,63 |
es | 0,975 | 0,466 | 0,631 | 0,519 | 0,778 | 0,622 | 0,666 | 0,752 | 0,706 |
ja | 0,994 | 0,899 | 0,944 | 0,602 | 0,842 | 0,702 | 0,847 | 0,905 | 0,875 |
ka | 0,962 | 0,995 | 0,979 | 0,959 | 0,905 | 0,931 | 0,958 | 0,995 | 0,976 |
kk | 0,908 | 0,653 | 0,759 | 0,804 | 0,584 | 0,677 | 0,831 | 0,713 | 0,767 |
ko | 0,984 | 0,886 | 0,933 | 0,94 | 0,704 | 0,805 | 0,966 | 0,91 | 0,937 |
ms | 0,801 | 0,578 | 0,672 | 0,369 | 0,101 | 0,159 | 0,73 | 0,586 | 0,65 |
pt | 0,968 | 0,753 | 0,847 | 0,805 | 0,771 | 0,788 | 0,867 | 0,864 | 0,865 |
ru | 0,987 | 0,809 | 0,889 | 0,936 | 0,933 | 0,935 | 0,953 | 0,948 | 0,95 |
sr | 0,093 | 0,114 | 0,103 | 0,174 | 0,103 | 0,13 | 0,106 | 0,16 | 0,128 |
th | 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 |
Großbritannien | 0,949 | 0,671 | 0,786 | 0,615 | 0,733 | 0,669 | 0,774 | 0,777 | 0,775 |
uz | 0,666 | 0,512 | 0,579 | 0,77 | 0,169 | 0,278 | 0,655 | 0,541 | 0,592 |
Die Ergebnisse zeigen deutlich, dass der cld2-Ansatz eine sehr hohe Genauigkeit bei der Bestimmung der Sprache aufweist, nur für unpopuläre Sprachen unter 90% fällt und in 90% der Fälle das Ergebnis besser ist als das von Fasttext. Mit ungefähr der gleichen Vollständigkeit für die beiden Ansätze ist f1 bei cld2 schneller.
Die Besonderheit des cld2-Modells besteht darin, dass es nur für die Nachrichten eine Prognose liefert, bei denen es sicher genug ist. Dies erklärt die hohe Genauigkeit. Das Fasttext'a-Modell bietet eine Antwort auf die meisten Nachrichten, daher ist die Genauigkeit erheblich geringer, aber es ist seltsam, dass die Vollständigkeit nicht wesentlich höher und in halben Fällen niedriger ist. Wenn Sie jedoch den Schwellenwert für das Fasttext-Modell "verdrehen", können Sie die Genauigkeit verbessern.
4. Schlussfolgerungen
Im Allgemeinen liefern beide Modelle gute Ergebnisse und können verwendet werden, um das Problem der Bestimmung der Sprache in verschiedenen Bereichen zu lösen. Ihr Hauptvorteil ist die hohe Geschwindigkeit, die es ermöglicht, ein sogenanntes "Ensemble" zu erstellen und die notwendige Vorverarbeitung hinzuzufügen, um die Qualität zu verbessern.
Den gesamten Code zum Reproduzieren von Experimenten und Testen der oben genannten Ansätze finden Sie in unserem Repository .
Sie können das Testen dieser Lösungen auch in einem anderen Artikel sehen , in dem Genauigkeit und Geschwindigkeit in 6 westeuropäischen Sprachen verglichen werden.