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.
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
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}$.
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.
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)
Algorithm | Macro | Micro | Positive | Negative | Neutral |
---|---|---|---|---|---|
HP Haven | 0.5631 | 0.5986 | 0.5704 | 0.4642 | 0.6547 |
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 |
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 |
Suponiendo que se tiene instalada la distribución de anaconda
conda install -c ingeotec microtc
microtc-params -k 0.7 -n 16 -s 32 -H -o semeval2016.params semeval2016-train.json.gz
microtc-train -m semeval2016.params -o semeval2016.model semeval2016-train.json.gz
{
"_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"
}
microtc-predict -m semeval2016.model -o semeval2016.predict semeval2016-gold.json.gz
microtc-perf semeval2016-gold.json.gz semeval2016.predict
{
"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 |
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))
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))