Apuntes / Procesamiento de Lenguaje Natural / Apunte 1 de 8

Read in English

Las leyes del texto: Zipf y Heaps

Cuán seguido aparecen las palabras y cuán rápido crece un vocabulario, y por qué unas pocas palabras llenan cerca de un cuarto de un texto largo mientras siguen llegando palabras nuevas.

Los buscadores, el análisis de sentimiento, la extracción de información, la traducción automática y las preguntas y respuestas son problemas distintos con la misma materia prima: texto, cuya única estructura son sus palabras. Antes de construir cualquiera de ellos conviene mirar cómo se usan las palabras. Cuenta todas las palabras de un libro largo, aquí el Quijote de Cervantes, desde su primer capítulo hasta su última línea, y saltan a la vista tres hechos:

  • Diez palabras son más de un cuarto del libro

  • Casi la mitad de sus palabras distintas aparece una sola vez

  • Su vocabulario sigue creciendo en la última página

Los dos primeros tratan de cuán seguido se usa cada palabra, lo que describe la ley de Zipf; el tercero, de cuántas palabras distintas usa un texto, lo que describe la ley de Heaps. Las dos condicionan lo que viene después: qué palabras puede dejar de lado un sistema, cuán grande debe ser su vocabulario y por qué siempre encontrará palabras que nunca ha visto.

En esta página, los conteos del libro se dibujan con tinta roja y las leyes ajustadas a ellos con tinta azul.

1Unas pocas palabras hacen casi todo el trabajo

Ordena las palabras del libro de la más frecuente a la menos frecuente. El lugar de una palabra en esa lista es su rango, r, y la cantidad de veces que aparece es su frecuencia, fr. Cada aparición es un token: el libro tiene 376 597 tokens de 22 605 palabras distintas. «Que», de rango 1, pone 20 416 de ellos; «y», de rango 2, 17 987, y «hasta», de rango 100, 383. En 1949, George Kingsley Zipf observó que en los textos largos la frecuencia cae con el rango siempre de la misma forma, como una potencia de él:

fr = Crα

La constante C fija la escala y el exponente α, cuán rápido caen las frecuencias; en los textos largos α suele estar cerca de 1. Con α = 1, el rango por la frecuencia es el mismo para todas las palabras: una palabra de rango diez veces mayor aparece la décima parte de las veces. Zipf lo explicó con lo que llamó el principio del mínimo esfuerzo. Hablar cuesta menos cuando las mismas palabras a mano sirven una y otra vez, en lugar de la palabra exacta para cada cosa, así que unas pocas palabras terminan en todas partes y las muchas palabras para cosas particulares aparecen, cada una, pocas veces.

Para que una palabra usada veinte mil veces y otra usada una sola vez quepan en un mismo dibujo, los ejes de la figura se multiplican por diez en cada paso. Arrastra el punto rojo por las palabras del libro y mira cuánto da el rango por la frecuencia.

Arrastra el punto rojo por las palabras. Con el teclado, selecciónalo con Tab y usa las flechas.

Del rango 3 al 1000 la frecuencia cae de 17 953 a 35, pero el producto se mantiene entre la mitad y el doble de 40 000 (su mediana es 38 423): en ese tramo α está cerca de 1. La ley describe la lista completa, no cada palabra. La primera palabra aparece cerca de la mitad de las veces que sugiere el resto de la lista, y pasados unos miles de rangos hay tramos enteros de palabras con una misma frecuencia pequeña, hasta las 11 003 que aparecen una sola vez. La sección 2 mide α.

2Una recta en escala logarítmica

En los ejes de la figura las palabras caían cerca de una recta, y la ley dice por qué. Toma logaritmos a ambos lados, en base 10 como los ejes:

log fr = log C − α log r

Con xr = log r e yr = log fr, esto es una recta: su pendiente es −α, y su altura en r = 1, donde xr = 0, es log C. Estimar α y C es encontrar la recta que mejor sigue a los puntos. Mínimos cuadrados toma la recta que hace lo más pequeñas posible las distancias verticales de los puntos a ella, elevadas al cuadrado y sumadas, y para una recta la respuesta tiene una fórmula cerrada:

α = −Σr (xr − x)(yr − y)Σr (xr − x)2, log C = y + αx

Aquí x e y son los promedios de los xr y de los yr. Elevar al cuadrado hace que un error grande pese más que dos pequeños, y trata igual los errores por encima y por debajo de la recta.

La figura ajusta las 1000 palabras más frecuentes; el resto de la lista va tenue. Parte de la suposición de la sección 1, α = 1 y C = 40 000. Arrastra las asas azules para acercar la recta a los puntos rojos: los trazos rojos finos son las distancias que se elevan al cuadrado. Mínimos cuadrados salta a la mejor recta.

Arrastra las dos asas azules hacia arriba y hacia abajo. Con el teclado, selecciona un asa con Tab y usa las flechas.

