¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Qué es tf-idf y cómo se calcula

Después de esta lección: Puedo ordenar documentos por el peso tf-idf de las palabras de una consulta.

Lección de 60 min2 comandosLaboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

Qué palabra pesa más en un texto

El tf-idf es un número que dice cuánto pesa una palabra en un documento. Combina cuántas veces sale en él con lo rara que es en toda la colección de documentos.

Sirve para ordenar los resultados de una búsqueda. Los documentos donde las palabras de la consulta pesan más van primero.

Al final de esta lección

Nota

Puedo ordenar documentos por el peso tf-idf de las palabras de una consulta.

Palabras clave

PalabraQué significa
Frecuencia de término (tf)las veces que sale una palabra entre el total de tokens del texto
Frecuencia de documento (df)en cuántos documentos sale la palabra
Frecuencia inversa (idf)un número alto si la palabra es rara y cero si está en todos
Peso tf-idfel producto de tf por idf
Colecciónel conjunto de todos los documentos

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una palabra repetida pesa más en ese texto

Si una palabra sale muchas veces en un documento, probablemente el documento habla de eso. La frecuencia de término, o tf, lo mide: las veces que sale la palabra entre el total de tokens.

Se divide entre el total para que un texto largo no gane solo por ser largo. «Marzo» una vez en seis tokens pesa más que una vez en cien.

Calcula la frecuencia de término

Código: python
# La frecuencia de término: veces que sale / total de tokens.
def term_frequency(word, tokens):
    return tokens.count(word) / len(tokens)

aviso_4 = "la biblioteca cierra tarde en marzo".split()
aviso_6 = "plazo de pago en la facultad en marzo".split()
print(round(term_frequency("marzo", aviso_4), 4))
print(round(term_frequency("marzo", aviso_6), 4))
# Cambia "marzo" por "en" y compara las dos cifras.

Las palabras que están en todo pesan poco

La palabra «la» sale en casi cualquier texto, así que no ayuda a distinguir uno de otro. Una palabra rara, como «bus», sí ayuda. La frecuencia inversa de documento, o idf, mide esa rareza.

Se calcula así: el número total de documentos entre los documentos que tienen la palabra, y de ese cociente se toma log10. El logaritmo suaviza la cifra: una palabra diez veces más rara no pesa diez veces más.

Ejemplo resuelto: el idf de cinco palabras

PalabraDocumentos con ella (de 6)Cocienteidf con log10
la66 entre 6 = 10
en46 entre 4 = 1,50,176
marzo36 entre 3 = 20,301
plazo26 entre 2 = 30,477
bus16 entre 1 = 60,778

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Calcula el idf de «plazo» y de «la»

Comando
docker exec jupyter python3 -c "import math; print(round(math.log10(6/2),3), round(math.log10(6/6),3))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

tf por idf da el peso

El peso tf-idf multiplica los dos números. Es alto cuando la palabra sale mucho en ese texto y poco en el resto de la colección. Es cero cuando la palabra está en todos los documentos.

Para una consulta de varias palabras, se suman los pesos de cada una. El documento con la suma más alta va primero.

Calcula el peso de «biblioteca»

Código: python
import math

# El peso de una palabra en un aviso: tf por idf.
avisos = [
    "la biblioteca abre a las ocho".split(),
    "el bus a la facultad sale a las ocho".split(),
    "la beca de comedor tiene plazo en marzo".split(),
    "la biblioteca cierra tarde en marzo".split(),
    "bicicletas gratis en la facultad".split(),
    "plazo de pago en la facultad en marzo".split(),
]
palabra = "biblioteca"
con_la_palabra = 0
for aviso in avisos:
    if palabra in aviso:
        con_la_palabra = con_la_palabra + 1
idf = math.log10(len(avisos) / con_la_palabra)
for numero in [1, 3, 4]:
    aviso = avisos[numero - 1]
    tf = aviso.count(palabra) / len(aviso)
    print("aviso", numero, round(tf * idf, 4))
# Cambia la palabra por "marzo" y ejecuta.

Ejemplo resuelto: la consulta «biblioteca marzo»

AvisoPeso de bibliotecaPeso de marzoSuma
4: la biblioteca cierra tarde en marzo0,07950,05020,1297
1: la biblioteca abre a las ocho0,079500,0795
3: la beca de comedor tiene plazo en marzo00,03760,0376
6: plazo de pago en la facultad en marzo00,03760,0376
2: el bus a la facultad sale a las ocho000

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Comprueba el peso de «biblioteca»

Comando
docker exec jupyter python3 -c "import math; print(round(1/6*math.log10(6/2),4))"

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error muy común

Advertencia

Mucha gente cree que la palabra más frecuente de un texto es la más importante. Muchas veces es «de» o «la», que sale en todos los textos. El idf corrige eso: una palabra que está en todas partes pesa cero.

Para ir más lejos: tus palabras raras

Escribe seis frases cortas sobre tu semana. Calcula el idf de cada palabra distinta con el código de arriba.

Mira cuáles tienen el idf más alto y cuáles dan cero. ¿Coinciden con las palabras que tú dirías que describen cada frase?

Sobre este laboratorio y su código: Laboratorio JupyterLab de ciencia de datos: pandas, Matplotlib y scikit-learn en el navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.