¿Cómo calcular la matriz de término-documento?

Sé que Term-Document Matrix es una matriz matemática que describe la frecuencia de los términos que aparecen en una colección de documentos. En una matriz de términos de documentos, las filas corresponden a los documentos de la colección y las columnas corresponden a los términos.

Estoy usando CountVectorizer de sklearn para extraer características de cadenas (archivo de texto) para facilitar mi tarea. El siguiente código devuelve una matriz de documento de término de acuerdo con la sklearn_documentation

from sklearn.feature_extraction.text import CountVectorizer import numpy as np vectorizer = CountVectorizer(min_df=1) print(vectorizer) content = ["how to format my hard disk", "hard disk format problems"] X = vectorizer.fit_transform(content) #X is Term-document matrix print(X) 

La salida es la siguiente
Salida
No entiendo cómo se ha calculado esta matriz. Analice el ejemplo que se muestra en el código. He leído un ejemplo más de la Wikipedia pero no pude entender.

La salida de un CountVectorizer().fit_transform() es una matriz dispersa. Esto significa que solo almacenará los elementos distintos de cero de una matriz. Cuando print(X) , solo se muestran las entradas que no son cero como se observa en la imagen.

En cuanto a cómo se realiza el cálculo, puede consultar la documentación oficial aquí .

El CountVectorizer en su configuración predeterminada, tokenize el documento dado o el texto sin procesar (tomará solo los términos que tienen 2 o más caracteres) y cuenta las ocurrencias de la palabra.

Básicamente, los pasos son los siguientes:

  • Paso 1: recostack todos los términos diferentes de todos los documentos presentes en fit() .

    Para sus datos, están [u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to'] Esto está disponible en vectorizer.get_feature_names()

  • Paso 2: en la transform() , cuente el número de términos en cada documento que estaban presentes en la salida de fit() en la matriz de frecuencia de términos.

    En su caso, está suministrando ambos documentos a transform () ( fit_transform() es una abreviatura de fit() y luego transform() ). Entonces, el resultado es

    [u'disk', u'format', u'hard', u'how', u'my', u'problems', u'to']

Primero 1 1 1 1 1 0 1

Sec 0 1 1 0 0 1 0

Puede obtener el resultado anterior llamando a X.toarray() .

En la imagen de la impresión (X) que publicó, la primera columna representa el índice del término matriz de frecuencia y la segunda representa la frecuencia de ese término.

<0,0> significa primera fila, primera columna, es decir, frecuencias del término "disk" (first term in our tokens) en el primer documento = 1

<0,2> significa primera fila, tercera columna, es decir, frecuencias del término "hard" (third term in our tokens) en el primer documento = 1

<0,5> significa primera fila, sexta columna, es decir, frecuencias del término "problems" (sixth term in our tokens) en el primer documento = 0. Pero como es 0, no se muestra en su imagen.