« Redes Booleanas « || Inicio || » Jornadas FORMA'14 »

Estructurando y consultando información en grafos

Última modificación: 24 de Noviembre de 2016, y ha tenido 3041 vistas

Etiquetas utilizadas: ||

¿Qué entendemos por información estructurada?

La Información Estructurada es información que ha sido analizada y procesada de alguna forma, en el sentido de que ha sido dividida en sus componentes estructurales. Para ello es necesario que previamente se haya determinado qué tipo de estructura queremos reconocer en la información. Por ejemplo, si partimos de un texto (uno de los ejemplos más paradigmáticos de información no estructurada, o débilmente estructurada) podemos realizar sobre él diversos tipos de análisis según atendamos a su estructura física (caracteres, palabras, líneas, párrafos, secciones, etc.), su estructura sintáctica (partículas elementales, sintagmas, oraciones, etc.), su contenido semántico (qué tópicos aborda y cómo los relaciona entre sí), etc.

Por otra parte, la información no estructurada se refiere a aquella que no ha sido tratada, no tiene definido un modelo de datos asociado en ninguna de las formas anteriores y no se ajusta bien a un esquema de tablas relaciones como las que veremos en el punto siguiente.

En 1998, Merrill Lynch (Christopher C. Shilakes and Julie Tylman, "Enterprise Information Portals", Merrill Lynch, 16 November, 1998; Unstructured Data and the 80 Percent Rule, Clarabridge Bridgepoints, 2008) estimó que un 80% de la información potencialmente usable dentro del mundo de los negocios estaba en forma no estructurada. Más recientemente, en 2010, múltiples analistas han estimado que la cantidad de datos aumentará alrededor de un 800% en los próximos 5 años, y que su ritmo de crecimiento crece un orden de 10 a 50 veces más rápido que el de la información estructurada. (Today’s Challenge in Government: What to do with Unstructured Information and Why Doing Nothing Isn’t An Option, Noel Yuhanna, Principal Analyst, Forrester Research, Nov 2010).

El proceso de análisis y división/selección/clasificación de sus partes es lo que permite que la información sea procesada de forma algorítmica y, habitualmente, ejecutar este algoritmo por medio de un ordenador. En este sentido, para que el proceso ejecutado por la máquina proporcione algún resultado interesante hay un requisito fundamental: que la selección de la “estructura” que se está buscando dentro de la información no estructurada sea adecuada y con suficiente riqueza para obtener algún resultado.

En el párrafo anterior hemos nombrado un ejemplo claro de información no estructurada, los textos, pero existen otros muchos ejemplos que hoy en día exigen gran cantidad de recursos para ser analizados adecuadamente, por ejemplo: imágenes, videos, música, obras de arte, diálogos, etc… Debido al tipo de resultados que aquí estamos presentando nos centraremos en el estudio de los textos como ejemplo central de información no estructurada, pero realmente no afecta a las consideraciones principales en las que queremos profundizar.

En la actualidad hay ciertos niveles estructurales que han sido automatizados lo suficiente como para no requerir de intervención humana para poder extraer información estructurada de un texto, por ejemplo, el análisis sintáctico en la actualidad es prácticamente automatizable de forma completa, requiriendo únicamente una etapa de supervisión posterior; sin embargo, el análisis semántico está lejos de ser automatizable salvo para casos muy simplificados que se alejan, por supuesto, de los análisis generales que pretendemos aquí. Es por ello que, en nuestro caso, el trabajo realizado consta de diversas fases en las que interviene de manera forzosa una componente manual que es inevitable (y quizás deseable).

Es importante señalar que en la mayoría de los casos los bloques de información que se pretenden analizar tienen una estructura interna inherente (por ejemplo, los capítulos de un libro), pero no siempre la más obvia es la que nos interesa para realizar los análisis deseados y hemos de reestructurar la información de otra forma “menos natural”.
En este sentido, muchas veces una gran ventaja de estructurar la información es que para ello necesitamos dar un nivel explícito de representación que clasifique las partes componentes. Como dice Ursula K. LeGuin, "the name is the thing, and the true name is the true thing. To speak the name is to control the thing". Este proceso de nombrar las cosas y clasificarlas nos acerca un paso a la creación de una ontología que permita exportar el procedimiento que hemos realizado en nuestro modelo a otros modelos similares, dando como resultado una metodología general de investigación o de resolución de problemas.

