Aprendizaje computacional en grandes volúmenes de texto

Mario Graff (mgraffg@ieee.org, mario.graff@infotec.mx)

Sabino Miranda (sabino.miranda@infotec.mx)

Daniela Moctezuma (dmoctezuma@centrogeo.edu.mx)

Eric S. Tellez (eric.tellez@infotec.mx)

CONACYT, INFOTEC y CentroGEO

https://github.com/ingeotec

¿Qué es Big Data?

  • Journal of Big Data
    • Captura de datos y almacenamiento
    • Visualización
    • Algoritmos de aprendizaje para Big Data
    • Herramientas para data mining
  • Big Data Research
    • Todos los aspectos fundamentales a Big Data
    • Artículos en plataformas específicas para tratar Big Data
    • Promover ciencia de datos (Data Science) y colaboración interdisciplinaria
    • Uso de big data en dominios específicos
  • IEEE Transactions on Big Data
    • Investigación interdisciplinaria
    • Manejo de datos
    • Visualización
    • Infraestructura, rendimiento

Data mining

  • Data Mining and Knowledge Discovery
    • Editorial - What to do with all this data?
    • Extraer información de bases de datos
    • Métodos de data mining
    • Algoritmos para data mining
    • Aplicaciones
  • Obtener conocimiento de los datos
  • Técnicas para procesar datos
  • Técnicas de aprendizaje

Ciencia de Datos

  • International Journal of Data Science and Analytics
    • Investigación guiada por los datos
    • Trabajo interdisciplinario
    • Metodología, teorías, tecnologías y aplicaciones para los datos
  • Experto en el dominio
  • Experto en la técnica
  • Capacidad para manejo de información

Objetivo

El alumno será capaz de crear modelos de texto multilenguaje aplicables a grandes volúmenes de información. Sobre estos modelos, el alumno será capaz de aplicar algoritmos de aprendizaje supervisado para diferentes dominios de aplicación, como por ejemplo, clasificadores de polaridad, determinar la autoría basado en el texto, determinar la temática de un texto, entre otras.

Temas

  • Introducción
    • Motivación (análisis de sentimientos, detección de predadores, spam, género, edad, autoría en general, marketing, prestigio, etc)
    • Estado del arte (competencias)
    • Uso de herramientas: $\mu$TC, Python, numpy, nltk, sklearn
  • Representación vectorial del texto
    • Normalización
    • Tokenización (n-words, q-grams, skip-grams)
    • Pesado de texto (TFIDF)
    • Medidas de similitud
  • Aprendizaje supervisado
    • Modelo general de aprendizaje; Entrenamiento, test, score (accuracy, recall, precision, f1)
    • Máquinas de soporte vectorial (SVM)
    • Programación genética (EvoDAG)
    • Distant supervision
  • $\mu$TC
    • Pipeline de transformaciones
    • Optimización de parámetros
    • Clasificadores
    • Uso del $\mu$TC
  • Aplicaciones
    • Análisis de sentimientos
    • Determinación de autoría
    • Clasificación de noticias
    • Spam
    • Género y edad
  • Conclusiones

Introducción - 5V

  • Volumen
    Cantidad de datos generados

  • Velocidad
    Generación de datos

  • Variedad
    Tipos de datos generados

  • Veracidad
    Calidad de los datos

  • Valor
    Capacidad de generar valor

Aprendizaje Computacional ... - ¿Big Data?

  • ¿Volumen?
    Se puede aplicar a grandes volúmenes de texto

  • ¿Velocidad?
    Se generar varios tweets por segundo

  • ¿Variedad?
    ... es texto no estructurado

  • Veracidad
    ... es comunicación informal

  • Valor
    Minería de opinión.

Herramientas de Big Data

Que usamos

  • Cluster de Penguin Computing
    • 1 cabeza con 32 hilos y 66 GB mem
    • 5 nodos con 32 hilos 198 o 128 GB mem
    • 1 nodo con dos tarjetas xeon phi
  • CentOS 7
  • slurm - Manejador de trabajos
  • gluster - sistema de archivos scalable - 55 TB
  • Network File System (NFS)
  • Python

