Diccionario de frecuencias¶
ests.datasets.FreqDict
Descripción¶
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 (3,2 GB): 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); las formas pasan a sus claves por lemma_key: minúsculas y luego el lema por simplemma 2.0.0, el lematizador de la biblioteca. Google no tiene etiqueta para los nombres propios, así que una forma de sustantivo escrita con mayúscula en el 90 % de sus apariciones es PROPN y conserva su forma. La decisión se toma para la forma entera, con las apariciones en minúsculas: la forma dios va con mayúscula en el 92 % de sus apariciones, así que toda ella, también dios en minúsculas, es PROPN (405,9 ipm), mientras que la fila NOUN de dios (37,3 ipm) viene sobre todo del plural dioses, con mayúscula en el 6 % de sus apariciones. Se dejan fuera las filas por debajo de 0,1 ipm o presentes en menos de 5 años (las malas lecturas de un solo lote de libros escaneados). La dispersión se calcula sobre la frecuencia relativa de cada año, para que los años de distinto tamaño pesen igual; 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 lema se busca en minúsculas. El diccionario analizado se guarda en caché por la ruta del fichero y se lee una vez por proceso, así que un FreqDict() para cada texto es barato. El diccionario es la fuente de las frecuencias de LexicalStats, y sus 10 000 lemas más frecuentes son la lista integrada de las bandas de frecuencia. 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, se descarga una vez en el directorio de datos, se verifica con su suma de comprobación SHA-256 y se extrae.
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.
Clave de una palabra¶
ests.datasets.freq_dict.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: la palabra pasa a minúsculas y luego a su lema por lemmatize. simplemma distingue mayúsculas y minúsculas y deja tal cual una palabra desconocida con mayúscula, así que una palabra al principio de una oración perdería su lema (Miró, Déjame); en minúsculas lo encuentra (mirar, dejar). 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 la biblioteca requiere simplemma 2 (2.0 o posterior, anterior a la 3); con la 1.x cerca del 4 % de las palabras de un texto tendrían otros lemas (fue - ir en lugar de ser, usted sin cambios). Un FreqDict avisa una vez por proceso cuando la versión instalada de simplemma no es la 2.0.0, ya que entonces algunas palabras pueden no encontrarse en el diccionario.
Ejemplo
from ests.datasets.freq_dict import lemma_key
lemma_key("Miró"), lemma_key("computadoras"), lemma_key("fue")
# ('mirar', 'computador', 'ser')
lemma_key("París"), lemma_key("París", proper=True)
# ('parir', 'parís')
Parámetros¶
| Parámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
data_dir |
str/Path | DEFAULT_DATA_DIR.joinpath("dicts") |
Ruta al directorio del diccionario; 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 |
Un Entry es una tupla con nombre con los campos lemma, pos (tupla de categorías gramaticales), ipm, range, dispersion, docs.
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¶
check_data¶
Comprueba que el fichero del diccionario está en su sitio y devuelve True; un diccionario sin descargar levanta DatasetNotFoundError. Los demás métodos lo comprueban por sí mismos.
download¶
Descarga el archivo con verificación de la suma de comprobación y extrae el fichero. Un archivo dañado o sustituido se borra y se descarga de nuevo en la misma llamada; si el archivo está pero falta el fichero del diccionario, se extrae otra vez, y el diccionario analizado se vuelve a leer.
| Parámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
force |
bool | False |
Descargar el diccionario aunque ya esté descargado |
Ejemplo
from ests.datasets import FreqDict
fd = FreqDict()
fd.download()
fd.info["license"]
# 'CC BY 3.0'
lookup¶
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. El argumento es una clave del diccionario, no una forma, y una forma se busca por su clave: computadoras por lemma_key("computadoras"), que es computador, no por computadora; el lema de usted en simplemma es tú, así que fd.lookup("usted") es None. Lo mismo vale para ipm e in; LexicalStats y keyness pasan a las claves por sí mismos.
| Parámetro | Tipo | Valor por defecto | Descripción |
|---|---|---|---|
lemma |
str | - |
Lema |
Ejemplo
from ests.datasets.freq_dict import lemma_key
fd.lookup("Gato")
# Entry(lemma='gato', pos=('NOUN', 'ADJ'), ipm=29.08, range=40, dispersion=95, docs=232841)
fd.lookup("dios")
# Entry(lemma='dios', pos=('PROPN', 'NOUN', 'ADJ'), ipm=444.42, range=40, dispersion=98, docs=566129)
fd.lookup("usted"), fd.ipm(lemma_key("usted"))
# (None, 1396.74)
ipm¶
Devuelve la frecuencia de un lema por millón de palabras, 0 para un lema que no está en el diccionario.
Ejemplo
fd.ipm("computadora"), fd.ipm(lemma_key("computadoras"))
# (0.0, 20.07)
"gato" in fd, len(fd), sum(1 for _ in fd)
# (True, 83785, 109178)
get_records¶
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. Una categoría desconocida y un límite negativo levantan ParameterError.
| Parámetro | Tipo | Valor 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 |
Ejemplo
for record in fd.get_records(pos="PROPN", limit=3):
print(record)
# {'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}
get_texts¶
Devuelve los lemas del diccionario con los mismos parámetros que get_records.
Ejemplo
list(fd.get_texts(pos="ADV", limit=5))
# ['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 259,6 ipm, cit 110,5, vol 53,6), igual que las palabras inglesas de las bibliografías (the 320,3, of 262,4) y las grafías antiguas de las reediciones (fué 26,7). 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).