Advertisement
  1. Code
  2. Python

Trabajar con Archivos MeSH en Python: Uniendo Términos y Números

Scroll to top
Read Time: 8 min

Spanish (Español) translation by Jean Perez (you can also view the original English article)

Este tutorial muestra cómo usar diferentes aspectos de Python (es decir, diccionarios, listas y expresiones regulares) juntos para resolver diferentes problemas. También se muestra cómo usar Python para vincular las relaciones en el archivo MeSH, haciéndolo más fácil de comprender su estructura y jerarquía.

Antes de seguir adelante con este tutorial, quizás se pregunte qué entendemos por MeSH. Así que vamos a comenzar por definir este término primero y luego ir en detalle un poco más sobre su estructura.

¿Qué es MeSH?

MeSH es un acrónimo de Medical Subject Headings. Se considera el vocabulario controlado Biblioteca Nacional de medicina de los Estados Unidos (thesaurus), que da uniformidad y consistencia a la indización y catalogación de la literatura biomédica. MeSH, un rasgo distintivo de MEDLINE, se arregla de una manera jerárquica llamada la estructura de MeSH y se actualiza anualmente.

MeSH es una nomenclatura de términos médicos disponibles en la Biblioteca Nacional de medicina de los Estados Unidos , que tiene como objetivo crear nuevo conocimiento mediante la explotación de las relaciones entre términos que anotan la literatura biomédica.

Búsqueda MEDLINE/PubMed y otras bases de datos de personas hacen uso de MeSH para ayudar con el tema buscando. Los indizadores de la Biblioteca Nacional de Medicina (NLM) usan MeSH para describir el contenido del tema de artículos para MEDLINE. Catalogadores usan MeSH para describir libros y audiovisuales en la NLM y otras colecciones de la biblioteca. Así la MeSH puede ser utilizada para numerosas tareas en las que la indexación, etiquetado, buscar, recuperar, analizar, codificación, combinar y compartir texto biomédica.

Estructura del Archivo MeSH

Descriptores MeSH están organizados en 16 categorías:

  • A: Anatomía
  • B: organismos
  • C: enfermedades
  • D: químicos y drogas 
  • E: análisis, diagnósticos, equipos y técnicas terapéuticos
  • F: psiquiatría y psicología
  • G: los fenómenos y procesos
  • H: ocupaciones y disciplinas
  • I: antropología, educación, sociología y fenómenos sociales
  • J: tecnología, industria, agricultura
  • K: humanidades
  • L: ciencias de la información
  • M: grupos nombrados
  • N: salud
  • V: características de publicación
  • Z: geográficas

Puede encontrar más información acerca de las categorías de la Biblioteca Nacional de medicina de Estados Unidos. Como podemos ver, cada categoría se divide en subcategorías. Esta estructura, sin embargo, no considera un sistema de clasificación de autoridad del tema, sino más bien como un arreglo de descriptores para la dirección y la comodidad de quienes son la asignación de encabezamientos de materia a documentos o ámbito de literatura. No es una clasificación exhaustiva del tema y contiene sólo los términos que han sido seleccionados para su inclusión en este diccionario.

Aquí hay más información sobre las Estructuras de Arbol MeSH:

Debido a la estructura de ramificación de las jerarquías, estas listas se refieren a veces como "árboles". Cada descriptor MeSH aparece en por lo menos un lugar en los árboles y puede aparecer en tantos lugares adicionales que sean apropiados. Los artículos de índice o catálogo de libros se instruye a encontrar y usar el descriptor MeSH más específico que representan cada concepto indexable.

Descargando un Archivo MeSH

Con el propósito de este tutorial, necesitamos un archivo MeSH para trabajar con Python. Usted puede encontrar el archivo MeSH en el sitio de descarga de NLM.

