Definimos de manera simple y precisa el lenguaje de los mensajes.


En YouScan , procesamos alrededor de 100 millones de mensajes al día, en los que se aplican muchas reglas y diversas funciones inteligentes. Para su correcto trabajo, es necesario determinar correctamente el idioma, porque no todas las funciones pueden hacerse agnósticas con respecto al idioma. En este artículo, hablaremos brevemente sobre nuestro estudio de este problema y mostraremos una evaluación de calidad en un conjunto de datos de redes sociales. redes.


Bosquejo del artículo


  1. Problemas de definición del lenguaje
  2. Soluciones públicas asequibles
    • Detector de lenguaje compacto 2
    • Texto rápido
  3. Evaluación de calidad
  4. Conclusiones

1. Problemas de definición del lenguaje


La definición del lenguaje es un problema bastante antiguo y muchos intentan resolverlo en el marco del multilingüismo de sus productos. Los enfoques más antiguos usan soluciones basadas en n-gramas, cuando se considera el número de ocurrencias de un cierto n-gramo y en base a esto, se calcula la "velocidad" para cada idioma, después de lo cual se selecciona el idioma más probable según nuestro modelo. El principal inconveniente de estos modelos es que el contexto no se tiene en cuenta en absoluto, por lo tanto, la definición de un idioma para grupos de idiomas similares es difícil. Pero debido a la simplicidad de los modelos, terminamos con una alta velocidad de determinación, lo que ahorra recursos para sistemas altamente cargados. Otra opción, más moderna, es una solución en redes neuronales recurrentes. Esta solución ya se basa no solo en n-gramos, sino que también tiene en cuenta el contexto, lo que debería aumentar la calidad del trabajo.


La complejidad de crear su propia solución reside en la recopilación de datos para la capacitación y el proceso de aprendizaje en sí. La solución más obvia es entrenar el modelo en los artículos de Wikipedia, porque conocemos el idioma con seguridad y hay textos verificados de muy alta calidad que son relativamente fáciles de compilar. Y para entrenar su modelo, debe dedicar mucho tiempo a ensamblar el conjunto de datos, procesarlo y luego elegir la mejor arquitectura. Lo más probable es que alguien ya haya hecho esto antes que nosotros. En el siguiente bloque, analizamos las soluciones existentes.


2. Soluciones públicas disponibles


Detector de lenguaje compacto 2


CLD2 es un modelo probabilístico basado en aprendizaje automático (Naive Baessian Classifier) ​​que puede definir 83 idiomas diferentes para texto en formato UTF-8 o html / xml. Para idiomas mixtos, el modelo devuelve los 3 idiomas principales, donde la probabilidad se calcula como un porcentaje aproximado del texto del número total de bytes. Si el modelo no está seguro de su respuesta, devuelve la etiqueta "unc".


La precisión e integridad de este modelo está en un nivel bastante bueno, pero la principal ventaja es la velocidad. Los creadores reclaman alrededor de 30 kb en 1 ms, en nuestras pruebas del envoltorio de Python que recibimos de 21 a 26 kb en 1 ms (70,000-85,000 mensajes por segundo, cuyo tamaño promedio es 0.8 kb y la mediana es 0.3 kb).


Esta solución es muy fácil de usar. Primero necesita instalar su envoltorio de python o usar nuestro docker .


Para hacer un pronóstico, simplemente importe la biblioteca pycld2 y escriba una línea de código adicional:


Definiendo un lenguaje usando 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))) 

La respuesta del detector es una tupla de tres elementos:


  • el idioma está definido o no;
  • número de caracteres;
  • tupla de los tres idiomas más probables, donde el nombre completo viene primero,
    el segundo es la abreviatura de acuerdo con los códigos ISO 3166, el tercero es el porcentaje de caracteres que pertenecen a este idioma y el cuarto es el número de bytes.

Texto rápido


FastText es una biblioteca escrita por Facebook para el aprendizaje efectivo y la clasificación de textos. En el marco de este proyecto, Facebook Research presentó incrustaciones para 157 idiomas que muestran resultados de vanguardia para diferentes tareas, así como un modelo para determinar el idioma y otras tareas de supervisión.


Para el modelo de definición de lenguaje, usaron datos de Wikipedia, Tatoeba y SETimes, y como clasificador, usaron su solución de texto rápido.


Los desarrolladores de Facebook Research ofrecen dos modelos:


  • lid.176.bin , que es un poco más rápido y más preciso que el segundo modelo, pero pesa 128Mb;
  • lid.176.ftz : una versión comprimida del modelo original.

