
Las computadoras son buenas con los números, pero no tanto con los datos textuales. Una de las técnicas más utilizadas para procesar datos textuales es TF-IDF. En este artículo aprenderemos cómo funciona y cuáles son sus características.
Desde nuestra intuición pensamos que las palabras que aparecen con mayor frecuencia deberían tener un mayor peso en el análisis de datos textuales, pero no siempre es así. Palabras como "el", "voluntad" y "usted", llamadas palabras vacías , aparecen más en un corpus de texto, pero tienen muy poca importancia. En cambio, las palabras que son raras son las que realmente ayudan a distinguir entre los datos y tienen más peso.
Introducción a TF-IDF
TF-IDF son las siglas de "Término de frecuencia - Frecuencia de datos inversa". Primero, aprenderemos qué significa este término matemáticamente.
Término Frecuencia (tf) : nos da la frecuencia de la palabra en cada documento del corpus. Es la proporción de veces que la palabra aparece en un documento en comparación con la cantidad total de palabras en ese documento. Aumenta a medida que aumenta el número de apariciones de esa palabra en el documento. Cada documento tiene su propio tf.

Frecuencia de datos inversa (idf): se utiliza para calcular el peso de las palabras raras en todos los documentos del corpus. Las palabras que aparecen raramente en el corpus tienen una puntuación alta en las FDI. Está dado por la siguiente ecuación.

Combinando estos dos, obtenemos la puntuación TF-IDF (w) para una palabra en un documento en el corpus. Es el producto de tf e idf:


Tomemos un ejemplo para tener una comprensión más clara.
Oración 1: El automóvil se conduce en la carretera.
Oración 2: El camión se conduce por la carretera.
En este ejemplo, cada oración es un documento separado.
Ahora calcularemos el TF-IDF para los dos documentos anteriores, que representan nuestro corpus.

En la tabla anterior, podemos ver que TF-IDF de palabras comunes fue cero, lo que muestra que no son significativas. Por otro lado, el TF-IDF de "automóvil", "camión", "carretera" y "carretera" son distintos de cero. Estas palabras tienen más significado.
Usando Python para calcular TF-IDF
Ahora codifiquemos TF-IDF en Python desde cero. Después de eso, veremos cómo podemos usar sklearn para automatizar el proceso.
La función computeTF
calcula la puntuación TF para cada palabra en el corpus, por documento.


La función computeIDF
calcula la puntuación IDF de cada palabra del corpus.


La computeTFIDF
siguiente función calcula la puntuación TF-IDF para cada palabra, multiplicando las puntuaciones TF e IDF.

La salida producida por el código anterior para el conjunto de documentos D1 y D2 es la misma que calculamos manualmente en la tabla.

Puede consultar este enlace para ver la implementación completa.
sklearn
Ahora veremos cómo podemos implementar esto usando sklearn en Python.
Primero, importaremos TfidfVectorizer
desde sklearn.feature_extraction.text
:

Ahora inicializaremos vectorizer
y luego llamaremos a fit y transformaremos sobre él para calcular la puntuación TF-IDF para el texto.

Bajo el capó, el fit_transform sklearn ejecuta el siguiente fit
y transform
funciones. Estos se pueden encontrar en la biblioteca oficial de sklearn en GitHub.
def fit(self, X, y=None): """Learn the idf vector (global term weights) Parameters ---------- X : sparse matrix, [n_samples, n_features] a matrix of term/token counts """ if not sp.issparse(X): X = sp.csc_matrix(X) if self.use_idf: n_samples, n_features = X.shape df = _document_frequency(X) # perform idf smoothing if required df += int(self.smooth_idf) n_samples += int(self.smooth_idf) # log+1 instead of log makes sure terms with zero idf don't get # suppressed entirely. idf = np.log(float(n_samples) / df) + 1.0 self._idf_diag = sp.spdiags(idf, diags=0, m=n_features, n=n_features, format="csr") return self def transform(self, X, copy=True): """Transform a count matrix to a tf or tf-idf representation Parameters ---------- X : sparse matrix, [n_samples, n_features] a matrix of term/token counts copy : boolean, default True Whether to copy X and operate on the copy or perform in-place operations. Returns ------- vectors : sparse matrix, [n_samples, n_features] """ if hasattr(X, 'dtype') and np.issubdtype(X.dtype, np.floating): # preserve float family dtype X = sp.csr_matrix(X, copy=copy) else: # convert counts or binary occurrences to floats X = sp.csr_matrix(X, dtype=np.float64, copy=copy) n_samples, n_features = X.shape if self.sublinear_tf: np.log(X.data, X.data) X.data += 1 if self.use_idf: check_is_fitted(self, '_idf_diag', 'idf vector is not fitted') expected_n_features = self._idf_diag.shape[0] if n_features != expected_n_features: raise ValueError("Input has n_features=%d while the model" " has been trained with n_features=%d" % ( n_features, expected_n_features)) # *= doesn't work X = X * self._idf_diag if self.norm: X = normalize(X, norm=self.norm, copy=False) return X
Una cosa a tener en cuenta en el código anterior es que, en lugar de solo el registro de n_samples, se ha agregado 1 a n_samples para calcular la puntuación IDF. Esto asegura que las palabras con una puntuación IDF de cero no se supriman por completo.
La salida obtenida tiene la forma de una matriz sesgada, que se normaliza para obtener el siguiente resultado.

Por lo tanto, vimos cómo podemos codificar TF-IDF fácilmente en solo 4 líneas usando sklearn. Ahora entendemos lo poderoso que es TF-IDF como herramienta para procesar datos textuales de un corpus. Para obtener más información sobre sklearn TF-IDF, puede utilizar este enlace.
¡Feliz codificación!
Gracias por leer este artículo. Asegúrese de compartirlo si lo encuentra útil.
Para obtener más información sobre programación, puede seguirme para recibir una notificación cada vez que se me ocurra una nueva publicación.
¡Salud!
Also, Let’s get connected on Twitter, Linkedin, Github and Facebook.