¿Cómo se decide qué se estructura?

Cuando se planifica un proyecto de estructuración para analizar información hay dos cuestiones principales que deben abordarse: qué estructuras son importantes, y cuáles han de codificarse… el cómo han de codificarse es sin duda importante, pero de un rango cualitativamente menor al hecho de qué se codifica y qué no. Cualquiera de estas decisiones se enfrenta, en cualquier proyecto, a decisiones de tipo económico (tiempo, recursos necesarios, etc.) e intelectuales.

A continuación se presentan algunas cuestiones específicas que pueden ayudar a dar un diagnóstico del proceso:

  • ¿Permanecería el componente en juego si se efectúa una reordenación de la información?
  • ¿Es útil para más propósitos?
  • ¿Tiene ya asignado un nombre en otros contextos (ya sea individualmente o como colectivo)?
  • ¿Puede ser interesante realizar búsquedas sobre él más adelante (de forma específica, no solo como texto)?
  • ¿Está relacionado, forma parte de, o es super-parte de algún otro componente que pueda ser interesante?

El punto final para decidir qué estructura codificar es plantearse si existe ya un estándar que nos permita realizarlo de manera más sencilla, lo que podría facilitar muchas de las decisiones de diseño (por las respuestas y éxitos/fracasos experimentados en situaciones similares) y evitar desagradables sorpresas posteriores que nos obligasen a rehacer parte del trabajo.

Niveles de información estructurada