Herramientas propias

  • B4MSA
    A Baseline for Multilingual Sentiment Analysis
    B4MSA is a Python Sentiment Analysis Classifier for Twitter-like short texts. It can be used to create a first approximation to a sentiment classifier on any given language. It is almost language-independent, but it can take advantage of the particularities of a language.
  • $\mu$TC
    $\mu$TC follows a minimalistic approach to text classification. It is designed to tackle text-classification problems in an agnostic way, being both domain and language independent.
  • ¿Dónde quedaron las herramientas de Big Data?

Motivación

  • Generar valor
  • Resolver problemas interdisciplinarios
  • Problemas productivos del sector público y privado
  • Extender la frontera del conocimiento

Qué problemas

  • Análisis de sentimientos
  • Detección de predadores
  • Detección de spam
  • Identificación de género
  • Identificación de edad
  • Marketing
  • Prestigio

Competencias

  • Análisis de sentimientos
    • SEMEVAL - Ingles
    • TASS - Español
    • SENTIPOLC - Italiano
  • Autoría en PAN 2016
    • Edad - 18-24; 25-34; 35-49; 50-64; 65+
    • Género
    • Español
    • Holandés
    • Ingles

Categorización de texto

  • Reuters 8, 10
  • 20-Newsgroup
  • WebKB
  • CADE
  • spam

Categorización de texto

El problema consiste en, dado un texto $d$, determinar la(s) categoría(s) a la que pertenece en un conjunto $C$ de categorias, previamente conocido.

Más formalmente:

Dado un conjunto de categorias $\cal{C} = \{c_1, ..., c_m\}$, determinar el subconjunto de categorias $C_d \in \wp(\cal{C})$ a las que pertenece $d$.

Notese que $C_t$ puede ser vacio o $\cal{C}$.

Clasificación de texto

La clasificación de texto es una especialización del problema de categorización, donde $|C_d| = 1$, esto es $d$ solo puede ser asignado a una categoría.

Es un problema de interés en la industria y la acádemia, con aplicaciones variadas a distintas áreas del conocimiento.

  • Análisis de sentimiento
  • Determinación de autoría, e.g., género, edad, estilo, etc.
  • Detección de spam
  • Categorización de noticias
  • Clasificación de idioma

In [ ]:
from IPython.core.display import HTML, Image, Markdown
import sys
import json
sys.path.append("microTC")
from microtc.textmodel import TextModel
from itertools import combinations
from graphviz import Digraph
dot = Digraph(comment='microtc pipeline', format="png")
# dot.engine = 'circo'
dot.graph_attr['rankdir'] = 'LR'
dot.node('i', '', style="invis")
dot.node('n', 'Normalización')
dot.node('t', 'Tokenización')
dot.node('w', 'Pesado')
dot.node('c', 'Clasificación')
dot.node('o', '', style="invis")
dot.edge('i', 'n', label="texto entrada")
dot.edge('n', 't', label="texto normalizado")
dot.edge('t', 'w', label="bolsa de palabras")
dot.edge('w', 'c', label="vector con pesos")
dot.edge('c', 'o', label="clase")
pipeline = dot.render("fig-pipeline", view=False)

Nuestro Enfoque

Por su complejidad, trabajar en NLP tiene una gran cantidad de problemas abiertos, en particular nosotros nos enfocamos en la clasificación de texto escrito de manera informal (e.g., Twitter).

Para esto se utiliza un pipeline estándar

SEMEVAL2016

Algorithm Macro Micro Positive Negative Neutral
HP Haven 0.5631 0.5986 0.5704 0.4642 0.6547
Google 0.3858 0.3952 0.5606 0.3851 0.2118
Sentiment140 0.4901 0.5562 0.4900 0.3370 0.6433
Meaning cloud 0.5171 0.5252 0.5718 0.4690 0.5104
B4MSA 0.4676 0.5280 0.5987 0.2922 0.5120
$\mu$TC 0.4748 0.5227 0.5958 0.3255 0.5030
B4MSA + EvoDAG 0.4853 0.4971 0.6107 0.4353 0.4101
B4MSA + EvoDAGv0.3.6 0.5016 0.5115 0.6145 0.4507 0.4395
B4MSA + EvoDAGv0.3.8 0.4834 0.4958 0.6156 0.4347 0.3999

