Un paquete de Python repleto de características y formato de archivo de almacenamiento vectorial para utilizar incrustaciones vectoriales en modelos de aprendizaje automático de manera rápida, eficiente y simple desarrollada por la plasticidad. Se pretende principalmente una alternativa más simple / rápida a Gensim, pero puede usarse como una tienda genérica de vectores clave para dominios fuera de la PNL. Ofrece características únicas como búsqueda fuera del vocabulario y la transmisión de modelos grandes a través de HTTP. Publicado en nuestro artículo en EMNLP 2018 y disponible en ARXIV.
Puede instalar este paquete con pip :
pip install pymagnitude # Python 2.7
pip3 install pymagnitude # Python 3Google Colaboratory tiene algunos problemas de dependencia con la instalación de magnitud debido a dependencias conflictivas. Puede usar el siguiente fragmento para instalar magnitud en Google Colaboratory:
# Install Magnitude on Google Colab
! echo " Installing Magnitude.... (please wait, can take a while) "
! (curl https://raw.githubusercontent.com/plasticityai/magnitude/master/install-colab.sh | /bin/bash 1> /dev/null 2> /dev/null)
! echo " Done installing Magnitude. " Los modelos de incrustación del espacio vectorial se han vuelto cada vez más comunes en el aprendizaje automático y tradicionalmente han sido populares para las aplicaciones de procesamiento del lenguaje natural. Falta una herramienta rápida y liviana para consumir estos modelos de incrustación de espacio vectorial grande.
El formato de archivo de magnitud ( .magnitude ) para los incrustaciones de vectores está destinado a ser un formato de incrustación de vector universal más eficiente que permite la carga perezosa para los inicios de frío más rápido en el desarrollo, el almacenamiento en caché de la memoria de LRU para el rendimiento en la producción, múltiples consultas clave de la clave para las entradas para una red neural, los cálculos de la similiaridad de rendimiento y otras cosas que tienen casos de ventajas como el borde de las llaves o los casos de Keys de Keys. claves mal escritas y concatenando múltiples modelos de vectores juntos. También está destinado a funcionar con modelos vectoriales grandes que pueden no caber en la memoria.
Utiliza SQLite, una base de datos incrustada rápida y popular, como su almacén de datos subyacente. Utiliza índices para búsquedas de clave rápida, así como utiliza mapeo de memoria, instrucciones SIMD e indexación espacial para una búsqueda rápida de similitud en el espacio de vector fuera del disco con buen rendimiento de la memoria incluso entre múltiples procesos. Además, los mapas de memoria se almacenan en caché entre las ejecuciones, por lo que incluso después de cerrar un proceso, se cosechan mejoras de velocidad.
| Métrico | Luz de magnitud | Medio de magnitud | Magnitud pesada | Corriente de magnitud |
|---|---|---|---|---|
| Tiempo de carga inicial | 0.7210s | ━ 1 | ━ 1 | 7.7550s |
| Consulta de llave única fría | 0.0001s | ━ 1 | ━ 1 | 1.6437s |
| Consulta de llave única cálida (misma clave que la consulta fría) | 0.00004S | ━ 1 | ━ 1 | 0.0004s |
| Consulta de clave múltiple fría (n = 25) | 0.0442s | ━ 1 | ━ 1 | 1.7753S |
| Consulta de llave múltiple caliente (n = 25) (las mismas claves que la consulta fría) | 0.00004S | ━ 1 | ━ 1 | 0.0001s |
Primera consulta de búsqueda most_similar(n = 10) (peor de los casos) | 247.05S | ━ 1 | ━ 1 | - |
Primera consulta de búsqueda most_similar(n = 10) (caso promedio) (w/ disco de caché persistente) | 1.8217s | ━ 1 | ━ 1 | - |
Búsqueda más posterior most_similar(n = 10) (clave diferente a la primera consulta) | 0.2434s | ━ 1 | ━ 1 | - |
Caliente búsqueda most_similar posterior_similar(n = 10) (la misma clave que la primera consulta) | 0.00004S | 0.00004S | 0.00004S | - |
Primero most_similar_approx Consultor de búsqueda(n = 10, esfuerzo = 1.0) (peor de los casos) | N / A | N / A | 29.610S | - |
Primero most_similar_approx Consultor de búsqueda(n = 10, esfuerzo = 1.0) (caso promedio) (con caché persistente del disco) | N / A | N / A | 0.9155s | - |
Posterior búsqueda most_similar_approx(n = 10, esfuerzo = 1.0) (clave diferente a la primera consulta) | N / A | N / A | 0.1873S | - |
Posterior búsqueda most_similar_approx(n = 10, esfuerzo = 0.1) (clave diferente a la primera consulta) | N / A | N / A | 0.0199s | - |
Search más posterior most_similar_approx medios(n = 10, esfuerzo = 1.0) (la misma clave que la primera consulta) | N / A | N / A | 0.00004S | - |
| Tamaño de archivo | 4.21GB | 5.29GB | 10.74GB | 0.00GB |
| Utilización de la memoria del proceso (RAM) | 18 kb | ━ 1 | ━ 1 | 1.71 MB |
| Utilización de la memoria de proceso (RAM) después de 100 consultas clave | 168 kb | ━ 1 | ━ 1 | 1.91 MB |
| Utilización de la memoria de proceso (RAM) Después de 100 consultas clave + búsqueda de similitud | 342kb 2 | ━ 1 | ━ 1 | |
| Verificaciones y pruebas de integridad | ✅ | ✅ | ✅ | ✅ |
Formato universal entre word2vec ( .txt , .bin ), guante ( .txt ), fastText ( .vec ) y elmo ( .hdf5 ) con utilidad convertidor | ✅ | ✅ | ✅ | ✅ |
| Interfaz simple y pitónica | ✅ | ✅ | ✅ | ✅ |
| Pocas dependencias | ✅ | ✅ | ✅ | ✅ |
| Soporte para modelos de memoria más grandes que la memoria | ✅ | ✅ | ✅ | ✅ |
| Carga perezosa siempre que sea posible para la velocidad y el rendimiento | ✅ | ✅ | ✅ | ✅ |
Optimizado para threading y multiprocessing | ✅ | ✅ | ✅ | ✅ |
| Busca a granel y múltiples clave con relleno, truncamiento, marcador de posición y soporte de caracterización | ✅ | ✅ | ✅ | ✅ |
| Concatenting múltiples modelos de vectores juntos | ✅ | ✅ | ✅ | ✅ |
| Búsqueda básica fuera del vocabulario (Habor de características de carácter n-gram) | ✅ | ✅ | ✅ | ✅ |
| Búsqueda llave fuera de invocabulario avanzada con soporte para maletines (Carácter N-Gram característico de hashing a claves similares en vocabulario) | ✅ | ✅ | ✅ | |
| La búsqueda más similar de la búsqueda más similar con un índice de molestia | ✅ | ✅ | ||
| Entrenamiento incorporado para nuevos modelos |
1: mismo valor que la columna anterior
2: usa mmap para leer desde el disco, por lo que el sistema operativo aún asignará páginas de memoria cuando la memoria esté disponible, pero se puede compartir entre los procesos y no se administra dentro de cada proceso para archivos extremadamente grandes, lo que es una victoria de rendimiento
*: Todos los puntos de referencia se realizaron en los vectores de palabras previamente capacitados de Google News ( GoogleNews-vectors-negative300.bin ) con un MacBook Pro (Retina, 15 pulgadas, mediados de 2014) 2.2GHz de cuatro núcleos Intel Core i7 @ 16GB RAM en SSD sobre un promedio de ensayos en las que viables.
Los modelos de incrustación populares se han convertido previamente al formato .magnitude para la descarga y uso de inmudos:
| Contribuyente | Datos | Luz (Soporte básico para claves fuera del vocabulario) | Medio (recomendado) (Soporte avanzado para claves fuera del vocabulario) | Pesado (Soporte avanzado para claves fuera del vocabulario y más rápido most_similar_approx ) |
|---|---|---|---|---|
| Google - Word2Vec | Google News 100B | 300D | 300D | 300D |
| Stanford - Glove | Wikipedia 2014 + Gigaword 5 6B | 50d, 100d, 200d, 300d | 50d, 100d, 200d, 300d | 50d, 100d, 200d, 300d |
| Stanford - Glove | Wikipedia 2014 + Gigaword 5 6B (Lemmatizado por la plasticidad) | 50d, 100d, 200d, 300d | 50d, 100d, 200d, 300d | 50d, 100d, 200d, 300d |
| Stanford - Glove | Crawl común 840b | 300D | 300D | 300D |
| Stanford - Glove | Twitter 27b | 25d, 50d, 100d, 200d | 25d, 50d, 100d, 200d | 25d, 50d, 100d, 200d |
| Facebook - FastText | Inglés Wikipedia 2017 16B | 300D | 300D | 300D |
| Facebook - FastText | Inglés Wikipedia 2017 + Sub Palabra 16B | 300D | 300D | 300D |
| Facebook - FastText | Crawl común 600B | 300D | 300D | 300D |
| AI2 - Allennlp Elmo | Modelos de elmo | Modelos de elmo | Modelos de elmo | Modelos de elmo |
| Google - Bert | Muy pronto... | Muy pronto... | Muy pronto... | Muy pronto... |
Hay instrucciones a continuación para convertir cualquier archivo .bin , .txt , .vec , .hdf5 a un archivo .magnitude .
Puede crear un objeto de magnitud como así:
from pymagnitude import *
vectors = Magnitude ( "/path/to/vectors.magnitude" ) Si es necesario, y se incluye por conveniencia, también puede abrir un archivo .bin , .txt , .vec , .hdf5 directamente con magnitud. Sin embargo, esto es menos eficiente y muy lento para los modelos grandes, ya que convertirá el archivo en un archivo .magnitude en la primera ejecución con un directorio temporal. El directorio temporal no está garantizado que persista y no persista cuando su computadora se reinicia. Debe preconvertir .bin , .txt , .vec , .hdf5 archivos con python -m pymagnitude.converter típicamente para velocidades más rápidas, pero esta característica es útil para casos de uso únicos. Se generará una advertencia al instanciar un objeto de magnitud directamente con un .bin , .txt , .vec , .hdf5 . Puede suprimir advertencias estableciendo el argumento supress_warnings en el constructor a True .
lazy_loading al constructor con el valor -1 para deshabilitar la carga perezosa y precarga todos los vectores en la memoria (a la gensim), 0 (predeterminado X para habilitar la carga perezosa con un cache lru sin problemas que usan el vectores X más recientemente.most_similar sean precargadas con entusiasmo en la inicialización, establecido eager por True .lazy_loading se establece en -1 o eager , se establece en los datos True , se cargará en la memoria en un hilo de fondo para evitar que el constructor bloquee durante unos minutos para modelos grandes. Si realmente quieres un comportamiento de bloqueo, puedes pasar True al argumento blocking .normalized en False si desea recibir los vectores no normalizados en bruto.use_numpy en False si desea recibir listas de Python en su lugar.case_insensitive a True si desea realizar búsquedas insensibles a casos.pad_to_length que especificará la longitud que todos los ejemplos deben estar acolchados si pasan en ejemplos múltiples. Cualquier ejemplo que sea más largo que la longitud de la almohadilla se truncará.truncate_left en True si desea que el comienzo de la lista de claves en cada ejemplo se trunce en lugar del final en caso de que sea más largo que pad_to_length cuando se especifique.pad_left en True si desea que el relleno aparezca al principio versus el final (que es el valor predeterminado).placeholders , lo que aumentará las dimensiones de cada vector por el monto de los placeholders , pisando cero esas dimensiones adicionales. Esto es útil, si planea agregar otros valores e información a los vectores y desea el espacio para eso prealocado en los vectores para obtener eficiencia.language con un código de idioma ISO 639-1, que, si está utilizando la magnitud para los vectores de palabras, se asegurará de que la biblioteca respeta las derivaciones y otras características específicas del idioma para ese idioma. El valor predeterminado es en para inglés. También puede pasar None si no está utilizando magnitud para vectores de palabras.dtype que le permitirá controlar el tipo de datos de las matrices numpy devueltas por magnitud.devices que le permitirá controlar el uso de GPU cuando los modelos subyacentes admiten el uso de GPU. Este argumento debe ser una lista de enteros, donde cada entero representa el número de dispositivo GPU ( 0 , 1 , etc.).temp_dir que le permitirá controlar la ubicación de la magnitud del directorio temporal.log que tendrá un progreso del registro de magnitud al error estándar cuando se realizan operaciones lentas.Puede consultar el número total de vectores en el archivo como así:
len ( vectors )Puede consultar las dimensiones de los vectores como así:
vectors . dimPuede verificar si una clave está en el vocabulario como así:
"cat" in vectorsPuede iterar a través de todas las teclas y vectores como así:
for key , vector in vectors :
...Puede consultar el vector de una llave como así:
vectors . query ( "cat" )Puede indexar para la clave N-th y el vector como así:
vectors [ 42 ]Puede consultar el vector de múltiples claves como así:
vectors . query ([ "I" , "read" , "a" , "book" ])Se devolverá una matriz 2D (claves de vectores).
Puede consultar el vector de múltiples ejemplos como así:
vectors . query ([[ "I" , "read" , "a" , "book" ], [ "I" , "read" , "a" , "magazine" ]]) Se devolverá una matriz 3D (ejemplos de claves de vectores). Si no se especifica pad_to_length , y el tamaño de cada ejemplo es desigual, se acolcharán a la longitud del ejemplo más largo.
Puede indexar las teclas y vectores de múltiples índices como así:
vectors [: 42 ] # slice notation
vectors [ 42 , 1337 , 2001 ] # tuple notationPuede consultar la distancia de dos o múltiples teclas como así:
vectors . distance ( "cat" , "dog" )
vectors . distance ( "cat" , [ "dog" , "tiger" ])Puede consultar la similitud de dos o múltiples claves como así:
vectors . similarity ( "cat" , "dog" )
vectors . similarity ( "cat" , [ "dog" , "tiger" ])Puede consultar la clave más similar de una lista de claves para una clave determinada como así:
vectors . most_similar_to_given ( "cat" , [ "dog" , "television" , "laptop" ]) # dogPuede consultar sobre qué clave no coincide con una lista de claves para una clave determinada como así:
vectors . doesnt_match ([ "breakfast" , "cereal" , "dinner" , "lunch" ]) # cerealPuede consultar las claves más similares (vecinos más cercanos) como así:
vectors . most_similar ( "cat" , topn = 100 ) # Most similar by key
vectors . most_similar ( vectors . query ( "cat" ), topn = 100 ) # Most similar by vector Opcionalmente, puede pasar un argumento min_similarity a most_similar . Los valores de [-1.0-1.0] son válidos.
También puede consultar las claves más similares que dan ejemplos positivos y negativos (que, por cierto, resuelven analogías) como así:
vectors . most_similar ( positive = [ "woman" , "king" ], negative = [ "man" ]) # queen Similar a vectors.most_similar , existe una función vectors.most_similar_cosmul que utiliza la función 3Cosmul de Levy y Goldberg:
vectors . most_similar_cosmul ( positive = [ "woman" , "king" ], negative = [ "man" ]) # queenTambién puede consultar las teclas más similares utilizando un índice de vecinos más cercanos aproximados que es mucho más rápido, pero no garantiza la respuesta exacta:
vectors . most_similar_approx ( "cat" )
vectors . most_similar_approx ( positive = [ "woman" , "king" ], negative = [ "man" ]) Opcionalmente, puede aprobar un argumento effort con los valores entre [0.0-1.0] a la función most_similar_approx que le dará la compensación de tiempo de ejecución. El valor predeterminado para effort es 1.0, lo que llevará más tiempo, pero dará el resultado más preciso.
Puede consultar para todas las teclas más cercanas a una clave que otra clave es así:
vectors . closer_than ( "cat" , "rabbit" ) # ["dog", ...] Puede acceder a todos los vectores numpy.memmap en el modelo en una gran matriz de tamaño ( len(vectors) x vectors.emb_dim .
vectors . get_vectors_mmap ()Puede limpiar todos los recursos asociados, abrir archivos y conexiones de bases de datos como así:
vectors . close ()Para las representaciones de Word Vector, el manejo de claves fuera del vocabulario es importante para manejar nuevas palabras que no sean en el modelo entrenado, manejando errores y errores tipográficos, y hacer que los modelos entrenados en las representaciones de la palabra vectores sean más robustas en general.
Las claves fuera de vocabulario se manejan asignándoles un valor vectorial aleatorio. Sin embargo, la aleatoriedad es determinista. Entonces, si se encuentra la misma clave fuera del vocabulario dos veces, se le asignará el mismo valor vectorial aleatorio en aras de poder entrenar en esas claves fuera del vocabulario. Además, si dos claves fuera del vocabulario comparten n-gramos de carácter similares ("Uberx", "Uberxl"), se colocarán entre sí, incluso si ambos no están en el vocabulario:
vectors = Magnitude ( "/path/to/GoogleNews-vectors-negative300.magnitude" )
"uberx" in vectors # False
"uberxl" in vectors # False
vectors . query ( "uberx" ) # array([ 5.07109939e-02, -7.08248823e-02, -2.74812328e-02, ... ])
vectors . query ( "uberxl" ) # array([ 0.04734962, -0.08237578, -0.0333479, -0.00229564, ... ])
vectors . similarity ( "uberx" , "uberxl" ) # 0.955000000200815Si se usa un archivo de magnitud con soporte avanzado fuera del vocabulario (medio o pesado), las teclas fuera del vocabulario también se incrustarán cerca de teclas similares (determinadas por similitud de cadena) que están en el vocabulario:
vectors = Magnitude ( "/path/to/GoogleNews-vectors-negative300.magnitude" )
"uberx" in vectors # False
"uberification" in vectors # False
"uber" in vectors # True
vectors . similarity ( "uberx" , "uber" ) # 0.7383483267618451
vectors . similarity ( "uberification" , "uber" ) # 0.745452837882727 Esto también hace que la magnitud sea robusta para muchos errores de ortografía:
vectors = Magnitude ( "/path/to/GoogleNews-vectors-negative300.magnitude" )
"missispi" in vectors # False
vectors . similarity ( "missispi" , "mississippi" ) # 0.35961736624824003
"discrimnatory" in vectors # False
vectors . similarity ( "discrimnatory" , "discriminatory" ) # 0.8309152561753461
"hiiiiiiiiii" in vectors # False
vectors . similarity ( "hiiiiiiiiii" , "hi" ) # 0.7069775034853861Los N-Grams de carácter se utilizan para crear este efecto para las teclas fuera del vocabulario. La inspiración para esta característica fue tomada de los vectores de palabras enriquecedoras de Facebook AI Research con información de subvenciones, pero en lugar de utilizar N-Grams de carácter en el tiempo de tren, los N-Grams de carácter se usan con inferencia para que el efecto pueda replicarse algo (pero no perfectamente replicados) en modelos más antiguos que no se entrenaron con N-Grams de carácter como Word2Vec y Glove.
Opcionalmente, puede combinar vectores de múltiples modelos para alimentar información más fuerte en un modelo de aprendizaje automático como así:
from pymagnitude import *
word2vec = Magnitude ( "/path/to/GoogleNews-vectors-negative300.magnitude" )
glove = Magnitude ( "/path/to/glove.6B.50d.magnitude" )
vectors = Magnitude ( word2vec , glove ) # concatenate word2vec with glove
vectors . query ( "cat" ) # returns 350-dimensional NumPy array ('cat' from word2vec concatenated with 'cat' from glove)
vectors . query (( "cat" , "cats" )) # returns 350-dimensional NumPy array ('cat' from word2vec concatenated with 'cats' from glove)Puede concatenar más de dos modelos vectoriales, simplemente pasando más argumentos al constructor.
Puede crear automáticamente vectores a partir de funciones adicionales que pueda tener, como partes del habla, información de dependencia de sintaxis o cualquier otra información utilizando la clase FeaturizerMagnitude :
from pymagnitude import *
pos_vectors = FeaturizerMagnitude ( 100 , namespace = "PartsOfSpeech" )
pos_vectors . dim # 4 - number of dims automatically determined by Magnitude from 100
pos_vectors . query ( "NN" ) # - array([ 0.08040417, -0.71705252, 0.61228951, 0.32322192])
pos_vectors . query ( "JJ" ) # - array([-0.11681135, 0.10259253, 0.8841201 , -0.44063763])
pos_vectors . query ( "NN" ) # - array([ 0.08040417, -0.71705252, 0.61228951, 0.32322192]) (deterministic hashing so the same value is returned every time for the same key)
dependency_vectors = FeaturizerMagnitude ( 100 , namespace = "SyntaxDependencies" )
dependency_vectors . dim # 4 - number of dims automatically determined by Magnitude from 100
dependency_vectors . query ( "nsubj" ) # - array([-0.81043793, 0.55401352, -0.10838071, 0.15656626])
dependency_vectors . query ( "prep" ) # - array([-0.30862918, -0.44487267, -0.0054573 , -0.84071788])La magnitud utilizará el truco de hashing de la función internamente para usar directamente el hash del valor de la función para crear un vector único para ese valor de característica.
El primer argumento a FeaturizerMagnitude debe ser un límite superior aproximado en el número de valores para la característica. Dado que hay <100 partes de etiquetas de voz y <100 dependencias de sintaxis, elegimos 100 para ambas en el ejemplo anterior. El valor elegido determinará cuántas dimensiones la magnitud asignará automáticamente al objeto particular FeaturizerMagnitude para reducir la posibilidad de una colisión hash. El argumento namespace puede ser cualquier cadena que describa su característica adicional. Es opcional, pero muy recomendable.
Luego puede concatenar estas características para su uso con un objeto de magnitud estándar:
from pymagnitude import *
word2vec = Magnitude ( "/path/to/GoogleNews-vectors-negative300.magnitude" )
pos_vectors = FeaturizerMagnitude ( 100 , namespace = "PartsOfSpeech" )
dependency_vectors = FeaturizerMagnitude ( 100 , namespace = "SyntaxDependencies" )
vectors = Magnitude ( word2vec , pos_vectors , dependency_vectors ) # concatenate word2vec with pos and dependencies
vectors . query ([
( "I" , "PRP" , "nsubj" ),
( "saw" , "VBD" , "ROOT" ),
( "a" , "DT" , "det" ),
( "cat" , "NN" , "dobj" ),
( "." , "." , "punct" )
]) # array of size 5 x (300 + 4 + 4) or 5 x 308
# Or get a unique vector for every 'buffalo' in:
# "Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo"
# (https://en.wikipedia.org/wiki/Buffalo_buffalo_Buffalo_buffalo_buffalo_buffalo_Buffalo_buffalo)
vectors . query ([
( "Buffalo" , "JJ" , "amod" ),
( "buffalo" , "NNS" , "nsubj" ),
( "Buffalo" , "JJ" , "amod" ),
( "buffalo" , "NNS" , "nsubj" ),
( "buffalo" , "VBP" , "rcmod" ),
( "buffalo" , "VB" , "ROOT" ),
( "Buffalo" , "JJ" , "amod" ),
( "buffalo" , "NNS" , "dobj" )
]) # array of size 8 x (300 + 4 + 4) or 8 x 308Un modelo de aprendizaje automático, dado esta salida, ahora tiene acceso a partes de la información del habla y la información de dependencia de la sintaxis en lugar de solo información de Vector de palabras. En este caso, esta información adicional puede brindar a las redes neuronales una señal más fuerte para información semántica y reducir la necesidad de datos de capacitación.
La magnitud hace que sea muy fácil construir e iterar rápidamente en los modelos que necesitan usar representaciones vectoriales atendiendo un montón de código de preprocesamiento para convertir un conjunto de datos de texto (o claves) en vectores. Además, puede hacer que estos modelos sean más robustos para las palabras y ortográficos fuera del vocabulario.
Hay un código de ejemplo disponible utilizando la magnitud para construir un modelo de clasificación de intención para el conjunto de datos ATIS (Sistemas de información de viajes de la aerolínea) (tren/prueba), utilizado para chatbots o interfaces conversacionales, en algunas bibliotecas populares de aprendizaje automático a continuación.
Puede acceder a una guía para usar la magnitud con keras (que admite TensorFlow, Theo, CNTK) en este cuaderno de Python Colaboratory de Google.
La guía de Pytorch llegará pronto.
La guía TFLearn llegará pronto.
Puede usar la clase MagnitudeUtils para un acceso conveniente a funciones que pueden ser útiles al crear modelos de aprendizaje automático.
Puede importar magnitudutilos como así:
from pymagnitude import MagnitudeUtilsPuede descargar un modelo de magnitud desde una fuente remota como así:
vecs = Magnitude ( MagnitudeUtils . download_model ( 'word2vec/heavy/GoogleNews-vectors-negative300' )) Por defecto, download_model descargará archivos de http://magnitude.plasticity.ai a una carpeta ~/.magnitude creada automáticamente. Si el archivo ya se ha descargado, no se descargará nuevamente. Puede cambiar el directorio de la carpeta de descarga local utilizando el argumento opcional download_dir . Puede cambiar el dominio desde el que se descargará los modelos con el argumento opcional remote_path .
Puede crear un generador de lotes para datos X e y con batchify , como así:
X = [ .3 , .2 , .7 , .8 , .1 ]
y = [ 0 , 0 , 1 , 1 , 0 ]
batch_gen = MagnitudeUtils . batchify ( X , y , 2 )
for X_batch , y_batch in batch_gen :
print ( X_batch , y_batch )
# Returns:
# 1st loop: X_batch = [.3, .2], y_batch = [0, 0]
# 2nd loop: X_batch = [.7, .8], y_batch = [1, 1]
# 3rd loop: X_batch = [.1], y_batch = [0]
# next loop: repeats infinitely... Puede codificar etiquetas de clase a enteros y regresar con class_encoding , como así:
add_class , class_to_int , int_to_class = MagnitudeUtils . class_encoding ()
add_class ( "cat" ) # Returns: 0
add_class ( "dog" ) # Returns: 1
add_class ( "cat" ) # Returns: 0
class_to_int ( "dog" ) # Returns: 1
class_to_int ( "cat" ) # Returns: 0
int_to_class ( 1 ) # Returns: "dog"
int_to_class ( 0 ) # Returns: "cat" Puede convertir datos categóricos con enteros de clase en matrices numpy únicas con to_categorical , como así:
y = [ 1 , 5 , 2 ]
MagnitudeUtils . to_categorical ( y , num_classes = 6 ) # num_classes is optional
# Returns:
# array([[0., 1., 0., 0., 0., 0.]
# [0., 0., 0., 0., 0., 1.]
# [0., 0., 1., 0., 0., 0.]]) Puede convertir de matrices Numpy de un solo calor a una matriz 1D Numpy de Integers de clase con from_categorical , como así:
y_c = [[ 0. , 1. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 1. ]]
MagnitudeUtils . from_categorical ( y_c )
# Returns:
# array([1., 5.]) La biblioteca es segura (utiliza una conexión diferente a la tienda subyacente por hilo), es de solo lectura y nunca se escribe en el archivo. Debido al uso de la memoria de luz, también puede ejecutarlo en múltiples procesos (o usar multiprocessing ) con diferentes espacios de direcciones sin tener que duplicar los datos en memoria como con otras bibliotecas y sin tener que crear una variable compartida de procesamiento múltiple ya que los datos se leen en disco y cada proceso mantiene su propio caché de memoria LRU. Para funciones más pesadas, como most_similar se crea un archivo mapeado de memoria compartido para compartir la memoria entre los procesos.
El paquete de magnitud utiliza el formato de archivo .magnitude en lugar de .bin , .txt , .vec o .hdf5 como con otros modelos vectoriales como Word2Vec, Glove, FastText y Elmo. Hay una utilidad de línea de comandos incluida para convertir archivos Word2Vec, Glove, FastText y Elmo a archivos de magnitud.
Puedes convertirlos así:
python -m pymagnitude.converter -i < PATH TO FILE TO BE CONVERTED > -o < OUTPUT PATH FOR MAGNITUDE FILE >El formato de entrada se determinará automáticamente por la extensión / el contenido del archivo de entrada. Solo debe realizar esta conversión una vez para un modelo. Después de convertir, el formato de archivo de magnitud es estático y no se modificará o escribirá para que el acceso de lectura concurrente sea seguro.
Las banderas para pymagnitude.converter se especifican a continuación:
-h para obtener ayuda y enumerar todas las banderas.-p <PRECISION> para especificar la precisión decimal para retener (seleccionar un número más bajo creará archivos más pequeños). Los valores subyacentes reales se almacenan como enteros en lugar de flotadores, por lo que esto es esencialmente cuantización para huellas de modelo más pequeñas.-a que habilitará el uso de la función most_similar_approx . La bandera -t <TREES> controla el número de árboles en el índice de vecinos más vecinos aproximados (más alto es más preciso) cuando se usa junto con -a indicador (si no se suministra, el número de árboles se determina automáticamente).-s para deshabilitar la adición de información de subvenciones al archivo (que hará que el archivo sea más pequeño), pero deshabilite el soporte de clave fuera de vocabulario avanzado.-v junto con el camino hacia otro archivo de magnitud desde el que le gustaría tomar el vocabulario. Opcionalmente, puede convertir en masa muchos archivos al pasar una carpeta de entrada y una carpeta de salida en lugar de un archivo de entrada y un archivo de salida. Todos los archivos .txt , .bin , .vec , .hdf5 en la carpeta de entrada se convertirán en archivos .magnitude en la carpeta de salida. La carpeta de salida debe existir antes de una operación de conversión masiva.
Puede instruir a la descarga de magnitud y abrir un modelo del repositorio remoto de Magnitude en lugar de una ruta de archivo local. El archivo se descargará automáticamente localmente en la primera ejecución a ~/.magnitude/ y posteriormente omitirá la descarga si el archivo ya existe localmente.
vecs = Magnitude ( 'http://magnitude.plasticity.ai/word2vec/heavy/GoogleNews-vectors-negative300.magnitude' ) # full url
vecs = Magnitude ( 'word2vec/heavy/GoogleNews-vectors-negative300' ) # or, use the shorthand for the url Para obtener más control sobre el dominio de descarga remota y el directorio de descarga local, consulte cómo usar MagnitudeUtils.download_model .
Los modelos de magnitud son generalmente archivos grandes (GB múltiple) que ocupan mucho espacio en disco, a pesar de que el formato .magnitude hace que sea rápido utilizar los vectores. La magnitud tiene la opción de transmitir estos archivos grandes a través de HTTP. Esto es explícitamente diferente de la función de carga remota, ya que el modelo ni siquiera necesita descargarse en absoluto. Puede comenzar a consultar modelos inmediatamente sin espacio en disco utilizado en absoluto.
vecs = Magnitude ( 'http://magnitude.plasticity.ai/word2vec/heavy/GoogleNews-vectors-negative300.magnitude' , stream = True ) # full url
vecs = Magnitude ( 'word2vec/heavy/GoogleNews-vectors-negative300' , stream = True ) # or, use the shorthand for the url
vecs . query ( "king" ) # Returns: the vector for "king" quickly, even with no local model file downloadedPuedes jugar con una demostración de esto en un cuaderno Python de Google Colaboratory.
Esta característica es extremadamente útil si su entorno informático está limitado por los recursos (baja RAM y espacio bajo en disco), desea experimentar rápidamente con vectores sin descargar y configurar archivos de modelo grandes, o está entrenando un modelo pequeño. Si bien hay alguna latencia de red adicional ya que los datos se están transmitiendo, la magnitud aún utilizará un caché en memoria según el parámetro del constructor lazy_loading . Dado que los idiomas generalmente tienen una distribución ZIPF-EIS, la latencia de la red no debe ser en gran medida un problema después de que el caché se calienta después de ser consultado un pequeño número de veces.
Se les consultará directamente de un servidor web estático HTTP utilizando encabezados de solicitud de rango HTTP. Todos los métodos de magnitud admiten la transmisión, sin embargo, most_similar y most_similar_approx puede ser lento ya que aún no están optimizados para la transmisión. Puede ver cómo este modo de transmisión funciona actualmente en los puntos de referencia, sin embargo, ¡se volverá más rápido a medida que lo optimizamos en el futuro!
Otra documentación no está disponible en este momento. Consulte el archivo fuente directamente (está bien comentado) si necesita más información sobre los argumentos de un método o si desea ver todas las funciones compatibles.
Actualmente, solo proporcionamos modelos de vectores de palabras en inglés en esta página pre-convertido al formato .magnitude . Sin embargo, aún puede usar magnitud con vectores de palabras de otros idiomas. Facebook ha entrenado sus vectores FastText para muchos idiomas diferentes. Puede bajar el archivo .vec para cualquier idioma que desee y luego convertirlo en .magnitude con el convertidor.
Actualmente, Reading Magnitude Files solo es compatible en Python, ya que se ha convertido en el lenguaje de facto para el aprendizaje automático. Esto es suficiente para la mayoría de los casos de uso. Extender el formato de archivo a otros idiomas no debería ser difícil ya que SQLite tiene una implementación de C nativa y tiene enlaces en la mayoría de los idiomas. El formato de archivo en sí y el protocolo para leer y buscar también es bastante sencillo al leer el código fuente de este repositorio.
Actualmente, el procesamiento del lenguaje natural es el dominio más popular que utiliza modelos de incrustación de vectores previamente capacitados para representaciones de vectores de palabras. Sin embargo, hay otros dominios como la visión por computadora que han comenzado a usar modelos de incrustación de vectores previamente capacitados como Deep1B para la representación de imágenes. Esta biblioteca tiene la intención de mantenerse agnóstica a varios dominios y, en cambio, proporciona una tienda e interfaz de vectores clave genéricos que es útil para todos los dominios.
El principal repositorio de este proyecto se puede encontrar en GITLAB. El repositorio de GitHub es solo un espejo. Extraiga las solicitudes de más pruebas, una mejor verificación de errores, correcciones de errores, mejoras de rendimiento o documentación o agregar utilidades / funcionalidades adicionales son bienvenidos en GITLAB.
Puede contactarnos en [email protected].
most_similar_approx sea optimizada para la transmisiónmost_similar lentas..bin Formato most_similar_approx con árboles de protección aleatoria y 2 medios jerárquicos. Gracias al autor Erik Bernhardsson por ayudar con algunos de los detalles de integración entre magnitud y molestia. Si desea citar nuestro artículo en EMNLP 2018, puede usar la siguiente cita de Bibtex:
@inproceedings{patel2018magnitude,
title={Magnitude: A Fast, Efficient Universal Vector Embedding Utility Package},
author={Patel, Ajay and Sands, Alexander and Callison-Burch, Chris and Apidianaki, Marianna},
booktitle={Proceedings of the 2018 Conference on Empirical Methods in Natural Language Processing: System Demonstrations},
pages={120--126},
year={2018}
}O siga el enlace de Google Scholar para otras formas de citar el documento.
Si desea citar este repositorio, puede usar la siguiente insignia DOI:
Al hacer clic en la insignia, conducirá a una página que lo ayudará a generar citas adecuadas de Bibtex, citas de JSON-LD y otras citas.
Este repositorio tiene licencia bajo la licencia que se encuentra aquí.
Ícono "sísmico" de Johnnyzi del proyecto sustantivo.