Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Colocaciones en Python

12/24
Recursos

Aportes 18

Preguntas 3

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

Me causa un poco de duda al sacar P(w_1,w_2) no tendríamos que dividir la columna entre el total de bigramas?

Por si quieren escribir la formula en Latex en su Notebook para que se vea bien bonita:

Aquí les dejo el código en Latex:

$P M I = log (\frac{P(w_1, w_2)}{P(w_1)P(w_2)})$

Colocaciones: Son secuencias de palabras que ocurren en textos y conversaciones con una frecuencia inusualmente alta. Existe evidencia estadística de que estas palabras ocurren con esa frecuencia inusualmente alta, y esto nos da la idea de que podemos construir algunos números, algunas métricas que nos permiten identificar de manera sistemática estas colocaciones.

Francisco Camacho mis respeto, tremendo profesor

A lo mejor tuvieron el mismo problema que yo, word_0_freq y word_1_freq se obtienen de filtered_word_dist

df['bi_gram_freq'] = df['bi_grams'].apply(lambda x: filtered_bigram_dist[x]) 
df['word_0_freq'] = df['word_0'].apply(lambda x: filtered_word_dist[x])
df['word_1_freq'] = df['word_1'].apply(lambda x: filtered_word_dist[x])

Pero siguen siendo frecuencias, asi que la probabilidad, en terminos frecuentistas tal vez se deba cambiar a len(filtered_bigrams) /filtered_word_dist[x]

Recomiendo este video para comprender mejor la idea de COLOCACION: https://www.youtube.com/watch?v=kH4r2rtRLZ8

  • Que son?

    • Son secuencias de palabras que suelen ocurrir ven textos o conversiones con una Frecuencia inusualmente alta
    • Las colocaciones de una palabra son declaraciones formales de donde suele ubicarse típicamente esa palabra
  • Coding

    reconstruimos la lista

    md_bigrams = list(bigrams(text1))
    
    threshold = 2
    

    Ahora filtramos

    filtered_bigrams = [bigram for bigram in md_bigrams if len(bigram[0])>threshold and len(bigram[1])>threshold]
    filtered_bigram_dist = FreqDist(filtered_bigrams)
    

    Ahora se introducen los Dataframes, el objeto dataframe gestiona columna y filas

    df = pd.DataFrame()
    
    df['bi_grams']=list(set(filtered_bigrams))
    

    Separamos por palabras por cada bigrama

    df['word_0']=df['bi_grams'].apply(lambda x: x[0])
    df['word_1']=df['bi_grams'].apply(lambda x: x[1])
    

    Para crear distribuciones de palabras filtrado

    filtered_words = [word for word in text1 if len(word)>threshold]
    filtered_words_dist = FreqDist(filtered_words)
    

    y para agregarlo en el Datframe

    df['bi_gram_freq'] = df['bi_grams'].apply (lambda x:filtered_bigram_dist[x])
    df['word_0_freq']= df['word_0'].apply (lambda x:filtered_words_dist[x])
    df['word_1_freq']=df['word_1'].apply (lambda x:filtered_words_dist[x])
    
  • PMI

    df['PMI']= df[['bi_gram_freq', 'word_0_freq','word_1_freq']].apply(lambda x: np.log2(x.values[0]/(x.values[1]*x.values[2])), axis =1)
    
    df.sort_values(by = 'PMI', ascending= False)
    

¿Alguien sabe cómo escribir ecuaciones en una Notebook? Ya sea Jupyter o Colab

En la formula de PMI, lo que denotan como probabilidades no es congruente con el uso que se le dio. Deberían cambiarlo con conteo o frecuencia de los N-gramas y las palabras. Ya que se reemplazaron por estos y no por una probabilidad.

Por si no quedo muy claro el concepto de PMI este articulo lo explica bastante bien.
Understanding Pointwise Mutual Information in NLP

¿Qué son las colocaciones ?

Ojo que en el cálculo no estamos normalizando las probabilidades, pero todos los PMI son proporcionales a sus valores reales por una constante, y podemos dejarlo así siempre y cuando únicamente nos importe el orden de PMI entre bigramas y no el valor exácto del PMI, en cuyo caso sería necesario normalizar 🤔

Alguien tien claro porque se utilizo un logaritmo en base 2, en lugar del natural o bien base 10? Gracias

Si te quedaste con dudas de la función apply, no te preocupes, aquí te dejó la documentación de Pandas para que le eches un ojo.

Para poder escribir las ecuaciones que vemos en el notebook se una LaTeX, les dejo la línea que use en el mío:

\begin{equation}
    PMI = \log\left(\dfrac{P(w_{1},w_{2})}{P(w_{1}) P(w_{2})}\right)
\end{equation}

Hola, me gustaría aportar algo:

En la parte donde Francisco crea el dataframe con list y sets:

df = pd.DataFrame()
df['bi_grams'] = list(set(filtered_bigrams))

también se puede hacer con diccionarios de la siguiente manera:

filtered_bigram_dist = FreqDist(filtered_bigrams)
filtered_bigram_dict = dict(filtered_bigram_dist)

df_2 = pd.DataFrame()
df_2['bi_grams'] = filtered_bigram_dict.keys()

Al final resulta con el mismo numero de biagramas y no afecta el resultado.
Saludos.

Creo que hay un error en la explicación, en estadística el coeficiente de correlación entre dos o más variables es el que mide cuanta relación hay entre ellas, ahora el profesor dice que los valores tienden a cero (yo con los mismos datos y con otros he tenido diferentes resultados y no todos son menores que cero, por eso me puse a buscar mis apuntes de estadística xD).

Al grano, este coeficiente va desde -1 a 1 y determina que hay relación (positiva o negativa) siempre y cuando no sean cero, cuando el valor es cero significa que no hay relación, es decir que esas variables son independientes mientras que cuando vale 1, por ejemplo, significa que están completamente relacionados.

¿Esto que tiene que ver? Pues bien, tiene que ver en el hecho de que cuando estamos comparando estas listas de n-gramas lo que intentamos hacer es ver cuán relacionadas están entre ellas, por ejemplo, si estuviéramos hablando de España en un documento oficial seguramente habría “Reino de España” como una frase bastante común, con lo cual “reino” y “españa” tendrían que tener un PMI alto (en este caso por ejemplo 0.95) mientras que “silla” y “españa” probablemente tengan un PMI de 0.

Para terminar, creo que los valores no siempre son cero o negativos y de hecho no deberían serlo, si alguien comprende la razón del porqué indica el profe que mayormente salen valores negativos que lo indique por favor.

Curioso que not sea de las más usadas. Curioso porque la mejor forma de demostrar que algo es verdadero es negándolo la premisa que lo contrasta y para demostrar algo s falso, es igual, negándolo, jejejejeje.

Bueno, o al menos así es en lógica proporcional.