jueves, 30 de enero de 2014

Análisis de Sentimientos: un algoritmo para empezar

Lo más sencillo es detectar la polaridad de una actitud, es decir, detectar si una critica, por ejemplo, es positiva o negativa.
Voy a explicar una versión adaptada del algoritmo de Pang y Lee para detectar la polaridad de una critica cinematográfica. Pueden encontrar más información sobre su trabajo en esta página: http://www.cs.cornell.edu/people/pabo/movie-review-data/

Dadas las siguientes criticas literarias (prestadas de cinesargentinos.com.ar):

Critica 1:

Hace mucho tiempo no veía una peli tan buena como esta. Original y hermosa desde todo punto de vista, las canciones, los chistes y los efectos visuales. Increible como mejoraron en los últimos años con las expresiones de los personajes animados! Una obra maestra desde donde se la mire! No entendia como Monster University no había sido nominada al oscar, pero luego de ver Frozen, entiendo que Monster's no tenía nada que hacer. Es de las pelis que, para aquellos que crecimos con los clasicos de disney como el rey leon, tarzan o el jorobado de Notre dame, nos reavivan el niño que tenemos adentro. Si o si verla en 3D.

Critica 2:

La película es malísima. Está entre las peores que he visto en mi vida, sino es la peor. Es lineal, predecible, aburrida. Solo apta para menores de 13 años. Deberían dedicarse a otra cosa todos los que intervinieron para que exista. Realmente es muy recomendable que NO LA VEAN. Después no digan que no les advertí.

Para una persona es muy sencillo determinar que la critica 1 es positiva y que la critica 2 es negativa, pero ¿cómo podría resolverse esto por software?



Algoritmo para empezar (adaptado de Pang y Lee):

  • tokenización del texto (visto en detalle en este post: Normalización del Texto => Tokenización)
  • extracción de características (palabras o frases claves)
  • clasificación utilizando distintos algoritmos de clasificación:
    • Naïve Bayes
    • MaxEnt
    • SVM

Tokenización, problemas comunes:

Más allá de lo explicado anteriormente sobre tokenización, es común, en este tipo de escenario, encontrarse con alguno de los siguientes problemas:
  • Lidiar con los tags XML o HTML
  • Tener que reconocer las marcas de Twitter (si queremos sacar información de ahí) como los nombres de usuario y los hash tags
  • El uso de mayúsculas. Generalmente nos va a interesar conservar las mayúsculas de las palabras en las distintas fases del algoritmo. 
  • Números de teléfono y fechas.
  • Emoticones: es muy útil detectar los emoticones cuando se está haciendo análisis de sentimientos. 

Extracción de características:

En esta etapa tenemos dos problemas:

  • ¿Cómo lidiar con la negación?
    • No me gustó esta película.
                vs.
    • Me gustó esta película.

  • ¿Qué conviene usar?
    • todas las palabras 
    • solo los adjetivos
Se demostró que al menos con la información de IMDB, es conveniente utilizar todas las palabras. Se obtienen así mejores resultados y en términos generales diría que siempre conviene utilizar todas las palabras ya que a veces los sustantivos y los verbos nos dan información valiosa sobre el juicio de valor de un critica. 

Para el problema de la negación vamos a utilizar el método propuesto por Das y Chen, que consiste en agregar el prefijo "NO_" a todas las palabras que hay entre la negación y próximo signo de puntuación. 

No me gustó esta película, pero yo...
||
\/
No NO_me NO_gustó NO_esta NO_película pero yo

Hay que tener en cuenta que este método duplica nuestro vocabulario ya que para cada palabra puede aparece su versión con "NO_", pero al crear palabras nuevas para expresar sentimientos opuestos estamos simplificando enormemente la tarea de clasificación.

Clasificación:

Ya que hablamos de Naïve Bayes, recordemos lo que se vio en post anteriores:

Este clasificador calcula la posibilidad de que un documento d, pertenezca a una clase c.
Calcula dicha probabilidad para todas las clases c y se queda con la clase c que arroje la probabilidad más alta.

cmap =  argmax P(cj P(xi | cj)
                  cj ∈ C        i ∈ Posiciones

los xi son las características del documento, es decir las palabras. Ya que un documento es representado como una "bolsa" de palabras.

Y cada una de las P(xi | cj) es calculada, usando Laplace smoothing:
^          
P(w | c) = cantidad (w | c) +1          
                 cantidad(c) + |V+1|

Naïve Bayes multinomial binarizada (o booleana):

Cómo lo que nos interesa es saber si una critica fue buena o mala, vamos a tener solo dos conjuntos, es decir dos clases. En este escenario si la palabra "fantástica" aparece una vez en la critica o aparece cinco no cambia demasiado el resultado.

Para aplicar esta variante del algoritmo, tenemos que agregar un paso extra: antes de comenzar a calcular las probabilidades de las clases y a contar las palabras vamos a recorrer uno por uno todos los documentos en el conjunto de entrenamiento y a eliminar las palabras duplicadas. Incluso en los documentos de prueba tenemos que eliminar las palabras duplicadas.

En términos generales esta variante del algoritmo da mejores resultados que la versión tradicional que cuenta todas las ocurrencias de las palabras. [1]


Entrenamiento del algoritmo de clasificación:

Lo ideal es partir el conjunto de entrenamiento en 10 partes, de esas 10 partes quedarse con 9 para entrenar el algoritmo y usar la décima como conjunto de prueba, obtener luego la precisión del clasificador y por último rotar el conjunto de prueba y repetir los pasos.


Primera iteración: P E E E E E E E E E
Segunda iteración: E P E E E E E E E E
Tercera iteración: E E P E E E E E E E
Cuarta iteración: E E E P E E E E E E
Quinta iteración: E E E E P E E E E E
Sexta iteración: E E E E E P E E E E
                                    ....
etc...

Calculando la precisión, la exhaustividad o el valor F del algoritmo (ver post anterior) para cada subconjunto, podemos encontrar al que optimice nuestro clasificador Naïve bayes multinomial binarizado.


Problemas de este sencillo algoritmo:

La clasificación de textos y en particular el análisis de sentimientos no es una tarea sencilla de realizar. Hay muchos casos, muchas criticas, que son difíciles de clasificar con el algoritmo que se vio. Enumero un par de problemas comunes:

1)  Sutilezas:

El siguiente es un ejemplo (traducido al castellano) de una critica de perfumes señalada por los mismos Pang y Lee


  • "Si usted está leyendo esto porque es su fragancia favorita, por favor úsela exclusivamente en su casa  y cierre bien las ventanas."


Muy difícil de detectar. Otro ejemplo, es el siguiente fragmento de una critica literaria del sitio: cinesargentinos.com.ar:


  • "podemos sentirnos tocados con experiencias muy profundas"

 2) Expectativas frustradas:


  • La película debería ser excelente ya que cuenta con grandes actores y una  banda sonora fantástica, sin embargo es terriblemente aburrida



Referencias:

[1]    Metsis, Vangelis, Ion Androutsopoulos, and Georgios Paliouras. "Spam filtering with naive bayes-which    naive bayes?." CEAS. 2006.



No hay comentarios:

Publicar un comentario