Como ya hemos comentado, la información estructurada consiste de elementos atómicos de información (que se suponen indivisibles desde el punto de vista informacional) que se agrupan por composición formando estructuras de tamaño y nivel jerárquico superior. Podemos dar la siguiente clasificación de elementos en ambos niveles: 

  • Información Atómica:
    • Números: son fundamentales para la computación, y prácticamente todo es tratado, a nivel interno, como un número cuando se procesa por un ordenador. Han sido usados desde la antigüedad para representar gran variedad de cosas del mundo físico y social, y llevan inherente una unidad de medida que los dota de información semántica (por ejemplo, el año 1492, frente a 1492cm.
    • Cadenas de caracteres: que nos permiten representar información textual.
    • Tiempo: debido a sus características, no siempre se puede tratar como un número, ya que a veces incluye rangos de eventos, agrupaciones o escalas temporales diversas (así como incertidumbre y relaciones complejas entre elementos de ese tipo). A pesar de ello, es habitual tener un sistema de representación numérico para los datos de fecha y tiempo.
    • Valores Booleanos: son lo que se conoce como “valores de verdad”, es decir, el par Verdadero/Falso, y a menudo son útiles para representar información selectiva binaria, por ejemplo: “¿Mujer?: V/F”.
    • Tópicos o Entidades: Elementos de un cierto dominio que se consideran indivisibles (aunque puedan ser enriquecidos con propiedades que añaden información cualitativa o cuantitativa). Suelen estar clasificados por el tipo al que pertenecen. Por ejemplo, una persona frente a un verbo.
  • Información Compuesta: Los fragmentos atómicos de información son extremadamente limitados en su aplicación práctica. Por ello, suelen ser agrupados en estructuras superiores que permitan modelar un problema. Estas formas de agrupación no solo proporcionan un nivel de estructuración sino que potencian su capacidad expresiva. Debido a que en muchos casos estos datos compuestos son el medio para estructurar información arbitrariamente grande, la decisión de qué estructura compuesta usar en un modelo particular puede tener repercusiones importantes en el desarrollo del proceso, sobre todo a la hora de poder acceder (por navegación directa o búsqueda en forma de consultas) a la información. A continuación mostramos algunos de los más habituales:
    • Listas: Como su nombre indica, permite estructurar los objetos en listas consecutivas donde cada objeto es identificado por la posición que ocupa en la lista (esta posición puede tener una interpretación semántica o no, por ejemplo, si ese orden tiene interpretación en la relación entre los datos almacenados o no).

    • Árboles: Si los objetos de una lista pueden a su vez ser listas, entonces lo que obtenemos es lo que se conoce como un árbol, una estructura de rango superior que permite aplicar cierto nivel de ordenación superior. En este caso, destacan un objeto que se llama la raíz del árbol y cada elemento del mismo se puede identificar por el camino (la rama) que permite llegar hasta él.

    • Grafos: Son estructuras generales (de hecho, contienen a las dos anteriores) en las que los objetos que las componen se pueden relacionar entre sí sin restricciones a priori. Es tan general que puede modelar (casi) cualquier otra estructura. Dedicaremos una sección posterior de este capítulo a una presentación más detallada de los grafos.

      • Representación Espacial: A veces, cuando los objetos representados verifican ciertas propiedades que permiten compararlos entre sí de forma numérica y definir algo parecido a una distancia, podemos embeber dichos objetos como puntos de un espacio (a veces de dimensión elevada) que los identifica con ciertos puntos del espacio (por ejemplo, una imagen es una lista de colores en que cada color tiene una representación de un punto de un espacio 2D). Suele ser habitual que, una vez tenemos definida una estructura para contener nuestra información, se usen técnicas de proyección espacial que nos permite obtener representaciones gráficas de la información.

Sistemas clásicos de almacenamiento de información: Bases de Datos Relacionales(RDB)

En general, una base de datos es un conjunto de datos pertenecientes a un mismo contexto y almacenados sistemáticamente para su uso posterior. En este sentido, tenemos ejemplos claros de bases de datos en las bibliotecas, que pueden considerarse bases de datos compuestas en su mayoría por documentos y textos impresos en papel e indexados para su consulta. En la actualidad, y debido al desarrollo tecnológico de la informática, la mayoría de las bases de datos están en formato digital, ofreciéndose un abanico muy amplio de soluciones al problema de almacenar datos.

Una base de datos relacional es una base de datos que cumple con el modelo relacional, que es el modelo más utilizado en la actualidad para implementar bases de datos ya planificadas. En este modelo aquellos datos que sigan una estructura semejante se almacenan en una misma tabla, y se permite establecer relaciones entre tablas distintas, de forma que se establezcan interconexiones entre datos. Sus fundamentos fueron postulados en 1970 por Edgar Frank Codd, de los laboratorios IBM en San José (California), y frente a otros modelos alternativos que surgieron en esos mismos años, no tardó en consolidarse como el nuevo paradigma en los modelos de base de datos.



Sus características principales son:

  • Una base de datos relacional se compone de varias tablas o relaciones.
  • No pueden existir dos tablas con el mismo nombre.
  • Cada tabla está formada por un conjunto de registros (filas y columnas).
  • La relación entre tablas relacionadas se consigue por medio del uso de claves que identifican las filas relacionadas entre ellas.

Debido a que hay una estructura común que recorre toda la base de datos, suele hablarse de su esquema como la definición de la estructura de la base de datos. Para definir un esquema de una Base de Datos relacional necesitamos dar: el nombre de cada tabla, el nombre de cada columna, el tipo de dato de cada columna y la tabla a la que pertenece cada columna.

Para manipular la información que hay en una RDB se utiliza lo que se denominan lenguajes relacionales. Entre ellos, el más común es el lenguaje de consultas SQL (Structured Query Language), un estándar implementado por los principales motores o sistemas de gestión de bases de datos relacionales.


Sin embargo, cuando la información que manejamos soporta su importancia tanto en las relaciones como en las propias entidades que estamos estructurando, las soluciones basadas en este tipo de Bases de Datos no resultan del todo convincentes… por una parte, el esquema se aleja cada vez más del mundo real que el individuo tiene en mente y, por otra parte, hace muy costoso desde el punto de vista técnico su mantenimiento debido a la falta de flexibilidad que el modelo proporciona. Es por ello que, al menos desde un punto de vista conceptual, y cada vez más desde un punto de vista práctico, para muchos modelados de información se están haciendo uso de nuevos sistemas de gestión de bases de datos que no siguen las normas de las tablas relacionales, y que han venido a llamarse de forma genérica como Bases de Datos NoSQL (que debe interpretarse como “No solamente SQL” y no como “No al SQL”, ya que en la mayoría de los casos intenta mantener un equilibrio entre las buenas caractarísticas de las RDB y las nuevas opciones que proporcionan otro tipo de sistemas de almacenamiento y gestión).

En las próximas secciones nos centraremos en una de las soluciones que hemos utilizado para el estudio que aquí se presenta: las Bases de Datos en Grafo (GDB), pero antes hemos de dar algunos fundamentos teóricos que nos permitan entender las características de este tipo de bases de datos.

Grafos e Hipergrafos

Informalmente, un grafo es un conjunto de objetos llamados vértices o nodos unidos por enlaces llamados aristas o arcos, que permiten representar relaciones binarias entre elementos de un conjunto. Habitualmente, un grafo se puede representar gráficamente como un conjunto de puntos (o figuras geométricas) unidos por líneas en el plano (o, a veces, en el espacio tridimensional).

Desde un punto de vista práctico, los grafos permiten estudiar las interrelaciones existentes entre unidades que interactúan unas con otras. Por ejemplo, una red de conceptos de un dominio puede representarse y estudiarse mediante un grafo en el cual los vértices representan los diversos conceptos que se estudian y las aristas representan conexiones (las que se consideren oportunas en el dominio, por ejemplo, sinonimia, antonimia, procede de, etc.). Prácticamente cualquier problema puede representarse mediante un grafo, y su estudio trasciende a las diversas áreas de las ciencias exactas y las ciencias sociales.

Dependiendo de cómo se considera la arista que une a los vértices, los grafos se pueden clasificar como dirigidos (cuando la arista parte de uno de los vértices y llega al otro, es decir, el papel que juegan ambos nodos en la relación no es el mismo), o no dirigidos (cuando la arista simplemente conecta los vértices entre sí). Normalmente, las aristas dirigidas se representan como una flecha (tal y como vemos en la figura anterior) y las no dirigidas como un segmento.

Un camino en un grafo es una sucesión de vértices tal que de cada uno de sus vértices existe una arista hacia el vértice sucesor. En la figura siguiente tenemos destacado un camino uniendo los vértices A y C.

Además, tal y como vemos en la figura anterior, se pueden considerar pesos en las aristas que pueden indicar algún tipo de característica de la misma (longitud, flujo de información, fuerza de la conexión, etc.). En dicho caso, diremos que el grafo es ponderado.

A veces el tipo de información que queremos conectar no simplemente relaciona los vértices de forma binaria, es decir, de dos en dos, sino que las relaciones se producen entre conjuntos mayores de vértices. Por ejemplo, supongamos que tenemos una red de turismo en la que consideramos los turistas que viajan anualmente y las zonas que visitan, en ese caso, relacionar solo que el turista \(v_1\) visitó la zona \(v_2\) puede ser insuficiente porque depende del año en que lo hizo, en este caso introducimos un tercer tipo de vértice, temporal, y la relación se da entre los tres simultáneamente: el turista \(v_1\) visitó la zona \(v_2\) en el año \(v_3\).

En este caso, tenemos posibilidades más ricas de expresión, por ejemplo: los turistas \(v_1\) y \(v_4\) visitaron juntos la zona \(v_2\) en el año \(v_3\). Por lo que las nuevas relaciones son más complejas e informativas. Por supuesto, su representación gráfica se complica y ya no nos basta con representarlas por medio de segmentos conectando los puntos, y suele acudirse a representaciones de superficies para ello. A este tipo de grafos con aristas más potentes se les conoce como hipergrafos, y a las aristas de este tipo hiperaristas.

Debido a que las representaciones de las hiperaristas son mucho más complejas desde un punto de vista técnico (y confusas en su representación) y como demostración de la versatilidad que tienen los grafos, veremos que no es necesario acudir a los hipergrafos aunque nuestras relaciones no sean binarias, sino que existe la posibilidad de “crear” tipos de vértices intermedios, que representen esas hiperaristas (son vértices artificiales, que no pertenecen al mundo real que se pretende modelar) de manera que si \(v_1\), \(v_2\) y \(v_3\) son vértices que comparten esa hiperarista, creamos el vértice \(h_1\) y lo enlazamos con aristas binarias con los tres anteriores. De esa forma no perdemos la información que queríamos almacenar y seguimos trabajando con grafos sin necesidad de desarrollar herramientas teóricas ni de representación nuevas.

 

Bases de Datos en Grafo (GDB): Nodos, Relaciones, Hiper-relaciones y Esquemas

Una Base de Datos en Grafo (GDB) es un tipo de base de datos NoSQL que usa estructuras de grafos con nodos, aristas y propiedades para representar y almacenar la información.

Los nodos pueden representar entidades tales como personas, partes de un texto, conceptos, o cualquier tópico, real o no, que pueda ser útil para modelar un problema.

Las aristas representarán relaciones entre entidades, y a diferencia de las relaciones en las RDB, en las GDB mucha de la información relevante al modelo se almacena en estas aristas. Habitualmente, cuando se decide por una implementación del modelo en un GDB es porque estamos interesados en estudiar los patrones que emergen en las conexiones e interconexiones entre nodos, propiedades y aristas, y no tanto en la información relativa a cada uno de ellos por separado.

Las propiedades son unidades de información relevante para los nodos y las aristas. Por ejemplo, si tenemos un nodo que representa una comedia, propiedades relevantes podrían ser: la fecha de edición, género, extensión, etc… el hecho de que algunas de estas propiedades pasen a convertirse en nodos independientes del grafo, adquieran entidad propia, depende del objetivo que queramos cumplir y está relacionado con el cómo estructurar la información tal y como vimos anteriormente. Además, suele ser habitual disponer de una clasificación en los nodos, de manera que podamos agruparlos según el tipo al que pertenecen (por ejemplo, personas, obras, lugares, etc.).

Debido a la libertad que ofrecen los grafos como soporte conceptual de la información, una GDB puede llegar a carecer por completo de esquema, es decir, que podemos asociar con absoluta libertad nodos entre sí, añadir propiedades de manera arbitraria e individualizada y añadir el número de relaciones que queramos entre distintos nodos. Sin embargo, suele ser habitual que, haciendo uso de la clasificación por tipos de los nodos y de las relaciones semánticas habituales que hay entre ellos (y que sean relevantes para el problema en cuestión) se trabaje sobre un esquema inicial que restrinja de alguna forma qué tipos de nodos y propiedades se pueden crear y cómo se pueden relacionar entre sí. Pero debe tenerse en mente que estas restricciones no son propias del modelo GDB, sino que tienen el fin de minimizar los posibles errores y optimizar la manipulación de datos.

Comparadas con las RDB, las GDB a menudo ofrecen mayor velocidad en la búsqueda de patrones y se ajustan más directamente con el mapa conceptual que tenemos del problema. Además, escalan de manera más natural (es decir, no son tan sensibles al tamaño total de la base de datos) y eso facilita las consultas complejas que en las RDB pueden volverse especialmente inmanejables. Además, como dependen de un esquema mucho menos estricto son mucho más apropiadas para escenarios en que los datos pueden ser muy cambiantes (quizás por desconocimiento previo de los requisitos) y hace falta realizar evoluciones en el esquema de datos de manera frecuente. En contra, debe señalarse que especialmente para aquellos casos en que una consulta, por ejemplo, requiere mover mucha información similar, las RDB son mucho más rápidas y eficientes.

Una de las ventajas adicionales del uso de las GDB es que se soportan sobre una teoría matemática muy robusta y madura, por lo que muchos de los procesos necesarios para manejar la información que se ha almacenado en ellas pueden ser resueltos por resultados matemáticos demostrados (como, por ejemplo, la búsqueda de caminos mínimos entre dos nodos del grafo, las consultas, detección de comunidades, etc.).

Sistemas de contulta en GDBs: Traversals y Transformación de grafos

Así como en las RDB existe un lenguaje relacional que nos permite disponer de un sistema de consulta (el lenguaje SQL), en las GDB está en desarrollo un conjunto de lenguajes que permiten realizar consultas y transformaciones en grafos. Los traversals se están convertido en las operaciones más comunes y útiles para realizar consultas en este tipo de bases de datos, llegando a ser tan importantes para las GDB como es SQL para las RDB.

Un traversal en un GDB viene unívocamente determinado por 2 elementos: un nodo inicial, y una especificación para el esquema del camino que será usado para el traversal (es decir, un camino en el esquema del GDB en caso de que éste disponga de uno), y el resultado será siempre un conjunto de nodos del grafo. Dependiendo de la estructura del grafo que se usa como base y del traversal que estemos intentando ejecutar, este conjunto de nodos resultante puede contener muchos, uno o ningún nodo, o incluso contener nodos repetidos, indicando en este caso que se ha encontrado más de un camino que verifica la definición del traversal, partiendo del nodo inicial. Por ejemplo, si en el esquema previo comenzamos un traversal de un nodo representando una Obra al nodo representando los Espacios Fantásticos, encontraremos que para algunas obras el resultado será un nodo repetido, mientras que para aquellas que no hagan uso de ese tipo de espacios no se devuelve ningún nodo.

Como formalización de este concepto podemos escribir un traversal como una lista ordenada \(<N_1,E_1,…,E_{n-1},N_n>\), donde \(N_i\) son subconjuntos de nodos del grafo y \(E_i\) son subconjuntos de aristas (habitualmente, ambos serán tipos de nodos y aristas o relaciones del esquema del grafo).

Por ejemplo, el traversal representado en la figura anterior (no explicitamos los tipos de las aristas ya que en el caso que se presenta éstas vienen determinadas por los pares de nodos que conectan) sería:

\[<"Obra", e_1, "Localización”, e_2, "Acto", e_3, "Contexto", e_4, "Esp.Cerrado">\]

Aplicado al nodo de tipo obra “El Castillo de Lindabridis” se produce el siguiente muticonjunto (un conjunto en el que aparecen elementos repetidos) del tipo Esp.Cerrado:

\[\{Cueva:\ 6,\ Palacio:\ 3,\ Jardín:\ 21,\ Casa:\ 0\}\]

Y aplicado al nodo de tipo obra “El Galán Fantasma” los resultados serían:

\[\{Cueva:\ 0,\ Palacio:\ 0,\ Jardín:\ 39,\ Casa:\ 80\}\]

Como evolución del uso de traversals como herramienta de consulta en GDB podemos, además, interpretarlos como una herramienta de transformación de grafos de la siguiente forma:

Para un grafo, \(G\), y un traversal, \(T=<N_1,E_1,…,E_{n-1},N_n>\), la aplicación de \(T\) sobre \(G\) es un nuevo grafo, \(T(G)\), con nodos en \(N_1\cup N_n\) y con aristas con pesos donde para cada par \((n_1,n_2) \in N_1\times N_n\) el peso de la arista que los conecta es la multiplicidad del nodo \(n_2\) en el resultado de la aplicación del traversal \(T\) comenzando por \(n_1\) (si el resultado es \(0\), entenderemos que no hay ninguna arista conectando esos nodos).

Adicionalmente, se pueden añadir condiciones locales en cada tipo de nodo para filtrar aquellos caminos que verifican ciertas restricciones (se comprueban en tiempo de construción del camino y determinan si dichos nodos proporcionarán un posible camino en el resultado final o no), así como restricciones globales en las que se pueden ver afectados varios tipos de nodos (se comprueban a posteriori y determinan si el camino global debe ser añadido al resultado de la consulta).

Ejemplos y Aplicaciones

Ver Manual de Uso de Query Navigator.

Bibliografía

  • Bush, Vannevar. 1945. "As We May Think." Atlantic Monthly176 (July): 101-108.
  • Coombs, James H., Allen H. Renear, and Steven J. DeRose. 1987. "Markup Systems and the Future of Scholarly Text Processing." Communications of the Association for Computing Machinery 30 (11): 933-947.
  • DeRose Steven J. and David G. Durand. 1994. Making Hypermedia Work: A User's Guide to HyTime. Boston: Kluwer Academic Publishers.
  • DeRose Steven J., David G. Durand, Elli Mylonas, and Allen H. Renear. 1990. "What is Text, Really?" Journal of Computing in Higher Education 1 (2): 3-26.
  • Herwijnen, Eric. 1990. Practical SGML. The Netherlands: Kluwer Academic Publishing Group.
  • Horowitz, Lisa R. 1994. CETH Workshop on Documenting Electronic Texts, May 16-18, Somerset, NJ. Technical Report #2: Center for Electronic Texts in the Humanities, Rutgers and Princeton Universtities.
  • International Organisation for Standardisation. 1992. ISO/IEC IS 10744: Hypermedia/Time-based Structuring Language: HyTime.
  • International Organization for Standardization. 1986. ISO 8879: 1986(E). Information Processing--Text and Office Information Systems—Standard Generalized Markup Language.
  • Nelson, Ted. 1987. Computer Lib. Redmond, Washington: Tempus Books of Microsoft Press.
  • Sperberg-McQueen, C. Michael and Lou Burnard. 1989. Guidelines for the Encoding of Machine-readable Texts. Also known as Text Encoding Initiative document P1. Chicago: Text Encoding Initiative.
  • Tompa, Frank W. 1989. "What is (tagged) text?" Dictionaries in the Electronic Age: Proceedings of the Fifth Annual Conference of the UW Centre for the New Oxford English Dictionary: 81-93.

« Redes Booleanas « || Inicio || » Jornadas FORMA'14 »