crystarium

Ha llegado la fatídica hora de poner en orden mis pensamientos.

Orígenes

Todo comenzó en el Milán. Llegó a nuestras manos un corpus de documentos notariales del medievo asturiano. Vírgenes a los ojos de los mortales, sus secretos únicamente accesibles a los iniciados. Surgió entonces la vaga idea de emplear nuestras artes oscuras, también conocidas como “tecnologías semánticas”, para, de algún modo, facilitar su procesamiento y consulta.

La extracción y clasificación de información del lenguaje natural se ha tratado hasta la extenuación, con un importante matiz: sobre lenguajes modernos. Mi querido lector, el español del siglo XIV dista lo suficiente del actual como para considerarlo prácticamente un idioma distinto. Independientemente de las etiquetas que impongamos, lo cierto es que es lo suficientemente distinto como para que las herramientas de procesamiento fracasen como la invasión italiana de Egipto. La ortografía y la gramática es una invención moderna; estos textos plasman el lenguaje hablado a gusto del escritor, que muchas veces tiende a “culturizar” las palabras añadiendo caracteres extra y otras gracietas. Una complicación más a añadir a la natural evolución de un lenguaje durante 700 años.

E magar dixiesse que los dichos maravedís me non foran dados e metudos en mio poder, otorgo que me non vala.

Si bien en un inicio los sueños febriles podían apuntar a una clasificación del texto y sus secciones (como realizan los compañeros de DocuLab manualmente) estas circunstancias pronto dejaron claro que era una propuesta excesivamente ambiciosa. Ello implicaría, seguramente, un análisis sintáctico del español medieval (que para mi sorpresa existe, consultad Freeling), un consiguiente análisis de la temática, etc… Cuestiones que atraen más al otro miembro de la sección historicista de WESO.

Así pues, mi deseo se materializó en la siguiente visión: una extracción de entidades y sus relaciones de aquestos textos de otroras eras, de cara a la construcción de nuestro propio grafo de conocimiento (KG para los amigos) o, para los de grado 33, base de conocimiento (KB)

Esta simple idea, como veremos, tiene sus… implicaciones.

Soluciones

Cuando digo soluciones, entiéndase en potencia y no en acto. Principalmente, acudieron a mí las siguientes ideas:

Para ser precisos, la pipeline que tengo en mente es la siguiente:

  1. Detección de entidades con BERT sobre el texto original (sanitizado). Esto nos otorgará un listado de entidades y sus tipos.
  2. Creación de un modelo de predicción de enlaces sobre dataset basado en KB externos.
  3. Creación de nuevas entidades sobre el dataset a partir de las extraídas en 1).
  4. Predicción de posibles relaciones entre dichas entidades.

Esa es la idea. Naturalmente, su ejecución es más… compleja. Pero vamos por partes.

BERT

Por fortuna para mí, NER sobre textos históricos ya ha sido explorado empleando variantes de BERT-Multilingual. Hasta donde yo sé, español, francés, inglés y alemán. El español lo he probado y funciona maravillosamente. La existencia de diversos modelos con la misma base creo que es argumento suficiente para la generalización de este paso, con suficiente voluntad. En cuanto a mí respecta, con tenerlo disponible para los principales lenguajes europeos es suficiente.

Modelo de predicción

Aquí viene lo bueno. El primer paso consiste en extraer tripletas relevantes de Wikidata. Wdsub está sobre la mesa como opción pero entretanto he rescatado WD-Scholia para llevar a cabo queries paginadas -dado que el nº de elementos es demasiado grande para una sola-. Principalmente estoy extrayendo personas nacidas en España antes de 1800 y tomando los atributos presentes en el EntitySchema de Q5; para acotarlo un poco, porque si no es un sindiós de propiedades.

Los problemas son los de siempre; los datos son muy dispersos (para las propiedades potenciales, los valores de la entidad media se reducen al mínimo) y a menudo los valores que aparecen son contraproducentes. Por ejemplo, Hernán Cortés tiene como P734 Cortés, pero su padre Martín carece de dicho valor. Para inferir cuestiones tales como relaciones paterno-filiales, plantea unas cuantas dudas… eso sin tener en cuenta que en estas épocas, por lo que veo la herencia de apellidos suele ser una cuestión aristocrática y que nuestros humildes jornaleros toman el nombre del padre… Podemos apañar el problema procesando nosotros mismos la combinación nombre/apellidos a partir de la etiqueta de la entidad…

En fin, supongamos la creación de un grafo de conocimiento con las entidades extraídas en el párrafo previo. Queremos entrenar un modelo de predicción para que, al introducir las entidades detectadas por BERT, emita un juicio. ¿Qué modelo empleamos? Bueno, la predicción de enlaces en KG tiene algoritmos de cierta relevancia, como ComplEx o SimplE.

Maldita sea la hora en que opté por usar la librería Stellargraph para tratar de aplicar ComplEx (viene integrado). En mi vida tuve que tratar con una librería tan contraproducente; la mayor parte de la documentación no se corresponde con el código real, y eso teniendo en cuenta que la documentación sólo plantea el entrenamiento (no el uso) del modelo sobre datasets (introducir los propios es una odisea) predefinidos (que tampoco funcionan). Después de unas cuantas lunas batallando con ello, he llegado a la conclusión de que está más roto que el alma moderna; no genera nada con sentido.

Visto el panorama, he optado por obviar tales intermediarios y estudiar directamente la aplicación de estos modelos de predicción sobre Wikidata. Y hay cosas interesantes: existe un dataset basado en Wikidata/Wikipedia , sobre el cual se han aplicado diversos modelos como KGT5-context, ComplEx, SimplE, etc. Tengo por delante más combates con esto, pero parece más prometedor que lo anterior; cuanto menos, es más próximo a nuestras pretensiones.

Ver el artículo al respecto

Creación de entidades

Llegado este punto, lo peor ha pasado; una vez cruzado Moore, OK, las probabilidades de ser arrollado por un tornado se reducen drásticamente. La información que se puede extraer del NER es escasa: