Palabras clave¶
keyness(target, reference, measure='log_likelihood', min_freq=1, positive=True, top_n=None, n=1)
Extracción de palabras clave (keyness) de un corpus objetivo frente a uno de referencia: las palabras que aparecen significativamente más a menudo en el corpus objetivo que en el de referencia.
Cada palabra recibe dos valores que Gabrielatos y Marchi y Hardie recomiendan leer juntos: la razón de verosimilitud \(G^2\) con su valor p (si hay una diferencia) y Log Ratio (cuán grande es), además de la medida elegida score, que ordena la lista. Las medidas de significación (\(G^2\), ji cuadrado, BIC) y ELL, el tamaño del efecto de \(G^2\), son negativas cuando la palabra es más frecuente en la referencia; %DIFF, Log Ratio y la razón de momios tienen dirección por construcción.
La referencia puede ser una lista de palabras, un mapeo de frecuencias (su tamaño es la suma de los recuentos) o una FrequencyReference. Las palabras se comparan tal cual: las mayúsculas y minúsculas, la lematización y las palabras vacías corresponden al extractor de palabras, y los dos corpus tienen que extraerse del mismo modo. Un corpus de varios textos se da como una lista de sus listas de palabras. Con n mayor que 1 las palabras clave son los N-gramas de las palabras de cada texto, unidos por guiones bajos como los N-gramas de WordsExtractor (black_cat), así que un N-grama nunca cruza dos textos; los recuentos y los tamaños son los de los N-gramas, y las frecuencias por millón son por millón de N-gramas. Las frecuencias de N-gramas - una suma de los Counter de los N-gramas de cada texto, o un diccionario de frecuencias de N-gramas - van con n=1: un mapeo y una FrequencyReference se rechazan con n mayor que 1.
La función envuelve keyness del núcleo anyTS y admite además como referencia el diccionario de frecuencias FreqDict; FrequencyReference está en ests.corpus junto a ella. Las palabras se extraen con WordsExtractor.
from ests import WordsExtractor
from ests.corpus import keyness
we = WordsExtractor(use_lexemes=True, lowercase=True)
target = we.extract(
"El gato estaba en la ventana y miraba a los pájaros. Los pájaros se fueron y el gato "
"se durmió en la ventana. Mañana el gato volverá a estar en la ventana y mirará a los pájaros."
)
reference = we.extract(
"El perro estaba en el suelo y dormía. Después el perro comió y volvió a dormir. "
"Mañana el perro saldrá a pasear."
)
keyness(target, reference, top_n=1)
[(k.word, round(k.g2, 2)) for k in keyness(target, reference, positive=False, top_n=2)]
[Keyword(word='gato', freq_target=3, freq_reference=0.0, ipm_target=81081.08108108108, ipm_reference=0.0, g2=2.79971718756897, p_value=0.09428093556593176, log_ratio=1.8349407537295037, score=2.79971718756897)]
[('perro', -5.92), ('comer', -1.97)]
Parámetros¶
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
target |
list[str] / list[list[str]] / dict[str, int] |
- | Palabras del corpus objetivo - un texto o una lista de textos - o sus frecuencias |
reference |
list[str] / list[list[str]] / dict[str, float] / FrequencyReference |
- | Palabras del corpus de referencia - un texto o una lista de textos -, sus frecuencias o una referencia por frecuencias |
measure |
str |
'log_likelihood' |
Medida de anyts.constants.KEYNESS_MEASURES para score y el orden |
min_freq |
int |
1 |
Frecuencia mínima de una palabra clave en su propio corpus |
positive |
bool |
True |
Palabras clave positivas (más frecuentes en el corpus objetivo) o negativas (más frecuentes en la referencia) |
top_n |
int |
None |
Número de palabras clave; None - todas |
n |
int |
1 |
Longitud de los N-gramas de las palabras de cada texto; 1 - las palabras |
Los parámetros y el corpus objetivo los comprueba check_keyness_params; un n mayor que 1 con frecuencias o con una FrequencyReference lanza ParameterError. Una referencia que no es una lista de cadenas, una lista de tales listas, un contador ni una FrequencyReference lanza SourceTypeError, y una frecuencia negativa, nan o infinita de un contador y un corpus sin palabras, o de menos de n palabras, lanzan SourceError.
reference también puede ser FreqDict, frente al cual target son formas. Un diccionario de frecuencias que no está descargado lanza DatasetNotFoundError. keyness comprueba sus parámetros y el corpus objetivo con check_keyness_params antes de leer FreqDict, así que un argumento erróneo falla antes de cargar el diccionario; el diccionario guarda palabras, así que un n mayor que 1 con él también lanza ParameterError antes de leerlo.
check_keyness_params(measure='log_likelihood', min_freq=1, top_n=None, target=None, n=1, positive=True)
Comprueba los parámetros de keyness antes de leer un diccionario de frecuencias: lanza ParameterError salvo que la medida sea una de KEYNESS_MEASURES, la frecuencia mínima un entero, el número de palabras clave None o un entero de al menos uno, la longitud de los N-gramas n un entero de al menos uno y positive un bool. Con target lanza además SourceTypeError salvo que el corpus objetivo sea una lista de cadenas, una lista de tales listas o un mapeo de cadenas a frecuencias enteras, y SourceError para una frecuencia negativa, nan o infinita.
Referencia por frecuencias¶
FrequencyReference(counts, size, missing=0.0, key=None, keep=None)
Un corpus de referencia descrito solo por sus frecuencias, como un diccionario de frecuencias construido a partir de un corpus demasiado grande para pasarlo como palabras:
| Campo | Tipo | Por defecto | Descripción |
|---|---|---|---|
counts |
dict[str, float] |
- | Frecuencias de las claves en el corpus de referencia |
size |
float |
- | Tamaño del corpus de referencia en palabras |
missing |
float |
0.0 |
Frecuencia de una clave que falta en counts |
key |
Callable |
None |
Clave de una palabra del corpus objetivo en counts, como su lema; None - la propia palabra |
keep |
Callable |
None |
Si una palabra del corpus objetivo se cuenta; None - todas las palabras |
Solo se cuentan las palabras del objetivo que keep deja pasar, bajo su key, tanto en las frecuencias como en el tamaño. Una clave que falta en counts tiene la frecuencia missing, como la frecuencia mínima de un diccionario: una cota superior, así que su palabra puede ser palabra clave positiva pero nunca negativa. Las palabras clave negativas salen solo de las claves de counts que keep deja pasar. Una frecuencia se comprueba al leerla, así que para las palabras clave positivas no se recorre un diccionario grande: una que no es un número lanza SourceTypeError, y una negativa, nan o infinita, SourceError. Un size o un missing que no es un número finito o es negativo lanza ParameterError, y un key o un keep que no se puede invocar, SourceTypeError.
El diccionario de frecuencias FreqDict de Google Books Ngram pasado como reference se convierte en una referencia así:
| Campo | FreqDict |
|---|---|
counts |
los ipm de FreqDict.word_ipm, incluidos los nombres propios, convertidos en apariciones en el corpus del diccionario |
size |
CORPUS_SIZE, 63 000 millones de palabras de los libros de 1980-2019 |
missing |
la frecuencia mínima del diccionario FreqDict.min_ipm, 0,1 ipm (unas 6300 apariciones) |
key |
lemma_key: una palabra clave puede llevar la etiqueta de otro lema, Roma se cuenta bajo romo |
keep |
las formas hechas de las letras de WORD_PATTERN; los números y las palabras con guion o con punto quedan fuera |
El corpus objetivo tiene que contarse como se contó el diccionario: formas con las palabras vacías, no lemas - lemma_key no es idempotente (estado - estar), así que WordsExtractor(use_lexemes=True) no sirve. El diccionario describe el registro de los libros, así que las palabras clave negativas de un texto son las de la prosa académica (de, social, país).
Frente al diccionario las palabras de una comedia de Lope de Vega del corpus de literatura dan sus personajes:
from ests import WordsExtractor
from ests.corpus import keyness
from ests.datasets import FreqDict, SpanishLiterature
text = next(SpanishLiterature().get_texts(author="lope", genre="drama"))
words = WordsExtractor(lowercase=True).extract(text)
for k in keyness(words, FreqDict(), top_n=5):
print(k.word, k.freq_target, round(k.ipm_reference, 2), round(k.g2, 1), round(k.log_ratio, 2))
laurencia 135 0.32 2528.7 14.96
mengo 105 0.13 2102.5 15.9
comendador 154 5.33 2059.9 11.09
frondoso 113 3.84 1515.6 11.12
barrildo 52 0.1 995.7 15.26
Resultado¶
Keyword(word, freq_target, freq_reference, ipm_target, ipm_reference, g2, p_value, log_ratio, score)
Una lista de tuplas con nombre Keyword por keyness descendente (los empates por frecuencia descendente y alfabéticamente, las palabras de medida indefinida al final); pd.DataFrame(keywords) da una tabla.
| Campo | Tipo | Descripción |
|---|---|---|
word |
str |
Palabra |
freq_target |
int |
Frecuencia en el corpus objetivo |
freq_reference |
float |
Frecuencia en el corpus de referencia |
ipm_target |
float |
Frecuencia en el corpus objetivo por millón de palabras, o de N-gramas |
ipm_reference |
float |
Frecuencia en el corpus de referencia por millón de palabras, o de N-gramas |
g2 |
float |
\(G^2\) con signo |
p_value |
float |
Valor p de \(G^2\) |
log_ratio |
float |
Log Ratio |
score |
float |
Valor de la medida elegida |
Medidas¶
Las medidas de measure por clave, con sus nombres y descripciones en anyts.constants.KEYNESS_MEASURES:
| Clave | Qué mide | Rango | Un valor mayor indica |
|---|---|---|---|
log_likelihood |
Significación de la diferencia de las frecuencias | Cualquier número | Un exceso más significativo en el corpus objetivo |
chi2 |
Significación de la diferencia, con la corrección de Yates | Cualquier número | Un exceso más significativo en el corpus objetivo |
diff |
Diferencia de las frecuencias por millón, en porcentaje de la referencia | Por encima de −100 | Un exceso mayor en el corpus objetivo |
log_ratio |
Logaritmo binario de la razón de las frecuencias por millón | Cualquier número | Un exceso mayor en el corpus objetivo |
bic |
Indicio de la diferencia: \(G^2\) penalizado por el tamaño de los corpus | Cualquier número | Un indicio más fuerte de un exceso en el corpus objetivo, para una palabra más frecuente en él |
ell |
Tamaño del efecto de \(G^2\) | De −1 a 1 por lo general, nan para frecuencias esperadas pequeñas |
Un exceso mayor en el corpus objetivo |
odds_ratio |
Razón de los momios de la palabra en los corpus | De 0 a inf, nan si la palabra ocupa los dos corpus |
Momios más altos en el corpus objetivo |
Cada medida es una función del módulo anyts.corpus.keyness de las frecuencias de una palabra y de los tamaños de los corpus, \(N = c + d\):
| Parámetro | Tipo | Por defecto | Descripción |
|---|---|---|---|
a |
float |
- | Frecuencia de la palabra en el corpus objetivo |
b |
float |
- | Frecuencia de la palabra en el corpus de referencia |
c |
float |
- | Tamaño del corpus objetivo |
d |
float |
- | Tamaño del corpus de referencia |
Una frecuencia nula en uno de los corpus se sustituye por 0.5 para %DIFF, Log Ratio y la razón de momios (Hardie 2014).
El módulo ests.corpus.keyness reexporta las funciones de las medidas (from ests.corpus.keyness import calc_log_likelihood).
Razón de verosimilitud¶
calc_log_likelihood(a, b, c, d)
La razón de verosimilitud de las frecuencias de la palabra frente a las esperadas \(E_1\) y \(E_2\); un término de frecuencia nula es cero. Los valores críticos son anyts.constants.G2_CRITICAL_VALUES: 3.84 para p < 0.05, 6.63 para p < 0.01, 10.83 para p < 0.001, 15.13 para p < 0.0001. El signo es negativo cuando la palabra es más frecuente en la referencia.
calc_p_value(g2)
El valor p de un \(G^2\) o de un ji cuadrado, sea cual sea su signo, según la distribución ji cuadrado con un grado de libertad; un array de valores da un array.
Ji cuadrado¶
calc_chi2(a, b, c, d)
El ji cuadrado con la corrección de Yates sobre la tabla de contingencia 2×2 de la palabra y las demás palabras de cada corpus. Cuando la corrección supera la diferencia, el estadístico es cero. El signo es negativo cuando la palabra es más frecuente en la referencia.
%DIFF¶
calc_diff(a, b, c, d)
La diferencia de las frecuencias \(NF\) por millón de palabras, en porcentaje de la frecuencia en la referencia.
Log Ratio¶
calc_log_ratio(a, b, c, d)
El logaritmo binario de la razón de las frecuencias \(NF\) por millón de palabras: uno significa que la palabra es el doble de frecuente en el corpus objetivo.
BIC¶
calc_bic(a, b, c, d)
El criterio de información bayesiano de \(G^2\). En valor absoluto, por encima de 2 es un indicio positivo de una diferencia, por encima de 6 un indicio fuerte, por encima de 10 muy fuerte; un valor de signo contrario al de \(G^2\), cuando \(\lvert G^2 \rvert < \ln N\), significa ausencia de indicio, no la dirección contraria.
ELL¶
calc_ell(a, b, c, d)
El tamaño del efecto de \(G^2\): la proporción de la mayor desviación posible respecto de las frecuencias esperadas \(E_1\) y \(E_2\). Crece sin límite a medida que la menor frecuencia esperada se acerca a uno y es nan cuando esa frecuencia es como mucho uno (un logaritmo nulo o negativo). El signo es negativo cuando la palabra es más frecuente en la referencia.
Razón de momios¶
calc_odds_ratio(a, b, c, d)
La razón de los momios de la palabra en los dos corpus: uno significa momios iguales. Una palabra que ocupa todo el corpus objetivo da inf, toda la referencia, 0, los dos, nan.