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
| Palabra | Qué 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-idf | el producto de tf por idf |
| Colección | el 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
# 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
| Palabra | Documentos con ella (de 6) | Cociente | idf con log10 |
|---|---|---|---|
| la | 6 | 6 entre 6 = 1 | 0 |
| en | 4 | 6 entre 4 = 1,5 | 0,176 |
| marzo | 3 | 6 entre 3 = 2 | 0,301 |
| plazo | 2 | 6 entre 2 = 3 | 0,477 |
| bus | 1 | 6 entre 1 = 6 | 0,778 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Calcula el idf de «plazo» y de «la»
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»
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»
| Aviso | Peso de biblioteca | Peso de marzo | Suma |
|---|---|---|---|
| 4: la biblioteca cierra tarde en marzo | 0,0795 | 0,0502 | 0,1297 |
| 1: la biblioteca abre a las ocho | 0,0795 | 0 | 0,0795 |
| 3: la beca de comedor tiene plazo en marzo | 0 | 0,0376 | 0,0376 |
| 6: plazo de pago en la facultad en marzo | 0 | 0,0376 | 0,0376 |
| 2: el bus a la facultad sale a las ocho | 0 | 0 | 0 |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Comprueba el peso de «biblioteca»
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?