Gensim - Vector y modelo
Aquí, aprenderemos sobre los conceptos centrales de Gensim, con un enfoque principal en el vector y el modelo.
¿Qué es Vector?
¿Qué pasa si queremos inferir la estructura latente en nuestro corpus? Para ello, necesitamos representar los documentos de tal manera que podamos manipularlos matemáticamente. Un tipo de representación popular es representar cada documento del corpus como un vector de características. Por eso podemos decir que el vector es una representación matemática conveniente de un documento.
Para darle un ejemplo, representemos una sola característica, de nuestro corpus usado anteriormente, como un par de QA:
Q - ¿Cuántas veces la palabra Hello aparecer en el documento?
A - Cero (0).
Q - ¿Cuántos párrafos hay en el documento?
A - Dos (2)
La pregunta generalmente está representada por su ID entero, por lo tanto, la representación de este documento es una serie de pares como (1, 0.0), (2, 2.0). Esta representación vectorial se conoce comodensevector. Por quédense, porque comprende una respuesta explícita a todas las preguntas escritas anteriormente.
La representación puede ser un simple like (0, 2), si conocemos todas las preguntas de antemano. Tal secuencia de las respuestas (por supuesto, si las preguntas se conocen de antemano) es lavector para nuestro documento.
Otro tipo de representación popular es la bag-of-word (BoW)modelo. En este enfoque, cada documento está básicamente representado por un vector que contiene el recuento de frecuencia de cada palabra en el diccionario.
Para darle un ejemplo, suponga que tenemos un diccionario que contiene las palabras ['Hola', 'Cómo', 'eres', 'tú']. Un documento que consta de la cadena "¿Cómo estás cómo?" Se representaría entonces mediante el vector [0, 2, 1, 1]. Aquí, las entradas del vector están en orden de apariciones de "Hola", "Cómo", "eres" y "tú".
Vector versus documento
De la explicación anterior del vector, casi se comprende la distinción entre un documento y un vector. Pero, para que quede más claro,document es texto y vectores una representación matemáticamente conveniente de ese texto. Desafortunadamente, a veces muchas personas usan estos términos indistintamente.
Por ejemplo, supongamos que tenemos algún documento A arbitrario, entonces en lugar de decir, “el vector que corresponde al documento A”, solían decir, “el vector A” o “el documento A”. Esto conduce a una gran ambigüedad. Una cosa más importante a tener en cuenta aquí es que dos documentos diferentes pueden tener la misma representación vectorial.
Conversión de corpus en una lista de vectores
Antes de tomar un ejemplo de implementación de conversión de corpus en la lista de vectores, necesitamos asociar cada palabra en el corpus con un ID entero único. Para ello, ampliaremos el ejemplo del capítulo anterior.
Ejemplo
from gensim import corpora
dictionary = corpora.Dictionary(processed_corpus)
print(dictionary)
Salida
Dictionary(25 unique tokens: ['computer', 'opinion', 'response', 'survey', 'system']...)
Muestra que en nuestro corpus hay 25 tokens diferentes en este gensim.corpora.Dictionary.
Ejemplo de implementación
Podemos usar el diccionario para convertir documentos tokenizados en estos vectores de 5 dietas de la siguiente manera:
pprint.pprint(dictionary.token2id)
Salida
{
'binary': 11,
'computer': 0,
'error': 7,
'generation': 12,
'graph': 16,
'intersection': 17,
'iv': 19,
'measurement': 8,
'minors': 20,
'opinion': 1,
'ordering': 21,
'paths': 18,
'perceived': 9,
'quasi': 22,
'random': 13,
'relation': 10,
'response': 2,
'survey': 3,
'system': 4,
'time': 5,
'trees': 14,
'unordered': 15,
'user': 6,
'well': 23,
'widths': 24
}
Y de manera similar, podemos crear la representación de bolsa de palabras para un documento de la siguiente manera:
BoW_corpus = [dictionary.doc2bow(text) for text in processed_corpus]
pprint.pprint(BoW_corpus)
Salida
[
[(0, 1), (1, 1), (2, 1), (3, 1), (4, 1), (5, 1), (6, 1)],
[(2, 1), (5, 1), (6, 1), (7, 1), (8, 1), (9, 1), (10, 1)],
[(11, 1), (12, 1), (13, 1), (14, 1), (15, 1)],
[(14, 1), (16, 1), (17, 1), (18, 1)],
[(14, 1), (16, 1), (19, 1), (20, 1), (21, 1), (22, 1), (23, 1), (24, 1)]
]
¿Qué es el modelo?
Una vez que hemos vectorizado el corpus, ¿qué sigue? Ahora, podemos transformarlo usando modelos. El modelo puede referirse a un algoritmo utilizado para transformar una representación de documento en otra.
Como hemos discutido, los documentos, en Gensim, se representan como vectores, por lo tanto, podemos, aunque modelar, como una transformación entre dos espacios vectoriales. Siempre hay una fase de entrenamiento donde los modelos aprenden los detalles de tales transformaciones. El modelo lee el corpus de entrenamiento durante la fase de entrenamiento.
Inicializar un modelo
Vamos a inicializar tf-idfmodelo. Este modelo transforma los vectores de la representación BoW (Bolsa de palabras) a otro espacio vectorial donde los recuentos de frecuencia se ponderan de acuerdo con la rareza relativa de cada palabra en el corpus.
Ejemplo de implementación
En el siguiente ejemplo, vamos a inicializar el tf-idfmodelo. Lo entrenaremos en nuestro corpus y luego transformaremos la cadena "gráfico de árboles".
Ejemplo
from gensim import models
tfidf = models.TfidfModel(BoW_corpus)
words = "trees graph".lower().split()
print(tfidf[dictionary.doc2bow(words)])
Salida
[(3, 0.4869354917707381), (4, 0.8734379353188121)]
Ahora, una vez que creamos el modelo, podemos transformar todo el corpus a través de tfidf e indexarlo, y consultar la similitud de nuestro documento de consulta (le estamos dando al documento de consulta 'sistema de árboles') con cada documento en el corpus -
Ejemplo
from gensim import similarities
index = similarities.SparseMatrixSimilarity(tfidf[BoW_corpus],num_features=5)
query_document = 'trees system'.split()
query_bow = dictionary.doc2bow(query_document)
simils = index[tfidf[query_bow]]
print(list(enumerate(simils)))
Salida
[(0, 0.0), (1, 0.0), (2, 1.0), (3, 0.4869355), (4, 0.4869355)]
A partir del resultado anterior, el documento 4 y el documento 5 tienen una puntuación de similitud de alrededor del 49%.
Además, también podemos ordenar esta salida para una mayor legibilidad de la siguiente manera:
Ejemplo
for doc_number, score in sorted(enumerate(sims), key=lambda x: x[1], reverse=True):
print(doc_number, score)
Salida
2 1.0
3 0.4869355
4 0.4869355
0 0.0
1 0.0