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)})$
Introducción al Procesamiento de Lenguaje Natural
Introducción al Procesamiento de Lenguaje Natural
Evolución del NLP
Conceptos básicos de NLP
Fundamentos con NLTK
Configurar ambiente de trabajo
Palabras, textos y vocabularios
Tokenizacion con Expresiones Regulares
Estadísticas básicas del lenguaje
Distribuciónes de frecuencia de palabras
Refinamiento y visualización de cuerpos de texto
N-gramas y Colocaciones del lenguaje
¿Cómo extraer n-gramas de un texto en Python?
Colocaciones en Python
Colocaciones en gráficos de dispersión
Filtros y colocaciones en NLTK
Introducción a los recursos léxicos
Recursos léxicos en NLTK
NLTK para traducción de palabras
Introducción a WordNet
Explorando WordNet
Similitud Semantica con WordNet
Procesamiento de texto plano desde Web
Usando código estructurado: conexión de Drive a Google Colab
Usando código estructurado: Funciones externas
Perspectivas de lo que viene
Continúa con el Curso de Algoritmos de Clasificación de Texto
No tienes acceso a esta clase
¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera
Convierte tus certificados en títulos universitarios en USA
Antes: $249
Paga en 4 cuotas sin intereses
Termina en:
Aportes 24
Preguntas 4
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)})$
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?
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
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.
Apply sirve para ejecutar cualquier cosa sobre el dataframe, lo malo de esto es que como es demasiado general es difícil de optimizar por lo que es muuy lento en comparación de otras funciones especializadas que pandas tiene.
Aquí una pregunta de stack overflow dondese discute.
https://stackoverflow.com/questions/54432583/when-should-i-not-want-to-use-pandas-apply-in-my-code
Que son?
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)
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]
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.
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.
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 🤔
¿Qué son las colocaciones ?
Recomiendo este video para comprender mejor la idea de COLOCACION: https://www.youtube.com/watch?v=kH4r2rtRLZ8
¿Alguien sabe cómo escribir ecuaciones en una Notebook? Ya sea Jupyter o Colab
Por si no quedo muy claro el concepto de PMI este articulo lo explica bastante bien.
Understanding Pointwise Mutual Information in NLP
En el calculo del PMI creo que no se están calculando probabilidades en el numerador ni el denominador sino en el cociente final (Fernando menciona probabilidad que es un numero entre 0 y 1. Creo que son las posibilidades o los conteos de cada estructura analizada). La explicación sin embargo esta decente.
se me estallo la cabeza *😦
Alguien tien claro porque se utilizo un logaritmo en base 2, en lugar del natural o bien base 10? Gracias
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.
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.
¿Quieres ver más aportes, preguntas y respuestas de la comunidad?