mongoDB y la Ley Federal de Telecomunicaciones y Radiodifusión

mongoDB y la Ley Federal de Telecomunicaciones y Radiodifusión

mario.hernandez 06 June 2019

Después de realizar el curso básico de bases datos de MongoDB impartido por la University MongoDB https://university.mongodb.com/, el cual recomiendo ampliamente, y observar que entre las ventajas de las base de datos NoSQL (Not only SQL) se encuentra no definir un SCHEMA estricto, lo cual genera la posibilidad de desarrollar diversas aplicaciones.

Asimismo, por razones laborales he trabajado con diversas leyes, específicamente la Ley Federal de Telecomunicaciones y Radiodifusión, misma que puede ser un poco complicada si se pretende leer de forma lineal, por las múltiples definiciones técnicas tanto de economía, de ingeniería y legales, que dependiendo del área de especialización del lector, unas u otros conceptos pueden presentar dificultades, sin mencionar, que dentro de la misma ley existen referencias cruzadas a párrafos internos o a leyes externas, lo cual implica que cuando se estudia la ley, se tenga que interrumpir la lectura para regresar a revisar definiciones o consultar leyes externas de forma recurrente, lo cual complica su lectura.

Es por lo anterior, que para aprovechar las características de las bases de datos de MongoDB y tratar de hacer un poco más sencilla la lectura de la ley, este post define una estructura para realizar una base de datos NoSQL para organizar la Ley Federal de Telecomunicaciones y Radiodifusión (o cualquier otra ley).

Párrafos

La base de datos MongoDB será una colección de párrafos (o documentos en MongoDB), donde cada documento tendrá los siguientes campos:

  1. parrafo: Información del párrafo.
  2. referencia: Identifica al párrafo de forma única en la ley.

Asimismo, cada documento podrá contener los siguientes campos (opcionales, según lo requieran):

  1. titulo: Indica a que Título de la ley pertenece el párrafo.
  2. capitulo: Indica a que Capítulo de la ley pertenece el párrafo.
  3. seccion: Indica a que Sección de la ley pertenece el párrafo.
  4. articulo: Indica a que Artículo de la ley pertenece el párrafo.
  5. parrafo_num: Número de parrafo con respecto a un artículo.
  6. definiciones: Definiciones necesarias para poder comprender mejor el párrafo.
  7. leyes: Referencias a leyes externas (nacionales o internacionales) que pueda tener el párrafo.
    1. x_refs: Artículos que hacen referencia a párrafos de la misma ley (Determinado Inciso, Fracción, Artículo, etc.) o una ley externa.
  8. modificado: Indica si el párrafo fue reformado, adicionado o derogado.

De tal suerte que un documento de la colección en MongoDB se podría visualizar de la siguiente forma (ejemplo: párrafo 1 del vigésimo transitorio):

{
  "_id": {
    "$oid": "5d452399100e62c2b69771b8"
  },
  "referencia": {
    "$numberInt": "1890"
  },
  "titulo": [
    "TRANSITORIOS"
  ],
  "articulo": "VIGÉSIMO",
  "parrafo_numero": {
    "$numberInt": "0"
  },
  "parrafo": `VIGÉSIMO. El Instituto Federal de Telecomunicaciones aplicará el 
    artículo 131 de la Ley Federal de Telecomunicaciones y Radiodifusión y demás 
    que resulten aplicables en materia de interconexión en términos de la misma, 
    y garantizará el debido cumplimiento de las obligaciones establecidas en dichos
    preceptos, mismos que serán exigibles sin perjuicio e independiente de que a 
    la entrada en vigor de la Ley, ya hubiera determinado la existencia de un 
    agente económico preponderante e impuesto medidas necesarias para evitar que 
    se afecte la competencia y la libre concurrencia de acuerdo a la fracción III 
    del artículo Octavo Transitorio del Decreto por el que se reforman y 
    adicionan diversas disposiciones de los artículos 6o., 7o., 27, 28, 73, 
    78, 94 y 105 de la Constitución Política de los Estados Unidos Mexicanos, 
    en materia de telecomunicaciones, publicado en el Diario Oficial de la 
    Federación el 11 de junio de 2013.`,
  "definiciones": [],
  "leyes": [
    {
      "name": "Ley Federal De Telecomunicaciones Y Radiodifusión|\\bpresente ley\\b|\\besta ley\\b",
      "key": "LFDTYRad",
      "matched": [
        [
          "Ley Federal de Telecomunicaciones y Radiodifusión",
          [
            {
              "$numberInt": "84"
            },
            {
              "$numberInt": "133"
            }
          ]
        ]
      ],
      "x_refs": [
        [
          "131",
          [
            {
              "$numberInt": "74"
            },
            {
              "$numberInt": "77"
            }
          ]
        ]
      ]
    },
    {
      "name": "Constitución Política De Los Estados Unidos Mexicanos|\\bconstitución\\b|\\bconstitucional\\b",
      "key": "CPDLEUMex",
      "matched": [
        [
          "Constitución Política de los Estados Unidos Mexicanos",
          [
            {
              "$numberInt": "765"
            },
            {
              "$numberInt": "818"
            }
          ]
        ]
      ],
      "x_refs": [
        [
          "6o",
          [
            {
              "$numberInt": "724"
            },
            {
              "$numberInt": "726"
            }
          ]
        ],
        [
          "7o",
          [
            {
              "$numberInt": "729"
            },
            {
              "$numberInt": "731"
            }
          ]
        ],
        [
          "27",
          [
            {
              "$numberInt": "734"
            },
            {
              "$numberInt": "736"
            }
          ]
        ],
        [
          "28",
          [
            {
              "$numberInt": "738"
            },
            {
              "$numberInt": "740"
            }
          ]
        ],
        [
          "73",
          [
            {
              "$numberInt": "742"
            },
            {
              "$numberInt": "744"
            }
          ]
        ],
        [
          "78",
          [
            {
              "$numberInt": "746"
            },
            {
              "$numberInt": "748"
            }
          ]
        ],
        [
          "94",
          [
            {
              "$numberInt": "750"
            },
            {
              "$numberInt": "752"
            }
          ]
        ],
        [
          "105",
          [
            {
              "$numberInt": "755"
            },
            {
              "$numberInt": "758"
            }
          ]
        ]
      ]
    }
  ]
}

