Este punto de referencia experimental compara diferentes formas de representar las palabras en una tarea simplificada de construir el modelo de lenguaje llamado SO.
El modelo de lenguaje es una forma de calcular la probabilidad de un fragmento dado del texto (cadena de palabras). NLP previamente utilizó varias opciones para construir LM basadas en el recuento de N-gramos y suavizado (suavizado) para compensar la descarga de los N gramos de arcos grandes. Por ejemplo, NLTK tiene la implementación del método KNESER-REY. También hay una gran cantidad de implementaciones diferentes que difieren en los detalles técnicos sobre el almacenamiento de grandes volúmenes de información de N-Gramer y la velocidad del procesamiento de texto, por ejemplo https://github.com/kpu/kenlm.
En los últimos años, diferentes opciones para modelos de lenguaje neuronal (NLMS) han recibido un uso generalizado, que utilizan diversas arquitecturas neuroSoteales, incluidas las recurrentes y el brillo. NLM se puede dividir en dos grupos: trabajar en el nivel de palabras (NLM con consumo de palabras) y en el nivel de caracteres (NLM de caracteres). La segunda opción es especialmente interesante porque permite que el modelo funcione con morfemas . Esto es extremadamente significativo para los idiomas con una rica morfología. Para algunas palabras, cientos de formas gramaticales pueden existir potencialmente, como en el caso de los adjetivos en el idioma ruso. Incluso un caso de texto muy grande no garantiza que todos los formularios de variantes de palabras se incluirán en el vocabulario para NLM con conocimiento de palabras. Por otro lado, las estructuras morfémicas casi siempre obedecen las reglas regulares, por lo que el conocimiento de la base o la forma básica de la palabra le permite generar sus opciones gramaticales y semánticas: en negrita, audaz, mordida, audaz, etc., así como determinar la conexión semántica entre las mismas palabras arraigadas, incluso si las palabras correspondientes están arraigadas por la primera vez y las estadísticas en su contexto de su uso no se conocen. El último comentario se vuelve muy importante para los campos de PNL con una formación de palabras dinámicas, en primer lugar, es todo tipo de redes sociales.
Dentro del marco del punto de referencia, todo el código necesario se ha preparado para estudiar y comparar ambas opciones NLM, junto con otros métodos para construir LM-Charate-consecuente y consciente de palabras.
Simplificaremos un poco nuestro modelo de Langage, estableciendo la tarea en este formulario. Hay un n-gramo de longitud preseleccionada (consulte la constante NGRAM_ORDER en el módulo de vectores de datos). Si se obtiene del caso de texto (la ruta al archivo UTF-8 pegado se cose en el _get_corpus_path class BaseVectorizer), entonces creemos que esta es una combinación válida de las palabras y el valor objetivo y = 1. Si el N-gram se obtiene mediante una reemplazo aleatorio de una de las palabras y tal cadena no se encuentra en el caso, entonces el valor objetivo es y es Y 0.
Se generan N-Grams inaceptables durante el análisis del caso en la misma cantidad que válida. Resulta un conjunto de datos equilibrado, que facilita la tarea. Y la falta de la necesidad de marcas manuales le permite "jugar" fácilmente con un parámetro como el número de registros en el conjunto de datos de capacitación.
Por lo tanto, se resuelve el problema de clasificación binaria. El clasificador será la implementación del gradiente que aumenta XGBOost y la red neuronal, implementada en Keras, así como varias otras opciones en diferentes lenguajes de programación y marcos DL.
El objeto del estudio es la influencia del método de representar las palabras en la matriz de entrada X en la precisión de la clasificación.
Se puede encontrar un análisis detallado de varios enfoques para la PNL, incluso para tareas similares, en el artículo: un imprimador en los modelos de redes neuronales para el procesamiento del lenguaje natural.
Las siguientes opciones se verifican para xgboost:
W2V - Usamos la palabra núcleo capacitada 2vec, pegando palabras de palabras en un vector largo
W2V_TAGS - Expansión de la representación W2V, se obtienen categorías adicionales del vector final de etiquetas morfológicas de palabras. Resulta algo como el modelo de lenguaje factorizado
SDR - Palabras de representaciones distribuidas dispersas obtenidas por la factorización del modelo Word2Vector
Random_BitVector : cada palabra se atribuye a un vector de longitud fija binaria aleatoria con una proporción dada de 0/1
BC : los vectores creados como resultado del trabajo de la agrupación Brown (ver Descripción https://en.wikipedia.org/wiki/bron_clustering y la implementación https://github.com/percyliang/brunki) se usan como resultado
Chars : cada palabra está codificada como una cadena de 1 -representación de símbolos
Hashing_trick : utilizado truco de hashing para codificar palabras con un número limitado de bits de índice (ver Descripción https://en.wikipedia.org/wiki/feature_hashing e implementación https://radimrehurek.com/gensim/corpera/hashdicionary.html)
AE : las palabras de palabras se obtienen como activación en la capa interna del autoencoder. El entrenamiento en el autoencoder y la obtención de vectores de palabras se realiza mediante el script Word_autoencoder3.py en la carpeta Pymodels/WordAutoCoders.
Hay dos métodos de presentación adicionales disponibles para las redes neuronales, que se convierten en cierta representación vectorial utilizando la capa de incrustación (o similar a la biblioteca usada utilizada.
Word_indeces : se compila un vocabulario, a cada palabra se le asigna un índice entero único. Por lo tanto, el 3 grado parece ser un triple de enteros.
Char_indeces : se compila un alfabeto, a cada símbolo se le asigna un índice entero único. Además, las cadenas de los índices de símbolos se complementan con un índice de muestra a la misma longitud (la longitud máxima de la palabra), y la cadena resultante de índices de símbolos se devuelve como la presentación del N-gram. Usando una capa de incrustación (incrustación en keras o similar), los símbolos se convierten en una forma vectorial densa con la que funciona el resto de la red neuronal. Resulta que la versión del modelo de lenguaje neuronal consciente de los personajes.
Para resolver el problema, se utilizaron varias bibliotecas de aprendizaje automático, redes neuronales y bibliotecas para la computación de matriz, que incluyen:
Keras (con Theano Backend)
Lasaña (theano)
Nolearn (theano)
Flujo tensor
Soluciones de Python:
Pymodels/wr_xgboost.py - resolución sobre la base de xgboost
Pymodels/wr_catboost.py - Catboost Resolución en palabras índices utilizando la capacidad de indicar índices de características categóricas en el conjunto de datos para que el refuerzo los aprenda independientemente durante el entrenamiento
Pymodels/wr_keras.py: un resolución basado en neurosettes de alimentación implementadas en keras
Pymodels/WR_KERAS_SDR2.PY: una solución separada para verificar la representación distribuida dispersa de una gran dimensión (de 1024) con una generación por parte de matrices para el aprendizaje y la validación, en Keras. Pymodels/wr_lasagne.py: un resolución basado en las neurosettes de alimentación implementadas en lasaña (theano)
Pymodels/wr_nolearn.py: un resolución basado en las neurosettes de alimentación implementadas en Nolearn+Lasaña (theano)
Pymodels/wr_tensorflow.py: un solucionador basado en las neurosettes alimentadas de avance implementadas en TensorFlow
Soluciones en C#:
Csharpmodels/withaccordnet/programa.cs: un resolución basado en las cuadrículas Feed Forwards Accord.net (C#, proyecto para VS 2015)
CsharpModels/MyBaseline/Program.cs - Solución basada en mi implementación Vanilla MLP (C#, proyecto para VS 2015)
Soluciones en C ++:
Cxxmodels/tinydnn_model/tinydn_model.cpp - resolución MLP, implementada por la biblioteca Tiny -DNN (C ++, proyecto para VS 2015)
CXXMODELS/SINGA_MODEL/ALEXNET.CC - Un resolución sobre la base de una red neuronal implementada por Apache.singa (C ++, proyecto para VS 2015)
CXXMODELS/OPERNN_MODEL/MAIN.CPP - Un resolución basado en una Neuroset, implementada por OpenNN (C ++, proyecto para VS 2015)
Soluciones en java javamodels/with4j/src/main/java/wordDrrepresentationStest.java - MLP Resolver, implementado por Deeplearning4J Library
Clases y herramientas internas:
Pymodels/CorpusReaders.py - Clases para leer líneas de edificios de texto de diferentes formatos (con cremallos | Plain txt) Pymodels/DataSetVectorizers.py - Vectorizadores de conjunto de datos y fábrica para una opción conveniente para una opción conveniente
Pymodels/store_dataset_file.py - Generación del conjunto de datos y su preservación para los modelos C# y C ++
Para las redes neuronales, se implementaron 2 arquitectos sobre la base de Keras. MLP es un simple nefete de alimentación con capas completa. Convnet es una malla que usa capas de paquete.
El cambio de arquitecturas es realizada por Net_arch en el parámetro Net_arch en el archivo wr_keras.py.
Cabe señalar que la opción Bristly a menudo ofrece una solución más precisa, pero los modelos correspondientes tienen una variante más grande, en pocas palabras, la precisión final aumenta en gran medida para varios modelos con los mismos parámetros.
Aquí se puede encontrar una descripción detallada de la arquitectura y los resultados numéricos de los experimentos: https://kelijah.liveJournal.com/224925.html.
Todas las opciones de referencia usan un archivo de texto en la codificación UTF-8 para recibir listas N-Gram. Se supone que la división del texto en palabras y trayendo al registro inferior se realiza por adelantado en un tercer código de fiesta. Por lo tanto, los scripts leen líneas de este archivo, rompas en palabras por espacios.
Para la comodidad de jugar experimentos, coloqué una exposición comprimida de una caja grande con un tamaño de 100 mil líneas en la carpeta de datos. Esto es suficiente para repetir todas las medidas. Para no sobrecargar el repositorio con un archivo grande, se pica. El método BaseVectorizer._load_ngrams desempaquetó su contenido sobre la mosca, por lo que no necesita hacer ninguna manipulación manual.
En la variante de vectorización de W2V_TAGS, las características morfológicas se agregan a las venas W2V. Estos signos para cada palabra se toman del archivo Word2tags_bin.zip en el subcatal de datos, que se obtiene mediante la conversión de mi diccionario gramatical (http://solarix.ru/sql-dictionary-sdk.shtml). El resultado de la conversión se basa en 165 MB, que es demasiado para el repositorio de GIT. Por lo tanto, grité el archivo resultante del diccionario gramatical, y la clase correspondiente de vectorización del conjunto de datos en sí lo desempacé sobre la marcha durante la operación.
Tenga en cuenta que debido a la homonimia de las formas gramaticales, muchas palabras tienen más de un conjunto de etiquetas. Por ejemplo, la palabra 'osos' puede ser una forma de un solo o plural, respectivamente, en un caso genitivo o nominativo. Al formar etiquetas para palabras, combino etiquetas de homónimos.
Se utiliza un proceso de dos etapas. Primero obtenemos vectores de palabras W2V. Un pequeño script en Python descarga vectores en un archivo de texto en formato CSV.
Luego, utilizando la utilidad https://github.com/mfaruqui/sparse-coding, se realiza un comando:
./nonneg.o input_vectors.txt 16 0.2 1e-5 4 out_vecs.txt
El archivo out_vecs.txt que contiene palabras SDR con los parámetros indicados se genera: size = 16*vector w2v, relleno = 0.2 Este archivo se carga con la clase SDR_Vectorizer.
https://habrahabr.ru/post/335838/
http://kelijah.livejournal.com/217608.html
Como cheque, utilizamos la memorización de los N-Grams del conjunto de capacitación y la búsqueda entre los N-Grams recordados para el conjunto de pruebas. El pequeño tamaño del conjunto de entrenamiento conduce al hecho de que en el conjunto de pruebas, el modelo se comporta simplemente como un adivinador aleatorio, dando una precisión de 0.50.
La tabla principal de los resultados está disponible en el enlace. El resto de los siguientes resultados se obtuvieron para un conjunto de 1.000,000 3 gramos.
Para un resolución sobre la base de xgboost (wr_xgboost.py), se obtuvieron los siguientes resultados.
Para un conjunto de datos que contiene 1.000,000 trigramas: W2V_TAGS (Word2Vector + Morph Tags) ==> 0.81
W2v (word2Vector dim = 32) ==> 0.80
SDR (Distribuido disperso representa, longitud 512, 20% de unidades) ==> 0.78 a. C. (agrupación marrón) ==> 0.70
Chars (codificación de un solo estado) ==> 0.71
Random_BitVector (vectores de bits aleatorios, participación de unidades 16%) ==> 0.696
Hashing_trick (truco de hashing con 32,000 ranuras) ==> 0.64
Para un solucionador basado en Lasaña MLP:
Precisión = 0.71
Para un solucionador basado en Nolearn+Lasaña MLP:
Precisión = 0.64
Para un resolución basado en Tiny-DNN MLP:
Precisión = 0.58
Para un solucionador basado en la red neuronal de Feed.net Feed.net:
Word2Vector ==> 0.68
Para una resolución de Catboost sobre las características categóricas del "índice de palabras":
Precisión = 0.50
Para un solucionador basado en Apache.singa MLP:
Precisión = 0.74
Solución de línea de base: memorización de N -grams del conjunto de datos de capacitación
Precisión = 0.50