Saltar a contenido

Colocaciones

collocations(words, window=5, measure='logdice', min_freq=2, node=None, top_n=None, side=None)

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

Los pares son ordenados, como en NLTK: la palabra de la derecha aparece como mucho window palabras después de la de la izquierda, y cada par de posiciones se cuenta una vez; window=1 da bigramas. Las medidas toman la frecuencia del par dividida por la ventana (Church y Hanks 1990, como en NLTK), lo que mantiene la frecuencia esperada independiente de la ventana y Dice y la sensibilidad mínima en uno como máximo; freq_pair queda sin dividir. Así, con window > 1 un par siempre contiguo recibe un logDice de \(14 - \log_2 window\) (13 con una ventana de 2), no 14 como en Sketch Engine con su coocurrencia sin dividir; para 14 hace falta un par a todas las distancias dentro de la ventana. node conserva los pares con la palabra dada a cualquiera de los dos lados, y side, a uno de ellos: "left" los colocativos antes del nodo, "right" los de después.

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; los lemas convienen a las expresiones fijas, las formas a las construcciones gramaticales.

ests.corpus reexporta la función del núcleo anyTS. Las palabras se extraen con WordsExtractor; para las expresiones fijas del español como punto de vista o llevar a cabo conviene usar sus lemas (use_lexemes=True).

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)
[
    (c.left, c.right, round(c.score, 2))
    for c in collocations(words, window=1, node="gato", min_freq=1, measure="mi")[:2]
]
[Collocation(left='en', right='ventana', freq_left=3, freq_right=3, freq_pair=3, score=13.0)]
[('gato', 'volver', 3.62), ('gato', 'estar', 2.62)]

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 anyts.constants.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
side str None Con un nodo, el lado de sus colocativos: "left" o "right"; None - los dos

Unas palabras que no son una lista de cadenas lanzan SourceTypeError, y la falta de palabras, SourceError. Una medida desconocida, un window o un top_n que no es un entero de al menos uno, un min_freq que no es un entero, un node que no es una cadena y un side distinto de "left" y "right" o sin un nodo lanzan ParameterError.

Resultado

Collocation(left, right, freq_left, freq_right, freq_pair, score)

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

Medidas

Las medidas de measure por clave, con sus nombres y descripciones en anyts.constants.COLLOCATION_MEASURES:

Clave Qué mide Rango Un valor mayor indica
mi Frecuencia del par frente a la esperada, en bits Cualquier número Una asociación más fuerte
mi3 MI con la frecuencia del par al cubo Cualquier número Una asociación más fuerte
t_score Diferencia entre la frecuencia observada y la esperada del par Cualquier número Una asociación más segura
dice Proporción del par en las apariciones de las dos palabras 0-1 Una asociación más fuerte
logdice Coeficiente de Dice en escala logarítmica 14 o menos Una asociación más fuerte
log_likelihood Significación de la asociación 0 o más, nan cuando una palabra ocupa todo el texto o una celda es negativa Una desviación más significativa respecto de la independencia, tanto para los pares que se atraen como para los que se evitan
npmi MI normalizada por la información del par De −1 a 1 Una asociación más fuerte
min_sensitivity Menor proporción del par en las apariciones de una u otra palabra 0-1 Una asociación más fuerte

Cada medida es una función del módulo anyts.corpus.collocations de las frecuencias de las palabras y del par y del número de palabras:

Parámetro Tipo Por defecto Descripción
freq_a int - Frecuencia \(f_a\) de la primera palabra
freq_b int - Frecuencia \(f_b\) de la segunda palabra
freq_ab float - Frecuencia \(f_{ab}\) del par
n int - Número de palabras \(N\) del texto

Un par de frecuencia nula da nan para MI, MI³, el t-score, logDice y NPMI.

El módulo ests.corpus.collocations reexporta las funciones de las medidas (from ests.corpus.collocations import calc_logdice).

Información mutua

mi · Church y Hanks (1990)

calc_mi(freq_a, freq_b, freq_ab, n)

La información mutua puntual de las dos palabras; sobrevalora los pares raros.

\[ \log_2 \frac{f_{ab} N}{f_a f_b} \]

MI³

mi3 · Oakes (1998)

calc_mi3(freq_a, freq_b, freq_ab, n)

La información mutua con la frecuencia del par al cubo, que favorece los pares frecuentes.

\[ \log_2 \frac{f_{ab}^3 N}{f_a f_b} \]

t-score

t_score · Church et al. (1991)

calc_t_score(freq_a, freq_b, freq_ab, n)

La diferencia entre la frecuencia observada y la esperada del par dividida por la raíz de la observada; favorece los pares frecuentes.

\[ \frac{f_{ab} - f_a f_b / N}{\sqrt{f_{ab}}} \]

Coeficiente de Dice

dice

calc_dice(freq_a, freq_b, freq_ab, n)

La proporción del par en las apariciones de las dos palabras; no depende del tamaño del texto.

\[ \frac{2 f_{ab}}{f_a + f_b} \]

logDice

logdice · Rychlý (2008)

calc_logdice(freq_a, freq_b, freq_ab, n)

El coeficiente de Dice en una escala logarítmica binaria, la medida por defecto, como en Sketch Engine. No depende del tamaño del texto; por debajo de cero el vínculo es débil.

\[ 14 + \log_2 \frac{2 f_{ab}}{f_a + f_b} \]

Razón de verosimilitud

log_likelihood · Dunning (1993)

calc_log_likelihood(freq_a, freq_b, freq_ab, n)

\(G^2\) sobre la tabla de contingencia 2×2 de las dos palabras: las frecuencias observadas \(O\) - \(f_{ab}\), \(f_a - f_{ab}\), \(f_b - f_{ab}\) y \(N - f_a - f_b + f_{ab}\) - frente a las esperadas \(E\) bajo independencia. Una palabra que ocupa todo el texto, o una celda negativa, como la de una palabra emparejada consigo misma en una ventana mayor que uno, da nan.

\[ G^2 = 2 \sum O \ln \frac{O}{E} \]

NPMI

npmi · Bouma (2009)

calc_npmi(freq_a, freq_b, freq_ab, n)

La información mutua normalizada por la información del par: uno significa que las palabras solo aparecen juntas. Un par tan frecuente como largo es el texto da nan.

\[ \frac{MI}{-\log_2 (f_{ab} / N)} \]

Sensibilidad mínima

min_sensitivity · Pedersen (1998)

calc_min_sensitivity(freq_a, freq_b, freq_ab, n)

La menor de las proporciones del par en las apariciones de cada palabra.

\[ \min\left(\frac{f_{ab}}{f_a}, \frac{f_{ab}}{f_b}\right) \]