civio / verba

Explora los Telediarios de RTVE desde 2014
https://verba.civio.es
GNU Affero General Public License v3.0
33 stars 5 forks source link

Probar Named Entity Recognition (NER) en el corpus de telediarios #10

Closed dcabo closed 5 years ago

dcabo commented 5 years ago

I started testing entity extraction with TextRazor, just so I didn't have to install anything, but we should explore other alternatives.

TextRazor seems to do a good work getting entities, and it seems like a valuable addition to segmentation (#7). It looks better if we clean the txt file a bit, i.e. join the fragmented sentences. This is something we may have to do anyway, for clarity: join all sentences in a block. But the results seem to be the same.

dcabo commented 5 years ago

Estoy empezando a hacer algunas pruebas básicas con distintos proveedores / librerías. Por empezar con algo sencillo, voy a usar el inicio del Telediario que escogí al azar, modificando y añadiendo algunas cosillas (¡Aznar no dijo eso!):

José María Aznar ha negado una caja B en el PP y que conociera al cabecilla de la Gürtel, Francisco Correa. Aznar también ha dicho que la culpa de todo es de Bárcenas.

En deportes, hoy es día importante para el fútbol: vuelve la Liga de Campeones, con cuatro equipos españoles. Es el día que los muy futboleros llevan esperando meses. Abre el fuego el Barcelona, que estrena horario de tarde.

Mañana hay manifestación de Ciudadanos en Barcelona.

Cosas que me parecen interesantes en este test, y que hay que ver cómo salen:

Una vez tenemos un texto estándar, podemos probar distintas opciones. Bien librerías:

Bien servicios en la nube:

En mis notas menciono distintas librerías de las universidades españolas, pero no sé si están listas para producción / a la altura de alternativas comerciales. ¿O sí? Las aparco de momento.

Estaba pensando, por cierto, si tendría sentido juntar todas las pruebas en un Jupiter notebook o similar, pero entiendo que lo de instalar todas las dependencias es un poco jaleo, así que para las librerías no lo voy a hacer. ¿Merece la pena para las APIs? Ahí posiblemente necesite poner mis credenciales, o usar una demo online, así que en ambos casos tampoco parece muy apropiado lo del cuaderno.

Por cierto, para una comparativa general sobre los distintos servicios disponibles, esto es una buena introducción; continúa aquí. Confirma una cosa que comento más abajo, las limitaciones de Amazon Comprehend.

dcabo commented 5 years ago

OpenCalais 👎

Empiezo por aquí, que tengo a mano su demo online:

screenshot 2019-03-05 at 21 39 17

Cosas buenas: reconoce que "Aznar" es la segunda mención de la misma persona. Todo lo que reconoce lo hace bien.

Cosas malas: no reconoce al PP, ni a Gürtel, ni a Ciudadanos ni a Bárcenas. No distingue los distintos usos de "Barcelona".

dcabo commented 5 years ago

IBM Watson 🤷‍♂️

Pruebo su demo de Natural Language Understanding. Me dice repetidamente que "There was a problem processing the request, please try again later", pero funciona con su texto de prueba y cosas en inglés. 🤷‍♂️

En mi experiencia previa con Watson, donde me apunté para probar y nunca hice nada, la plataforma es un incordio, con miles de correos y pantallas super confusas. Y el rendimiento de la transcripción (#9) fue un horror, no sé si merece la pena seguir probando.

[Horas después sigue igual. Me lo pones muy difícil, IBM.] [Y al día siguiente, meh.]

dcabo commented 5 years ago

Google Cloud 👍

Via su demo online:

screenshot 2019-03-05 at 21 55 25

Cosas buenas: ha pillado todo, y además enlaza a la página de Wikipedia correspondiente para cada entidad. Enlaza además las dos referencias a Aznar.

screenshot 2019-03-05 at 22 00 05

Cosas malas: reconoce demasiadas cosas. 😉 En realidad habría que quitar las cosas marrones, categoría "Other", porque son términos comunes. Mete también "manifestación" como "event", y "españoles" como lugar enlazando a "Spanish language", que es un poco meh. Tal vez lo más criticable es que no enlace a nada para "Ciudadanos" y "Barcelona" (equipo), pero estoy siendo puntilloso.

La gran duda en este caso, y todos los APIs, es cuánto costaría procesar cinco años de Telediarios. En cualquier caso está bien hacer estas pruebas para saber cual es el nivel supuestamente más "pro".


20190829:

Hay alguna mejora, como que ahora enlaza a las dos Barcelonas. Sigue sin pillar Ciudadanos, pero en general la calidad es muy alta.

dcabo commented 5 years ago

TextRazor 👍

Vía demo online, usando el texto estándar (podemos ignorar mi prueba inicial en caliente):

screenshot 2019-03-05 at 22 06 34 screenshot 2019-03-05 at 22 08 41

Cosas buenas: reconoce todo lo importante. Da enlaces a Wikipedia, DBPedia y Freebase. Reconoce a Aznar en sus dos apariciones. Las cosas adicionales que detecta ("españoles" como lugar y "fútbol" como deporte) no nos hacen falta en principio, pero tienen sentido.

Cosas malas: no distingue "Barcelona", siempre lo pilla como ciudad. No sabe dar enlaces para Correa, Bárcenas o Ciudadanos.

En resumen, diría que está un pelín por debajo de Google por culpa de "personajes secundarios" como Bárcenas y Correa, básicamente.

dcabo commented 5 years ago

MeaningCloud 👍

Vía su Text Analytics Demo, que llama a su API de Topics Extraction 2.0:

screenshot 2019-03-05 at 22 17 14

Cosas buenas: reconoce todo, y asigna las categorías correctas a todo, incluso a los dos usos de Barcelona, y a Ciudadanos. Los enlaces a la Wikipedia son todos correctos.

Cosas malillas: le faltan algunos enlaces como Bárcenas o Correa (en la línea de TextRazor, por debajo de Google). Hace un extraño con Aznar, le saca duplicado, pero la que sale con dos apariciones es correcta.

En la práctica preferiría este resultado al de Google, tiene menos ruido, y las cosas malillas parecen fáciles de sortear: no parece complicado añadir a mano enlaces a Wikipedia para ciertas entidades.

El hecho de que sean "locales" también podría facilitar el conseguir cierta ayuda para procesar el corpus pasado. Hablé con ello, de hecho, hace unos años.

dcabo commented 5 years ago

Amazon Comprehend 🤔

No parece haber demo online, así que vía la línea de comandos (usando el comando aws que comentaba en #9):

aws comprehend detect-entities \
    --region eu-west-1 \
    --language-code "es" \
    --text "José María Aznar ha negado una caja B en el PP y que conociera al cabecilla de la Gürtel, Francisco Correa. Aznar también ha dicho que la culpa de todo es de Bárcenas. \
    \
    En deportes, hoy es día importante para el fútbol: vuelve la Liga de Campeones, con cuatro equipos españoles. Es el día que los muy futboleros llevan esperando meses. Abre el fuego el Barcelona, que estrena horario de tarde. \
    \
    Mañana hay manifestación de Ciudadanos en Barcelona."

El resultado es un JSON que es un poco incordio de pegar aquí, pero convertido a CSV queda tal que así:

screenshot 2019-03-05 at 22 32 24

Cosas buenas: detecta todo lo que tiene que detectar, y lo clasifica bien, incluso a Ciudadanos y al doble uso de Barcelona. Las cosas adicionales que detecta (fechas, cantidades) están en categorías separadas, facilmente ignorables.

Cosas malas: no proporciona enlaces a identificadores únicos, ni relaciona las dos apariciones de Aznar entre sí. Esto es un obstáculo no trivial. Pensaba que igual se me estaba pasando algo por alto, pero la comparativa que enlazo al principio comenta lo mismo, es realmente una limitación, y ya hemos visto que otros parecen hacerlo bien. ¿Debo acaso construirme mi propia tabla de mapeos -de forma más o menos automática- para relacionar "Aznar" con la entidad correspondiente? En este caso es obvio, pero ¿qué hacemos con "Sánchez" o "Pastor"?

dcabo commented 5 years ago

Microsoft Azure 👍

El último de los APIs gordos, tiene también demo online:

screenshot 2019-03-06 at 01 06 50 screenshot 2019-03-06 at 01 07 44

Cosas buenas: detecta todo lo que tiene que detectar, y pone los enlaces correctos a Wikipedia en todos los casos, incluyendo Bárcenas, Correa y Ciudadanos, algo que no había conseguido nadie.

Cosas malas: atribuye la segunda aparición del "Barcelona" al equipo de fútbol, como la primera. Muy posiblemente se haya dejado confundir por la cercanía, habría que ver en un texto menos forzado.

Hay quejas -como en la comparativa general que enlazaba al principio- porque no clasifica las entidades, pero ahora mismo no es un problema para nosotros (y no parece complicado extraerlo de la Wikipedia si hiciera falta).

(Parecería -aunque estoy extrapolando de un ejemplo muy breve- que en vez de intentar extraer "cosas que parecen nombres de entidades de tipo X" está intentando extraer entidades reales. Por ejemplo, si pongo "Francisco Correanu" en el texto no me lo reconoce, mientras que TextRazor o Google -elegidos al azar- sí dicen que es una entidad. Esto tiene ventajas e inconvenientes, obviamente: menos falsos positivos, pero si solo va a reconocer cosas de Wikipedia es bastante limitado. Por otro lado, en nuestro contexto de noticias televisivas, podría ser justo lo que necesitamos, porque sólo nos interesan los famosos.) [Poco después compruebo que en efecto, eso es justo lo que la documentación dice que hace la versión 2.0, que lo de NER viene en la 2.1, que parece que hay que probar vía la API.]


20190829: He vuelto a probar esto, de cara a procesar el corpus viejo, y ahora ya tienen la versión 2.1 de la API, que distingue entre NER y "Entity Linking". Sorprendentemente, las entidades que encuentra son peores que hace unos meses (!?):

Screenshot 2019-08-29 at 11 30 44

Ha dejado de reconocer Barcelona, Bárcenas y Liga de Campeones. 🤷‍♂️

dcabo commented 5 years ago

Sobre el coste de procesar el corpus entero de Telediarios con una API, Azure ofrece 3.500$ gratis a las ONGs. Envié la solicitud ayer por probar y hoy me han confirmado que ya lo tenemos. No quiere decir que vayamos a usar Microsoft -aunque funciona muy bien- pero ahora sería una opción sin coste.

Más info aquí.

dcabo commented 5 years ago

A raíz de este artículo, me pregunto si esto del reconocimiento de entidades funciona con textos en minúsculas. La respuesta es que malamente. He hecho una prueba rápida con el texto:

josé maría aznar ha negado una caja b en el pp y que conociera al cabecilla de la gürtel, francisco correa. aznar también ha dicho que la culpa de todo es de bárcenas.

en deportes, hoy es día importante para el fútbol: vuelve la liga de campeones, con cuatro equipos españoles. es el día que los muy futboleros llevan esperando meses. abre el fuego el barcelona, que estrena horario de tarde.

mañana hay manifestación de ciudadanos en barcelona.

Los resultados, brevemente, son:

Ahora mismo no es un problema porque las transcripciones de los Telediarios respetan las mayúsculas incluso en las conexiones, cuando la precisión de la transcripción es mala. No sé si será un problema si queremos procesar transcripciones automáticas de YouTube, por ejemplo, que no recuerdo si respetan las mayúsculas..

Supongo que para arreglar estas cosas hay que reentrenar modelos y esas cosas.

dcabo commented 5 years ago

Flair 👍

Lo instalamos con pip install flair, y al ejecutarlo la primera vez se descargará el modelo necesario. Vamos a usar el siguiente programa:

from flair.data import Sentence
from flair.models import SequenceTagger
from flair.visual.ner_html import render_ner_html

# See https://github.com/zalandoresearch/flair/blob/master/resources/docs/TUTORIAL_1_BASICS.md

text =  """
José María Aznar ha negado una caja B en el PP y que conociera al
cabecilla de la Gürtel, Francisco Correa. Aznar también ha dicho
que la culpa de todo es de Bárcenas.
En deportes, hoy es día importante para el fútbol: vuelve la Liga de Campeones,
con cuatro equipos españoles. Es el día que los muy futboleros llevan esperando
meses. Abre el fuego el Barcelona, que estrena horario de tarde.
Mañana hay manifestación de Ciudadanos en Barcelona."""

# make a sentence
sentence = Sentence(text, use_tokenizer=True)

# load the NER tagger
tagger = SequenceTagger.load('ner-multi')

# run NER over sentence
tagger.predict(sentence)

# Print results
print(sentence.to_dict(tag_type='ner'))
print(sentence.to_tagged_string())
# print(render_ner_html(sentence))

Si convertimos la salida en JSON a CSV nos queda:

flair

Cosas buenas: Identifica todo y asigna categorías correctas (salvo "Gürtel"). Distingue los dos usos de Barcelona.

Cosas malas: aparte de "Gürtel", que no lo pilla del todo bien, la gran limitación es la misma que la de Amazon, que no enlaza a referencias externas. Esto, a su vez, quiere decir que no sabemos automáticamente que "Jose María Aznar" es la misma entidad que "Aznar".

En resumen, es lo más sólido corriendo en local, mucho más que spaCy, que ahora comento, pero tiene limitaciones respecto a Microsoft o MeaningCloud, por ejemplo.

dcabo commented 5 years ago

spaCy 👎

La demo online de spaCy no va bien, hace cosas raras con los espacios. Pero siguiendo sus instrucciones, instalamos en local:

$ pip install -U spacy
$ python -m spacy download en
$ python -m spacy download es

Y habiendo descargado previamente el modelo, ejecutamos:

import spacy

text = """
José María Aznar ha negado una caja B en el PP y que conociera al
cabecilla de la Gürtel, Francisco Correa. Aznar también ha dicho
que la culpa de todo es de Bárcenas.
En deportes, hoy es día importante para el fútbol: vuelve la Liga de Campeones,
con cuatro equipos españoles. Es el día que los muy futboleros llevan esperando
meses. Abre el fuego el Barcelona, que estrena horario de tarde.
Mañana hay manifestación de Ciudadanos en Barcelona."""

nlp = spacy.load('es_core_news_md')

doc = nlp(text)

for entity in doc.ents:
    print(entity.text, entity.label_)

Nos sale:

José María Aznar PER
PP ORG
Gürtel ORG
Francisco Correa PER
Aznar PER
Bárcenas LOC
Liga de Campeones MISC
Es el día que los muy futboleros llevan esperando meses MISC
Abre el fuego el Barcelona MISC
Mañana hay manifestación de Ciudadanos MISC
Barcelona LOC

Resumiendo, bastante mal: pone "Bárcenas" como lugar, detecta frases enteras como entidades (?!), y no enlaza con fuertes externas. No merece la pena.

dcabo commented 5 years ago

Sobre el coste de todo esto, tenemos ~3600 ficheros, de ~80K cada uno. He cogido una transcripción al azar y hay 12500 palabras (que es como cuentan algunas APIs). Todo esto con la transcripción en crudo, sin quitar las marcas de tiempo del formato vtt ni nada, es un cálculo rápido.

Google Cloud cobra por bloques de 1000 carácteres, de los que tenemos 288K (3600 ficheros * 80K). Si estoy leyendo bien la tabla de precios, diría que nos cobrarían 300$, que es asumible.

Meaning Cloud cobra por bloques de 500 palabras. Tenemos 3600 ficheros 12500 palabras (o sea, unos 25 bloques por fichero), en total unos 90K bloques. El tier* gratuito son 20K, pero por 99$ te dan ya 120K.

dcabo commented 5 years ago

No tengo claro aún qué versión de las transcripciones pasar a los servicios de NER: en un extremo podemos pasar el texto completo con las marcas de tiempo de VTT, que son ruido y ocupan espacio (o sea, cuestan dinero); en otro extremo, podemos usar una versión limpia donde hemos concatenado los fragmentos de cada línea VTT, es decir, con párrafos completos (usando los signos de puntuación, que son relativamente fiables).

Me cuesta decidir ahora porque ahora mismo guardamos las transcripciones como una colección de fragmentos VTT, y las respuestas de las APIs usan la posición en el texto para identificar las entidades, así que es un poco follón integrarlo todo y saber qué entidades hay en un fragmento concreto. Podría ser incluso que haya una entidad a caballo entre fragmentos, aunque en general las transcripciones del Telediario parecen evitar partir los nombres.

Si hacemos una prueba más extensa con el inicio de un Telediario al azar:

 1
00:00:08.000 --> 00:00:10.960 L:65%
El presidente de Ciudadanos
estará esta noche en el Telediario.

2
00:00:10.960 --> 00:00:13.120 L:65%
Carlos Franganillo entrevista aquí
en directo

3
00:00:13.120 --> 00:00:15.000 L:65%
a Albert Rivera dentro
de unos minutos.

4
00:00:15.000 --> 00:00:18.000 L:65%
Le preguntaremos por los asuntos
que marcan la actualidad política,

5
00:00:18.000 --> 00:00:20.000 L:65%
en plena precampaña
para el 28 de abril.

6
00:00:22.760 --> 00:00:25.560 L:65%
Y entre esos asuntos, el vuelco
en las primarias de Ciudadanos

7
00:00:25.560 --> 00:00:26.790 L:74%
en Castilla y León.

8
00:00:26.799 --> 00:00:29.200 L:65%
El partido ha anulado la victoria
de Silvia Clemente,

9
00:00:29.200 --> 00:00:31.440 L:65%
la candidata de Rivera
y exdirigente del PP,

10
00:00:31.440 --> 00:00:34.040 L:74%
por irregularidades en el recuento.

11
00:00:34.400 --> 00:00:36.720 L:65%
El candidato será finalmente,
Francisco Igea.

12
00:00:40.680 --> 00:00:42.960 L:65%
La Junta Electoral Central
ha rechazado suspender

13
00:00:42.960 --> 00:00:45.040 L:65%
las ruedas de prensa
del Consejo de Ministros

14
00:00:45.040 --> 00:00:46.760 L:74%
tras la convocatoria de elecciones.

15
00:00:46.760 --> 00:00:49.000 L:65%
Desestima así los recursos
de PP y Ciudadanos,

16
00:00:49.000 --> 00:00:50.640 L:74%
que creen que son electoralistas,

17
00:00:50.640 --> 00:00:52.680 L:65%
porque considera
que no se vulneraría

18
00:00:52.680 --> 00:00:54.320 L:74%
la legislación electoral.

19
00:00:54.680 --> 00:00:56.960 L:65%
Además, la Junta insta
a la Generalitat a quitar

20
00:00:56.960 --> 00:00:59.040 L:65%
los lazos amarillos
y las banderas esteladas

21
00:00:59.040 --> 00:01:02.040 L:65%
de edificios públicos
en un plazo máximo de 48 horas. 

La salida de Google tiene mucho ruido por culpa de las marcas temporales, pero la calidad es buena:

Screenshot 2019-08-29 at 15 11 46

MeaningCloud también pilla casi todo bien:

Screenshot 2019-08-29 at 15 12 45

Google falla pillando solo el "León" de "Castilla y León" y sigue sin enlazar a la web de Cs. MeaningCloud no pilla a Francisco Igea completo y confunde la segunda aparición de "Ribera" como lugar; y tiene unas cuantas entidades sin referencia a la Wikipedia.

Flair lo hace bastante bien (con una versión sin marcas de tiempo, por no volverme loco), aunque falla con "Castilla y León", que pilla por separado, y mete un extraño "Además". Pilla bien los nombres de las personas. Es raro que "Ciudadanos" a veces lo pille como MISC y otras como ORG. Y la mayor limitación es que como ofrece identificadores para las entidades no permite saber que "Junta Electoral" es lo mismo que "Junta":

{
    'text': 'El presidente de Ciudadanos estará esta noche en el Telediario. Carlos Franganillo entrevista aquí en directo a Albert Rivera dentro de unos minutos. Le preguntaremos por los asuntos que marcan la actualidad política, en plena precampaña para el 28 de abril. Y entre esos asuntos, el vuelco en las primarias de Ciudadanos en Castilla y León. El partido ha anulado la victoria de Silvia Clemente, la candidata de Rivera y exdirigente del PP, por irregularidades en el recuento. El candidato será finalmente, Francisco Igea. La Junta Electoral Central ha rechazado suspender las ruedas de prensa del Consejo de Ministros tras la convocatoria de elecciones. Desestima así los recursos de PP y Ciudadanos, que creen que son electoralistas, porque considera que no se vulneraría la legislación electoral. Además, la Junta insta a la Generalitat a quitar los lazos amarillos y las banderas esteladas de edificios públicos en un plazo máximo de 48 horas.',
    'labels': [],
    'entities': [{
        'text': 'Ciudadanos',
        'start_pos': 17,
        'end_pos': 27,
        'type': 'MISC',
        'confidence': 0.9584184288978577
    }, {
        'text': 'Telediario',
        'start_pos': 52,
        'end_pos': 62,
        'type': 'LOC',
        'confidence': 0.7228236198425293
    }, {
        'text': 'Carlos Franganillo',
        'start_pos': 64,
        'end_pos': 82,
        'type': 'PER',
        'confidence': 0.9936445355415344
    }, {
        'text': 'Albert Rivera',
        'start_pos': 112,
        'end_pos': 125,
        'type': 'PER',
        'confidence': 0.9929980635643005
    }, {
        'text': 'Ciudadanos',
        'start_pos': 311,
        'end_pos': 321,
        'type': 'MISC',
        'confidence': 0.8475168943405151
    }, {
        'text': 'Castilla',
        'start_pos': 325,
        'end_pos': 333,
        'type': 'LOC',
        'confidence': 0.999743640422821
    }, {
        'text': 'León',
        'start_pos': 336,
        'end_pos': 340,
        'type': 'LOC',
        'confidence': 0.9979447722434998
    }, {
        'text': 'Silvia Clemente',
        'start_pos': 379,
        'end_pos': 394,
        'type': 'PER',
        'confidence': 0.9935603737831116
    }, {
        'text': 'Rivera',
        'start_pos': 412,
        'end_pos': 418,
        'type': 'PER',
        'confidence': 0.9997585415840149
    }, {
        'text': 'PP',
        'start_pos': 437,
        'end_pos': 439,
        'type': 'ORG',
        'confidence': 0.9960231781005859
    }, {
        'text': 'Francisco Igea',
        'start_pos': 507,
        'end_pos': 521,
        'type': 'PER',
        'confidence': 0.9400852024555206
    }, {
        'text': 'Junta Electoral Central',
        'start_pos': 526,
        'end_pos': 549,
        'type': 'ORG',
        'confidence': 0.8689779837926229
    }, {
        'text': 'Consejo de Ministros',
        'start_pos': 598,
        'end_pos': 618,
        'type': 'ORG',
        'confidence': 0.923259953657786
    }, {
        'text': 'PP',
        'start_pos': 685,
        'end_pos': 687,
        'type': 'ORG',
        'confidence': 0.9999992847442627
    }, {
        'text': 'Ciudadanos',
        'start_pos': 690,
        'end_pos': 700,
        'type': 'ORG',
        'confidence': 0.9959063529968262
    }, {
        'text': 'Además',
        'start_pos': 800,
        'end_pos': 806,
        'type': 'ORG',
        'confidence': 0.777158260345459
    }, {
        'text': 'Junta',
        'start_pos': 811,
        'end_pos': 816,
        'type': 'ORG',
        'confidence': 0.9986075758934021
    }, {
        'text': 'Generalitat',
        'start_pos': 828,
        'end_pos': 839,
        'type': 'ORG',
        'confidence': 0.9996734857559204
    }]
}
dcabo commented 5 years ago

Haciendo otra pequeña prueba con:

El presidente de Ciudadanos
estará esta noche en el Telediario.

Carlos Franganillo entrevista aquí
en directo

a Albert
Rivera dentro
de unos minutos.

Google deja de reconocer al periodista pero maneja bien el salto de línea en "Albert Ribera":

Screenshot 2019-08-29 at 15 21 19

La demo pública de MeaningCloud deja de reconocer a Ribera por el salto de línea, pero si usamos la API online y especificamos "relaxed typography" el resultado es bueno:

Screenshot 2019-08-29 at 15 22 12

MeaningCloud no incluye referencias a Wikipedia para unas cuantas cosas, pero a cambio incluye cosas como análisis sintáctico y una serie de clasificaciones para conceptos como "telediario" ("Top>Product>CulturalProduct>Broadcast"). Ahora mismo no le daríamos uso, la verdad, pero si guardamos la respuesta completa tal cual pues ya lo tenemos.

Flair lo hace bien:

{
    'text': 'El presidente de Ciudadanos estará esta noche en el Telediario. Carlos Franganillo entrevista aquí en directo a Albert Rivera dentro de unos minutos.',
    'labels': [],
    'entities': [{
        'text': 'Ciudadanos',
        'start_pos': 17,
        'end_pos': 27,
        'type': 'MISC',
        'confidence': 0.9412362575531006
    }, {
        'text': 'Telediario',
        'start_pos': 52,
        'end_pos': 62,
        'type': 'LOC',
        'confidence': 0.9658822417259216
    }, {
        'text': 'Carlos Franganillo',
        'start_pos': 64,
        'end_pos': 82,
        'type': 'PER',
        'confidence': 0.9972129762172699
    }, {
        'text': 'Albert Rivera',
        'start_pos': 112,
        'end_pos': 125,
        'type': 'PER',
        'confidence': 0.9973199963569641
    }]
}
dcabo commented 5 years ago

Una última comparativa:

EL ministro Soria ha dicho
que llevará este viernes al Consejo

de Ministros el el nuevo sistema
para fijar el precio de la luz

y ha vuelto a insistir en
que existen "

sospechas de manipulación"

en la subasta de la semana pasada.

Google es un poco meh, no pilla "Consejo de Ministros". Reconoce que Soria es apellido, no provincia, pero no enlaza a nadie en concreto:

Screenshot 2019-08-30 at 13 32 57

MeaningCloud es un poco mejor porque pilla "Consejo de Ministros" como unidad. El resto parecido:

Screenshot 2019-08-30 at 13 35 22

Flair (con la salida de to_dict() hecha legible por este cacharro) lo hace bien.

{
    'text': 'EL ministro Soria ha dicho que llevará este viernes al Consejo de Ministros el el nuevo sistema para fijar el precio de la luz y ha vuelto a insistir en que existen "sospechas de manipulación" en la subasta de la semana pasada.',
    'labels': [],
    'entities': [{
        'text': 'Soria',
        'start_pos': 12,
        'end_pos': 17,
        'type': 'PER',
        'confidence': 0.9652742743492126
    }, {
        'text': 'Consejo de Ministros',
        'start_pos': 55,
        'end_pos': 75,
        'type': 'ORG',
        'confidence': 0.8760059475898743
    }]
}
dcabo commented 5 years ago

Voy a hacer una primera pasada por el corpus con Flair, que me permite trabajar en local de forma independiente. En función de la calidad final, y cuando entendamos mejor qué queremos hacer con esto, podemos probar con alguna API online.

Sigo pensando cómo combinar las dos capas de metadatos del texto: por un lado tenemos información de tiempos (a través de las marcas de VTT) y por otro la de entidades (la salida de Flair). El prototipo que tenemos ahora, y que encaja con el uso para búsquedas, funciona a partir de frases de VTT, pero no es fácil encajar eso con la salida del NER. Primero, porque vamos a quitar las etiquetas temporales para no volver loco al NER y para que pueda pillar entidades que caen en distintos fragmentos, como "Consejo de Ministros" en la prueba anterior (que es real). Y segundo, porque el propio proceso de NER transforma ligeramente el texto:

Si le pasamos el texto a Flair con useTokenizer=True, convierte saltos de línea a espacios. Si lo hacemos False no funciona nada, porque tiene "tokens" como Ciudadanos\nestará, que obviamente no valen. En principio la tokenización no parece un gran problema, porque cambiar un salto por un espacio no altera el número de carácteres, pero hace que el nombre de una entidad como "Consejo de Ministros" no aparezca tal cual en el texto de entrada si está en varias líneas. (Y esto antes de intentar volver a meter las marcas de tiempo del VTT, que es aún peor.)

dcabo commented 5 years ago

Una vez pasamos de hacer pruebas con unas pocas palabras a procesar toda una transcripción, es importante partir el texto en frases, como explican en sus ejemplos. (segtok es la librería que usa Flair por defecto.) Pero dado el formato de nuestras transcripciones, usaremos split_multi, no split_single, para que ignore los saltos de línea.

Procesar el texto como frases separadas tiene un importante efecto en el rendimiento, tanto más cuánto más grande sea el texto. Así, en un fragmento de una transcripción la diferencia en mis pruebas no era importante (30s frases sueltas vs. 34s todo el fragmento), pero con un telediario completo (e.g. 2258715.txt) la diferencia es elevada. Una sola frase:

neko:telelediario(master) $ time python ner.py 
2019-08-30 20:16:43,719 loading file /Users/David/.flair/models/quadner-large.pt

real  6m41.994s
user  34m14.437s
sys 0m27.932s

Vs. frases sueltas:

neko:telelediario(master) $ time python ner.py 
2019-08-30 20:26:17,290 ACHTUNG: An empty Sentence was created! Are there empty strings in your dataset?
2019-08-30 20:26:17,291 loading file /Users/David/.flair/models/quadner-large.pt
2019-08-30 20:26:39,308 Ignore 1 sentence(s) with no tokens.

real  1m35.133s
user  5m17.471s
sys 0m12.152s
dcabo commented 5 years ago

Con la última versión de Flair podemos generar una visualización básica de los resultados en HTML, frase a frase:

Screenshot 2019-09-01 at 21 23 02
dcabo commented 5 years ago

En #16 hemos acabado desarrollando el programa en Python que lee los VTT, tokeniza y aplica NER frase a frase, todo ello conservando los tiempos de inicio/fin durante el proceso. El resultado se guarda en un JSON para ser importado posteriormente a Elastic.

Así que estamos listos para ir aplicando Flair a todo el corpus, algo que tardará unos días.

dcabo commented 5 years ago

Por comparar, procesar un telediario (una hora) en mi portátil tarda un minuto y medio, aproximadamente. Hacerlo en midas tarda un minuto más.

rafaharo commented 4 years ago

Menuda currada de comparación macho. Mis dieses