Ley de Zipf¶
zipf(counter, num_words=None, num_labels=10, log=True, show_theory=False, alpha=1.5, show_fit=False, ax=None, labels=None)
El gráfico de la ley de Zipf a partir de un contador de frecuencias de palabras.
Definición
La ley de Zipf (la ley de rango y frecuencia) es una regularidad empírica de las frecuencias de las palabras en una lengua natural: con las palabras de una lengua, o de un texto lo bastante largo, ordenadas por frecuencia descendente, la frecuencia de la n-ésima palabra es aproximadamente inversamente proporcional a su rango n. La segunda palabra más frecuente aparece más o menos la mitad de veces que la primera, la tercera un tercio, y así sucesivamente.
Las funciones son las del núcleo anyTS. Las etiquetas por defecto son las inglesas de VISUALIZER_LABELS en anyts.constants; labels sustituye cualquiera de ellas, por ejemplo labels={"title": "Ley de Zipf"}.
Los lemas de Marianela de Galdós del corpus de literatura:
from collections import Counter
from ests import WordsExtractor
from ests.datasets import SpanishLiterature
from ests.visualizers import zipf
sl = SpanishLiterature()
sl.download()
text = next(
record["text"] for record in sl.get_records(author="galdos") if record["title"] == "Marianela"
)
counts = Counter(WordsExtractor(use_lexemes=True, lowercase=True, filter_nums=True).extract(text))
ax = zipf(counts, num_labels=10, show_theory=True, alpha=1.0, show_fit=True)
ax.figure.savefig("zipf.png")

En ejes logarítmicos las frecuencias de los lemas caen a lo largo de una recta; el ajuste de Zipf-Mandelbrot las sigue más de cerca en la cabeza de la lista que la ley teórica con \(\alpha = 1\).
Parámetros¶
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
counter |
Counter |
- | Contador de frecuencias de palabras |
num_words |
int |
None |
Número de las palabras más frecuentes |
num_labels |
int |
10 |
Número de palabras etiquetadas en el gráfico |
log |
bool |
True |
Usar una escala logarítmica |
show_theory |
bool |
False |
Dibujar la ley de Zipf teórica |
alpha |
float |
1.5 |
Exponente α de la ley de Zipf teórica, mayor que cero |
show_fit |
bool |
False |
Dibujar el ajuste de Zipf-Mandelbrot \(f(r) = C / (r + q)^s\) de fit_zipf_mandelbrot |
ax |
Axes |
None |
Ejes de matplotlib para el gráfico; si no se dan, se crea una figura nueva |
labels |
dict[str, str] |
None |
Etiquetas del gráfico sobre las de por defecto: title, xlabel, ylabel, experimental y theoretical (las curvas), fit (una cadena de formato con q y s) |
La función devuelve los Axes con el gráfico; un num_words mayor que el número de tipos de palabra no alarga las curvas más allá de los datos. Un contador que no es un Counter de cadenas lanza SourceTypeError, y un contador vacío o una frecuencia que no es mayor que cero SourceError. Un num_words menor que uno, un num_labels negativo, con show_theory un exponente que no es un número finito mayor que cero, unas etiquetas que merge_labels rechaza y un ax que no es un Axes de matplotlib lanzan ParameterError. Todos ellos se lanzan antes de crear una figura.
El ajuste de Zipf-Mandelbrot se describe en fit_zipf_mandelbrot.
Ley teórica¶
zipf_theory(size, num_ranks, alpha=1.5, ax=None, labels=None)
La curva teórica sola, \(f(r) = size \cdot r^{-\alpha}\) para los rangos de 1 a num_ranks.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
size |
int / float |
- | Frecuencia del primer rango |
num_ranks |
int |
- | Número de rangos |
alpha |
float |
1.5 |
Exponente α |
ax |
Axes |
None |
Ejes de matplotlib para el gráfico; si no se dan, se crea una figura nueva |
labels |
dict[str, str] |
None |
Etiquetas sobre las de por defecto: theoretical (la curva) |
Un size o un alpha que no es un número finito mayor que cero, un num_ranks que no es un entero de al menos uno, unas etiquetas que merge_labels rechaza y un ax que no es un Axes de matplotlib lanzan ParameterError.