Vamos a seguir adelante y descargar el último archivo de ASCII MeSH. Primero podemos ir al archivo de MeSH FTP: ftp://nlmpubs.nlm.nih.gov/online/mesh/ y seleccione el directorio de 2017. En el asciimesh / directorio, usted encontrará tres archivos .bin: c2017.bin, d2017.bin y q2017.bin. Vamos a descargar d2017.bin. Puede descargar el archivo desde: ftp://nlmpubs.nlm.nih.gov/online/mesh/2017/asciimesh/d2017.bin (27,5 MB).

Vincular Términos con Números

Vamos a saltar en el núcleo de este artículo. Lo que estamos tratando de hacer es leer un archivo MeSH (es decir, el archivo .bin que acabas de descargar), navegar a través de las entradas, encontrar todos los números MeSH para cada entrada y lista de los términos junto con sus números correspondientes.

Lo primero que harían es leer el archivo .bin, como sigue:

1
meshFile = 'd2017.bin'
2
with open(meshFile, mode='rb') as file:
3
    mesh = file.readlines()

Observe que hemos utilizado el modo de rb, lo que significa que estamos leyendo binarios con ninguna traducción de salto de línea.

También tenemos que definir un archivo de salida donde almacenamos los resultados (salida):

1
outputFile = open('mesh.txt', 'w')

En este punto, queremos ver las líneas que comienzan con MH = (término MeSH) y MN = (número MeSH). No debería hacer esto ahora, pero se muestra una instantánea del archivo MeSH para tener una idea de la estructura y eliminar cualquier confusiones (MH y MN están rodeados de rectángulos rojos, respectivamente).

A snapshot of the MeSH fileA snapshot of the MeSH fileA snapshot of the MeSH file

Para comprobar las líneas que empiecen con MH = y MN =, tenemos que utilizar las expresiones regulares. Por lo tanto, si queremos ver las líneas que comienzan con MH = seguido de cualquier carácter, que haríamos como se muestra en el código siguiente (te ire a buscar a qué línea está en ese momento). Aviso que he utilizado b en lugar de r para la expresión regular, ya que estamos aplicando el patrón en un objeto de bytes y no un objeto de cadena, por lo que debemos utilizar un patrón de bytes.

1
import re
2
meshTerm = re.search(b'MH = (.+)$', line)

Lo mismo aplicaría para el número MeSH, pero esta vez para las líneas a partir de MN =.

Volviendo a la línea, esto se refiere a las líneas en el archivo MeSH. Así que nos caminando a través del archivo línea por línea, buscando los números y términos MeSH. Como se puede ver en la instantánea anterior del archivo MeSH, el término MeSH viene antes del número de MeSH. Así, en nuestro código, el número MeSH siempre será el número correspondiente al término MeSH previamente capturado. Por lo tanto haremos lo siguiente:

1
for line in mesh:
2
    meshTerm = re.search(b'MH = (.+)$', line)
3
    if meshTerm:
4
        term = meshTerm.group(1)
5
    meshNumber = re.search(b'MN = (.+)$', line)
6
    if meshNumber:
7
        number = meshNumber.group(1)
8
        numbers[number.decode('utf-8')] = term.decode('utf-8')
9
        if term in terms:
10
            terms[term] = terms[term] + ' ' + number.decode('utf-8')
11
        else:
12
            terms[term] = number.decode('utf-8')

Veamos el código anterior paso a paso. Si nos fijamos en la expresión regular MH = (. +) $, esto básicamente nos dice que encontrar literal MH = seguido de menos un carácter. (.) significa cualquier carácter, y + significa que tiene que ser uno o más caracteres y volver todo al final de la línea ($).

Los paréntesis alrededor de .+, es decir (.+), es un grupo de captura, por lo que podemos recuperar el resultado. Por lo tanto, para el término MeSH rodeado por un rectángulo rojo en la instantánea anterior, el término obtenido será Calcomycin. La razón por la que estamos utilizando declaraciones if es que algunas líneas ni comience con MH = ni con MN =.