Para usar estos modelos en python, primero debe instalar el contenedor de python para fasttext . Puede ser difícil instalarlo, por lo que debe seguir cuidadosamente las instrucciones en el github o usar nuestra ventana acoplable . También es necesario descargar el modelo desde el enlace de arriba. Utilizaremos la versión original en este artículo.


Clasificar un idioma usando un modelo de Facebook es un poco más complicado, para esto necesitamos tres líneas de código:


Definir un idioma usando el modelo 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)]] 

El modelo FastText'a permite predecir la probabilidad de n-idiomas, donde por defecto n = 1, pero en este ejemplo hemos deducido el resultado para los 3 idiomas principales. Para este modelo, esta es ya la probabilidad general de predicción del lenguaje para el texto, y no la cantidad de caracteres que pertenecen a un idioma en particular, como fue el caso en el modelo cld2. La velocidad también es bastante alta: más de 60,000 mensajes por segundo.


3. Evaluación de calidad


Evaluaremos la calidad de los algoritmos utilizando datos de redes sociales durante un tiempo aleatorio tomado del sistema YouScan (aproximadamente 500 mil referencias), por lo tanto, la muestra tendrá más idiomas ruso e inglés, 43% y 32%, respectivamente, ucraniano, español y portugués - aproximadamente 2% de cada uno, de los idiomas restantes menos del 1%. Para el objetivo correcto, tomaremos el marcado a través del traductor de Google, ya que en este momento Google es muy bueno para administrar no solo la traducción, sino también la definición del idioma de los textos. Por supuesto, su marcado no es ideal, pero en la mayoría de los casos se puede confiar.


Las métricas para evaluar la calidad de las definiciones del lenguaje serán precisión, integridad y f1. Vamos a contarlos y mostrarlos en la tabla:


Comparación de la calidad de dos algoritmos.
 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"]) 

modelocld2piesans
métricasprecrecf1precrecf1precrecf1
ar0.9920,7250.8380.9180,6970,7930.9680,7880.869
az0,950,7520.8390,8880,5470.6770.9140,7870.845
bg0,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
fr0.9910,7130.8290,530,8030.6380,7130,810,758
id0,7630,5430.6340,4810,4040.4390,6590,6030,63
eso0.9750.4660.6310,5190,7780.6220,6660,7520,706
ja0,9940.8990.9440,6020.8420,7020.8470,9050.875
ka0.9620,9950.9790.9590,9050.9310.9580,9950.976
kk0,9080,6530,7590,8040,5840.6770.8310,7130,767
ko0,9840,8860.9330,940,7040,8050.9660,910.937
ms0,8010.5780,6720.3690,1010,1590,730,5860,65
pt0.9680,7530.8470,8050,7710,7880.8670.8640.865
ru0,9870,8090,8890.9360.9330.9350,9530.9480,95
sr0,0930.1140,1030,1740,1030,130,1060,160,128
th0,9890,9960,9870.9730.9270,950.9790,9960,983
tr0.9610.6390,7680,6070,730,6630,7690,7640,767
reino unido0.9490,6710,7860.6150,7330,6690,7740,7770,775
uz0,6660,5120.5790,770,1690.2780,6550,5410,592

Los resultados muestran claramente que el enfoque cld2 tiene una precisión muy alta en la determinación del idioma, solo para idiomas impopulares cae por debajo del 90%, y en el 90% de los casos el resultado es mejor que el del texto rápido. Con aproximadamente la misma integridad para los dos enfoques, f1 es más rápido en cld2.
La peculiaridad del modelo cld2 es que proporciona un pronóstico solo para aquellos mensajes en los que es lo suficientemente seguro, esto explica la alta precisión. El modelo fasttext'a da una respuesta para la mayoría de los mensajes, por lo tanto, la precisión es significativamente menor, pero es extraño que la integridad no sea significativamente mayor y, en la mitad de los casos, menor. Pero si "tuerce" el umbral para el modelo de texto rápido, puede mejorar la precisión.


4. Conclusiones


En general, ambos modelos dan buenos resultados y pueden usarse para resolver el problema de determinar el idioma en diferentes dominios. Su principal ventaja es la alta velocidad, lo que hace posible crear un llamado "conjunto" y agregar el preprocesamiento necesario para mejorar la calidad.


Puede encontrar todo el código para reproducir experimentos y probar los enfoques anteriores en nuestro repositorio .


También puede ver las pruebas de estas soluciones en otro artículo , que compara la precisión y la velocidad en 6 idiomas de Europa occidental.

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


All Articles