TASS 2015

Algorithm Macro Micro Positive Negative Neutral
HP Haven 0.5011 0.5350 0.5354 0.3774 0.5905
Sentiment140 0.0621 0.0590 0.1165 0.0836 0.0482
Meaning cloud 0.6431 0.6500 0.7208 0.6073 0.6012
B4MSA 0.6227 0.6330 0.7141 0.6720 0.4821
$\mu$TC 0.6286 0.6360 0.7207 0.6359 0.5292
B4MSA + EvoDAG 0.6728 0.6740 0.7356 0.7026 0.5802
B4MSA + EvoDAGv0.3.6 0.6724 0.6740 0.7361 0.7026 0.5785
B4MSA + EvoDAGv0.3.8 0.6624 0.6640 0.7365 0.6897 0.5610

$\mu$TC - Instalación

Suponiendo que se tiene instalada la distribución de anaconda

conda install -c ingeotec microtc

$\mu$TC - Optimizar parámetros

microtc-params -k 0.7 -n 16 -s 32 -H -o semeval2016.params semeval2016-train.json.gz

$\mu$TC - Generar modelo

microtc-train -m semeval2016.params -o semeval2016.model semeval2016-train.json.gz

Parámetros

{
    "_accuracy": 0.61125,
      ...
    "_macrof1": 0.5435202072253765,
    "_microf1": 0.61125,
    "_score": 0.5435202072253765,
    "_time": 12.07932186126709,
    "_weightedf1": 0.5967396051322755,
    "del_diac": true,
    "del_dup": false,
    "del_punc": true,
    "emo_option": "none",
    "lc": false,
    "num_option": "delete",
    "tfidf": true,
    "token_list": [
      -2,
      -1,
      5
    ],
    "token_max_filter": 1.0,
    "token_min_filter": -1,
    "url_option": "group",
    "usr_option": "group"
  }

$\mu$TC - predicción

microtc-predict -m semeval2016.model -o semeval2016.predict semeval2016-gold.json.gz

$\mu$TC - rendimiento

microtc-perf semeval2016-gold.json.gz semeval2016.predict

Rendimiento

{
  "accuracy": 0.5190965490500193,
  "f1_negative": 0.29926410466067044,
  "f1_neutral": 0.5098260673142083,
  "f1_positive": 0.5855122160308616,
  "filename": "semeval2016.predict",
  "macrof1": 0.4648674626685801,
  "microf1": 0.5190965490500193
}
Algorithm Macro Micro Positive Negative Neutral
$\mu$TC 0.4748 0.5227 0.5958 0.3255 0.5030

Prediciendo algunas oraciones


In [ ]:
texts = ['good morning', 'this has been a bad day']
print(texts)

In [ ]:
import tempfile
import json
import os
fname = tempfile.mktemp() + '.json'
output = tempfile.mktemp() + '.json'
with open(fname, 'w') as fpt:
    [fpt.write(json.dumps(dict(text=i)) + '\n') for i in texts]
!microtc-predict -m dataset/sentiment/semeval2016.model -o $output $fname
res = open(output).readlines()
os.unlink(fname)
os.unlink(output)

In [ ]:
print(json.dumps(json.loads(res[0]), indent=2))

In [ ]:
print(json.dumps(json.loads(res[1]), indent=2))

Servicio Web para Análisis de Sentimientos (SWAP)

Preguntando buenos días a http://dev.ingeotec.mx/sentiment


In [ ]:
import requests
data = dict(text='buenos días')
response = requests.post('http://dev.ingeotec.mx/sentiment',
			 json=dict(data=data,
				   auth='ciia2016',
				   version='1.2',
				   language='es_mx')).json()
print(json.dumps(response, indent=2))

Herramientas para tener en cuenta

¿Preguntas?

  • ¿Por qué en SEMEVAL2016 hay tanta diferencia en entrenamiento y prueba?
  • Generar modelos para las diferentes competencias
  • Analizar los parámetros que salen