Obtención de definiciones

Para obtener las definiciones se propone un diccionario donde cada uno de los párrafos de la ley será escaneado por éste, una gran parte de las definiciones estan definidas dentro de la misma ley en su Artículo 3, pero dado que estas pueden estar contenidas en cualquier parte del párrafo, con mayúsculas, cambiar de singular a plural, el diccionario contendrá una expresión regular (RegExp), por ejemplo, para el concepto "Agente con poder sustancial", para realizar la búsqueda considerando plural y singular:

regex = r'Agentes? con poder sustancial'

El código en python3 para identificar las definiciones de cada párrafo quedaría:

import re

#Por ejemplo coloco solo 3 definiciones.
definiciones = [
    ('Acceso al usuario final', 'El circuito físico que conecta el punto de conexión terminal de la red en el domicilio del usuario a la central telefónica o instalación equivalente de la red pública de telecomunicaciones local, desde la cual se presta el servicio al usuario.', r'Accesos? al usuario final',), 
    ('Agente con poder sustancial', 'Aquél agente económico que tiene poder sustancial en algún mercado relevante de los sectores de radiodifusión o telecomunicaciones, conforme a lo establecido en la Ley Federal de Competencia Económica.', r'Agentes? con poder sustancial',),
    ('Arquitectura abierta', 'Conjunto de características técnicas de las redes públicas de telecomunicaciones que les permite interconectarse entre sí, a nivel físico o virtual, lógico y funcional, de tal manera que exista interoperabilidad entre ellas.', r'Arquitecturas? abiertas?',)
]

for parrafo in coleccion:
    coincidencias = []
    print(parrafo)
    
    for regex in definiciones:
        aparece = re.search(regex[2], parrafo, flags=re.IGNORECASE)
        if aparece:
            coincidencia = re.findall(regex[2], parrafo, flags=re.IGNORECASE)[0]
            donde = aparece.span()
            coincidencias.append((coincidencia, donde))

    print(coincidencias)

Lo anterior nos generará una salida por párrafo como:

Artículo 283. Las obligaciones y limitaciones específicas tendrán por objeto que no se 
afecte la competencia y libre concurrencia, y el Instituto no estará limitado a las materias 
referidas en el artículo anterior. Las sanciones previstas en la Ley Federal de Competencia 
Económica serán aplicables en el caso de agentes con poder sustancial. Asimismo, el Instituto 
podrá imponer al agente con poder sustancial las medidas previstas en los artículos 266 a 277 
de la presente Ley.
[('agentes con poder sustancial', (320, 348)), ('Instituto', (139, 148)), ('Ley', (250, 253))]

Es de notar que el método "span" resulta de gran utilidad ya que nos indica las posiciones (inicial y final) de las coincidencias, lo cual facilitará ingresar con código HTML algún componente como tooltips o popovers, con la finalidad de obtener la definición al pasar el mouse sobre la palabra o al dar click sobre ella.

Para identificar las leyes se sigue el mismo procedimiento, sin embargo, ahora las "definiciones" será una lista de "leyes".

Finalmente, donde se presenta mayor complicación es identificar las referencias cruzadas, las cuales serán tratadas en el siguiente post.