Para este libro, mínimos cuadrados da α = 1.05 y C = 50 973. En el medio de la lista la recta queda cerca: en el rango 1000 da 37, donde «ausencia» aparece 35 veces. Pero pasa muy por encima de la primera palabra, 50 973 contra los 20 416 de «que», la disparidad que la sección 1 encontró al comienzo de la lista.

C y el largo del libro

Si la ley tiene que dar cuenta de todos los tokens del libro, C no queda libre: las frecuencias de las V palabras distintas deben sumar n, la cantidad de tokens. Eso la fija:

fr = nrα HV(α), HV(α) = ΣVj=1 1jα

Con α = 1 la suma queda cerca de ln V + γ, donde γ ≈ 0.577 es una constante. Para este libro, ln 22 605 + 0.577 ≈ 10.60, así que C = 376 597 / 10.60 ≈ 35 500, cerca de los 40 000 en torno a los que se movía el rango por la frecuencia en la sección 1.

3El vocabulario sigue creciendo

Ahora lee el libro desde el comienzo y cuenta las palabras distintas encontradas hasta ahí. Tras n tokens el vocabulario tiene V palabras, y V crece mientras haya texto: siguen apareciendo nombres, palabras raras y formas nuevas de palabras conocidas. Pero crece cada vez más lento, como una potencia de n menor que 1. Es la ley de Heaps:

V = k nβ

La constante k y el exponente β dependen del texto y de su idioma; β suele estar entre 0.4 y 0.6. En escala logarítmica esta ley también es una recta, log V = log k + β log n, así que mínimos cuadrados encuentra β y k como encontró α y C. Lo que significa β se ve al duplicar el texto:

V(2n)V(n) = k(2n)βknβ = 2β

El doble de texto trae 2β veces las palabras, no el doble. La figura muestra el vocabulario del libro a medida que se lee, con la ley de Heaps ajustada en azul y, tenue, el de la traducción inglesa. Arrastra el punto rojo por el libro; el anillo marca el doble de lejos.

Arrastra el punto rojo por la curva. Con el teclado, selecciónalo con Tab y usa las flechas.

Para el original, mínimos cuadrados da β = 0.62, algo por encima de lo habitual, y k = 8.1, así que duplicar el texto multiplica el vocabulario por cerca de 20.62 ≈ 1.54; las razones contadas, desde los 10 000 tokens, van de 1.44 a 1.65. Los dos números van atados: un β algo menor con un k mayor dibuja casi la misma curva sobre el libro, y con β fijo en 0.5 el mejor k es 33.4. La traducción inglesa usa 14 921 palabras distintas en más tokens, con β = 0.52, porque el castellano flexiona: un verbo toma decenas de formas, y cada una cuenta como una palabra distinta. El próximo apunte trata de esas formas.

4La cola nunca se acaba

La ley de Zipf y la ley de Heaps miran lo mismo desde dos lados. La de Zipf ordena las palabras por frecuencia y encuentra una cola larga de palabras raras; la de Heaps sigue el texto y encuentra palabras nuevas llegando todo el tiempo. Las palabras nuevas salen de esa cola: cada tramo de texto saca unas pocas palabras de una lista demasiado larga para agotarse. Si se divide el vocabulario encontrado hasta ahí según cuántas veces se ha visto cada palabra, las vistas una sola vez siguen siendo una parte grande de él por mucho que se lea.

Arrastra el punto rojo por el libro y mira la parte roja de la barra.

Arrastra el punto rojo por el libro. Con el teclado, selecciónalo con Tab y usa las flechas.

Tras los primeros 1000 tokens, el 75% de las palabras encontradas se ha visto una vez; tras 100 000, el 55%; al final, el 49%. La proporción baja, pero despacio, y siguen llegando palabras nuevas: 552 en los 10 000 tokens anteriores al token 100 000, y todavía 296 en los últimos 10 000 del libro. Un sistema que aprende su vocabulario de un texto encontrará en el siguiente palabras que nunca ha visto, un problema al que vuelven apuntes posteriores.

5Resumen

Las fórmulas del apunte junto a su equivalente en NumPy. tokens tiene las palabras del libro en orden; n y v tienen, en una serie de puntos del libro, los tokens leídos y las palabras distintas encontradas.

Frecuencias por rango
f1 ≥ f2 ≥ … ≥ fV
counts = np.unique(tokens,
    return_counts=True)[1]
f = np.sort(counts)[::-1]
r = np.arange(1, len(f) + 1)
Ley de Zipf
fr = Crα
f_law = c / r ** alpha
Su recta, por mínimos cuadrados
log fr = log C − α log r
x, y = np.log10(r), np.log10(f)
slope, log_c = np.polyfit(x, y, 1)
alpha, c = -slope, 10 ** log_c
C a partir de la cantidad de tokens
fr = nrα HV(α)
h_v = np.sum(1 / r ** alpha)
c = len(tokens) / h_v
Ley de Heaps, por mínimos cuadrados
V = k nβ
beta, log_k = np.polyfit(
    np.log10(n), np.log10(v), 1)
k = 10 ** log_k
Duplicar el texto
V(2n) / V(n) = 2β
2 ** beta