Saltar a contenido

Colocaciones

ests.corpus.collocations(), ests.corpus.Collocation

Descripción

Extracción de colocaciones: pares de palabras que aparecen juntas más a menudo de lo que daría la independencia - expresiones fijas (punto de vista, llevar a cabo), terminología, la combinatoria de una palabra. Las medidas de asociación son las de Sketch Engine y de nltk.metrics.association, y las pruebas las contrastan con NLTK.

Los pares de palabras son ordenados, como en NLTK: la palabra de la derecha aparece a no más de window palabras después de la de la izquierda, y cada par de posiciones se cuenta una vez; window=1 da bigramas. Dentro de la medida la frecuencia del par se divide por el tamaño de la ventana (Church y Hanks 1990, como en NLTK), para que la frecuencia esperada no dependa de la ventana y Dice y la sensibilidad mínima no superen uno; el campo freq_pair guarda la frecuencia sin dividir. Con window > 1 la escala de las medidas de Dice se desplaza por ello: un par siempre contiguo recibe un logDice de \(14 - \log_2 window\) - 13 con una ventana de 2, 11.68 con 5 - y no 14, como le dan los bigramas y Sketch Engine, que calcula logDice sobre la coocurrencia sin dividir; el máximo de 14 solo lo alcanza un par que aparece a todas las distancias dentro de la ventana. El parámetro node conserva los pares con la palabra dada a la izquierda o a la derecha: la combinatoria de una palabra.

Las palabras se comparan tal cual: la caja, la lematización y las palabras vacías corresponden a WordsExtractor; los lemas convienen a las expresiones fijas, las formas a las construcciones gramaticales.

Medidas

Para un par de palabras de frecuencias \(f_a\) y \(f_b\), una frecuencia del par \(f_{ab}\) y un número de palabras \(N\):

Medida Clave Fórmula Descripción
Información mutua mi \(\log_2 \frac{f_{ab} N}{f_a f_b}\) Church y Hanks (1990); sobrevalora los pares raros
MI³ mi3 \(\log_2 \frac{f_{ab}^3 N}{f_a f_b}\) Oakes (1998); favorece los pares frecuentes
t-score t_score \(\frac{f_{ab} - f_a f_b / N}{\sqrt{f_{ab}}}\) Church et al. (1991); favorece los pares frecuentes
Coeficiente de Dice dice \(\frac{2 f_{ab}}{f_a + f_b}\) no depende del tamaño del texto
logDice logdice \(14 + \log_2 \frac{2 f_{ab}}{f_a + f_b}\) Rychlý (2008); no depende del tamaño del texto, como máximo 14 (con ventana \(14 - \log_2 window\)), por debajo de cero - un vínculo débil; la medida por defecto, como en Sketch Engine
Razón de verosimilitud log_likelihood \(G^2 = 2 \sum O \ln \frac{O}{E}\) Dunning (1993); sobre la tabla de contingencia 2×2, nan si una de las palabras ocupa todo el texto
NPMI npmi \(\frac{MI}{-\log_2 (f_{ab} / N)}\) Bouma (2009); de −1 a 1, uno significa que las palabras solo aparecen juntas
Sensibilidad mínima min_sensitivity \(\min(\frac{f_{ab}}{f_a}, \frac{f_{ab}}{f_b})\) Pedersen (1998); de 0 a 1

Las medidas están disponibles como las funciones calc_mi, calc_mi3, calc_t_score, calc_dice, calc_logdice, calc_log_likelihood, calc_npmi, calc_min_sensitivity con los argumentos (freq_a, freq_b, freq_ab, n) del módulo ests.corpus.collocations (from ests.corpus.collocations import calc_logdice); sus nombres y descripciones están en ests.constants.COLLOCATION_MEASURES.

Parámetros

Parámetro Tipo Por defecto Descripción
words list[str] - Palabras del texto en orden
window int 5 Mayor distancia entre las palabras de un par
measure str logdice Medida de COLLOCATION_MEASURES
min_freq int 2 Frecuencia mínima de un par
node str None Palabra cuya combinatoria se busca; None - todos los pares
top_n int None Número de colocaciones; None - todas

Resultado

Una lista de tuplas con nombre Collocation por orden descendente de la medida y de la frecuencia del par (los empates, alfabéticamente); pd.DataFrame(found) da una tabla.

Campo Tipo Descripción
left str Palabra de la izquierda
right str Palabra de la derecha, dentro de la ventana tras la de la izquierda
freq_left int Frecuencia de la palabra de la izquierda
freq_right int Frecuencia de la palabra de la derecha
freq_pair int Frecuencia de la coocurrencia
score float Valor de la medida elegida

Ejemplo

Ejemplo

from ests import WordsExtractor
from ests.corpus import collocations

words = WordsExtractor(use_lexemes=True, lowercase=True).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."
)

collocations(words, window=2, top_n=1)
# [Collocation(left='en', right='ventana', freq_left=3, freq_right=3, freq_pair=3, score=13.0)]

[
    (c.left, c.right, round(c.score, 2))
    for c in collocations(words, window=1, node="gato", min_freq=1, measure="mi")[:2]
]
# [('gato', 'volver', 3.62), ('gato', 'estar', 2.62)]