Diccionario de frecuencias¶
FreqDict(data_dir=DEFAULT_DATASET_DIR)
Un diccionario de frecuencias de lemas del español construido a partir de los libros en español de Google Books Ngram (versión 20200217): 83 785 lemas (109 178 filas de un lema y una categoría gramatical) de los libros de 1980-2019, 63 000 millones de palabras. Cada fila tiene la frecuencia por millón de palabras (ipm), el rango (el número de años, de 40, en que aparece el lema), la D de Juilland por años (0-100) y el número de libros con la forma más extendida del lema. Las categorías gramaticales son las de Google, con los nombres de Universal Dependencies: NOUN, PROPN, VERB, ADJ, ADV, PRON, DET, ADP, CONJ (coordinantes y subordinantes juntas).
El diccionario lo construye scripts/build_freq_dict.py a partir de los 1-gramas: se cuentan solo las formas etiquetadas con una categoría gramatical y hechas de letras (se quitan los números, la puntuación y la etiqueta X), y cada forma pasa a su clave por lemma_key. Google no tiene etiqueta para los nombres propios, así que una forma de sustantivo escrita con mayúscula en al menos el 90 % de sus apariciones es PROPN y conserva su forma. La decisión se toma para la forma entera: dios, con mayúscula en el 92 % de sus apariciones, es PROPN también en minúsculas, mientras que su fila NOUN viene sobre todo del plural dioses. Se dejan fuera las filas por debajo de 0,1 ipm o presentes en menos de 5 años. La dispersión se calcula sobre la frecuencia relativa de cada año; el número de libros es una cota inferior, ya que un libro con varias formas del lema se cuenta una vez.
Para buscar un lema se unen sus categorías gramaticales: las frecuencias se suman, el rango, la dispersión y el número de libros son los mayores. El diccionario se lee una vez por proceso, así que un FreqDict() para cada texto es barato. Es la fuente de las frecuencias de LexicalStats, y la lista integrada de las bandas de frecuencia tiene sus 10 000 lemas más frecuentes, sin los nombres propios y algunos lemas que no son palabras. El tamaño del diccionario es CORPUS_SIZE, 63 090 618 290 palabras.
El archivo (0,9 MB) se guarda en el repositorio de la biblioteca y se descarga una vez en el directorio de datos.
Licencia y atribución
El diccionario deriva de Google Books Ngram, que se publica con la licencia Creative Commons Reconocimiento 3.0 No adaptada, y se distribuye con la misma licencia; el archivo lleva un README.txt con la fuente y los cambios. Cite la fuente así: Michel J.-B. et al. Quantitative analysis of culture using millions of digitized books. Science 331 (6014), 2011.
Excepciones:
SourceTypeError- undata_dirque no es ni una cadena ni unPath.
from ests.datasets import FreqDict
fd = FreqDict()
fd.download()
fd.info["license"]
'CC BY 3.0'
Parámetros¶
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
data_dir |
str / Path |
DEFAULT_DATASET_DIR |
Ruta al directorio del diccionario; por defecto dicts en DEFAULT_DATA_DIR, el directorio de datos se describe en Instalación |
Atributos¶
| Atributo | Tipo | Descripción |
|---|---|---|
name |
str |
Nombre del conjunto de datos, freq_dict |
meta |
dict[str, str] |
Información de referencia: la fuente, la descripción, el autor, la licencia y la cita |
info |
dict[str, str] |
El nombre y la información de referencia en un diccionario |
data_dir |
Path |
Ruta absoluta al directorio del diccionario |
filepath |
str |
Ruta al fichero del diccionario, None antes de la descarga |
entries |
dict[str, Entry] |
Entradas por lema, con las categorías gramaticales unidas |
min_ipm |
float |
Frecuencia mínima del diccionario (0,1) |
word_ipm |
dict[str, float] |
Frecuencias por la clave a la que llega una forma sin categoría gramatical: las filas de los nombres propios van a lemma_key de sus formas (roma a romo); la referencia de keyness |
Entry(lemma, pos, ipm, range, dispersion, docs)
Una entrada del diccionario: una tupla con nombre.
| Campo | Tipo | Descripción |
|---|---|---|
lemma |
str |
Lema en minúsculas |
pos |
tuple[str, ...] |
Categorías gramaticales del lema |
ipm |
float |
Frecuencia por millón de palabras, sumada sobre las categorías gramaticales |
range |
int |
Número de años, de 40 (1980-2019), en que aparece el lema |
dispersion |
int |
D de Juilland por años, de 0 a 100 |
docs |
int |
Número de libros con la forma más extendida del lema |
El diccionario se recorre por sus registros como get_records() sin filtros: for record in fd pasa por las 109 178 filas de un lema y una categoría gramatical, mientras que len(fd) cuenta los 83 785 lemas con sus categorías unidas, tal como los ven lookup e in.
Métodos¶
download(force=False) descarga el archivo, verifica su suma de comprobación SHA-256 y extrae el fichero. Un archivo dañado se descarga de nuevo, un fichero que falta se extrae otra vez; después de la llamada el diccionario se vuelve a leer.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
force |
bool |
False |
Descargar el diccionario aunque ya esté descargado |
Un archivo que no se puede descargar o que no pasa la suma de comprobación dos veces lanza DownloadError, y un archivo que no se puede extraer, DataFileError.
check_data() comprueba que el fichero del diccionario está en su sitio y devuelve True; un diccionario sin descargar lanza DatasetNotFoundError con las órdenes para descargarlo. Los demás métodos y los atributos de las entradas y las frecuencias lo comprueban por sí mismos.
lookup(lemma) devuelve la entrada de un lema en cualquier combinación de mayúsculas y minúsculas, None para un lema que no está en el diccionario; ipm(lemma) devuelve la frecuencia de un lema por millón de palabras, 0 para un lema que no está en el diccionario. El argumento es una clave del diccionario, no una forma: una forma se busca por su clave, computadoras por lemma_key("computadoras") (computador), no por computadora; el lema de usted en simplemma es tú, así que fd.lookup("usted") es None. Lo mismo vale para in; LexicalStats y keyness pasan a las claves por sí mismos.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
lemma |
str |
- | Lema |
Un lema que no es una cadena lanza SourceTypeError.
from ests.datasets.freq_dict import lemma_key
fd.lookup("Gato")
fd.lookup("dios")
fd.lookup("usted"), fd.ipm(lemma_key("usted"))
fd.ipm("computadora"), fd.ipm(lemma_key("computadoras"))
"gato" in fd, len(fd), sum(1 for _ in fd)
Entry(lemma='gato', pos=('NOUN', 'ADJ'), ipm=29.08, range=40, dispersion=95, docs=232841)
Entry(lemma='dios', pos=('PROPN', 'NOUN', 'ADJ'), ipm=444.42, range=40, dispersion=98, docs=566129)
(None, 1396.74)
(0.0, 20.07)
(True, 83785, 109178)
get_records(pos=None, min_ipm=None, limit=None) devuelve los registros del diccionario - una fila por lema y categoría gramatical, por frecuencia - filtrados por la categoría gramatical y la frecuencia mínima; get_texts con los mismos parámetros devuelve los lemas.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
pos |
str |
None |
Categoría gramatical: NOUN, PROPN, VERB, ADJ, ADV, PRON, DET, ADP o CONJ |
min_ipm |
float |
None |
Frecuencia mínima |
limit |
int |
None |
Número de registros |
Una categoría desconocida, una frecuencia mínima que no es un número y un limit que no es un entero no negativo lanzan ParameterError.
for record in fd.get_records(pos="PROPN", limit=3):
print(record)
list(fd.get_texts(pos="ADV", limit=5))
{'lemma': 'méxico', 'pos': 'PROPN', 'ipm': 546.31, 'range': 40, 'dispersion': 94, 'docs': 535343}
{'lemma': 'san', 'pos': 'PROPN', 'ipm': 411.07, 'range': 40, 'dispersion': 94, 'docs': 645513}
{'lemma': 'dios', 'pos': 'PROPN', 'ipm': 405.93, 'range': 40, 'dispersion': 95, 'docs': 566129}
['no', 'más', 'mucho', 'ya', 'también']
El registro de los libros
El diccionario describe la lengua escrita de los libros, buena parte de ellos académicos, y conserva lo que tienen los libros: las abreviaturas de las referencias son palabras frecuentes (pp, cit, vol), igual que las palabras inglesas de las bibliografías (the, of) y las grafías antiguas de las reediciones (fué). Los textos se reconocen a partir de escaneos y se etiquetan automáticamente, así que quedan malas lecturas y errores de etiquetado, sobre todo entre los lemas raros; el lematizador no ve el contexto, así que una forma compartida por dos lemas va a uno de ellos (como es siempre como, nunca comer), y una forma que no conoce se queda como está (darle, verlo).
Clave de una palabra¶
lemma_key(word, proper=False)
La clave por la que se busca una palabra en el diccionario y con la que se construye el diccionario (ests.datasets.freq_dict.lemma_key): la palabra pasa a minúsculas, para que una palabra al principio de una oración encuentre su lema (Miró - mirar), y luego a su lema por lemmatize. Un nombre propio conserva su forma en minúsculas (proper=True): París es parís, no el verbo parir.
Los lemas dependen de la versión de simplemma: el diccionario se construye con la 2.0.0 (la constante SIMPLEMMA_VERSION), y un FreqDict avisa una vez por proceso cuando está instalada otra versión, ya que entonces algunas palabras pueden no encontrarse en el diccionario.
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
word |
str |
- | Forma de la palabra en cualquier combinación de mayúsculas y minúsculas |
proper |
bool |
False |
La palabra es un nombre propio |
from ests.datasets.freq_dict import lemma_key
lemma_key("Miró"), lemma_key("computadoras"), lemma_key("fue")
lemma_key("París"), lemma_key("París", proper=True)
('mirar', 'computador', 'ser')
('parir', 'parís')