Para el término MeSH capturada y el número MeSH, creamos un nuevo par de clave y valor de un objeto de diccionario, como se muestra en esta línea de código: numbers[str(number)] = term.

Es importante tener en cuenta que un solo término MeSH podría tener más de un número MeSH. Así nos concatenar cada nuevo número MeSH con el término relevante en una cadena, como se muestra en esta parte del código:

1
if term in terms:
2
            terms[term] = terms[term] + ' ' + number.decode('utf-8')
3
        else:
4
            terms[term] = number.decode('utf-8')

Así en este caso tendremos un objeto dictionary con pares de clave y valor que consisten en un período MeSH como la clave y la colección de la concatenación de los correspondientes números de MeSH como el valor.

Ahora lo que queremos hacer es una lista de las diferentes claves (términos), y con los pertinentes valores (números) en el término correspondiente. Para listar los diferentes términos, hacemos lo siguiente:

1
meshNumberList = []
2
meshTermList = terms.keys()
3
for term in meshTermList:
4
    item_list = terms[term].split(' ')
5
    for phrase in item_list:
6
        meshNumberList.append(phrase)

Finalmente, enumeraremos el término y sus números correspondientes como sigue:

1
used_items = set()
2
for item in meshNumberList:
3
    if numbers[item] not in used_items:
4
        print(numbers[item], '\n', item, file=outputFile)
5
      used_items.add(numbers[item])
6
    else:
7
    	print(item, file=outputFile)

Antes de mostrar la salida del programa, vamos a poner todo junto.

Juntándolo Todo

En esta sección, voy a mostrarles como luce nuestro completo programa de Python que une el término MeSH a su número:

1
import re
2
3
terms = {}
4
numbers = {}
5
6
meshFile = 'd2017.bin'
7
with open(meshFile, mode='rb') as file:
8
    mesh = file.readlines()
9
10
outputFile = open('mesh.txt', 'w')
11
12
for line in mesh:
13
    meshTerm = re.search(b'MH = (.+)$', line)
14
    if meshTerm:
15
        term = meshTerm.group(1)
16
    meshNumber = re.search(b'MN = (.+)$', line)
17
    if meshNumber:
18
        number = meshNumber.group(1)
19
        numbers[number.decode('utf-8')] = term.decode('utf-8')
20
        if term in terms:
21
            terms[term] = terms[term] + ' ' + number.decode('utf-8')
22
        else:
23
            terms[term] = number.decode('utf-8')
24
25
meshNumberList = []
26
meshTermList = terms.keys()
27
for term in meshTermList:
28
    item_list = terms[term].split(' ')
29
    for phrase in item_list:
30
        meshNumberList.append(phrase)
31
32
meshNumberList.sort()
33
34
used_items = set()
35
for item in meshNumberList:
36
    if numbers[item] not in used_items:
37
        print(numbers[item], '\n', item, file=outputFile)
38
    	used_items.add(numbers[item])
39
    else:
40
    	print(item, file=outputFile)

Salida

Puede descargar la salida de Dropbox (1,77 MB). Tomar una muestra de la salida como se muestra a continuación, podemos ver cómo un término MeSH (Pterygopalatine Fossa) está en la lista con sus números de MeSH que se agrupan inmediatamente por debajo.

1
Pterygopalatine Fossa 
2
 A02.835.232.781.670
3
A02.835.232.781.750
4
A02.835.232.781.750.150
5
A02.835.232.781.750.165
6
A02.835.232.781.750.400

Conclusión

El tutorial mostró cómo usar diferentes aspectos de Python (es decir diccionarios, listas y expresiones regulares) juntos para resolver diferentes problemas. También se muestra cómo usar Python para trabajar con archivos de MeSH para unir algunas partes de este complejo archivo de manera que resulta más fácil comprender su jerarquía y estructura, como aquí vinculando el término de acoplamiento con su correspondiente MeSH a números.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.