Trabajando con archivos MeSH en Python vinculando términos y números

Este tutorial muestra cómo podemos usar diferentes aspectos de Python (es decir, diccionarios, listas y expresiones regulares) juntos para resolver diferentes problemas. También muestra cómo podemos usar Python para vincular las relaciones en el archivo MeSH, lo que facilita la comprensión de su jerarquía y estructura..

Antes de seguir adelante con este tutorial, es posible que se pregunte a qué nos referimos con MeSH. Así que comencemos por definir primero este término, y luego profundizaremos un poco más en su estructura..

Que es meSH?

MeSH es un acrónimo de Encabezados de materia médica. Se considera el vocabulario controlado (tesauro) de la Biblioteca Nacional de Medicina de EE. UU., Que otorga uniformidad y coherencia a la indexación y catalogación de la literatura biomédica. MeSH, una característica distintiva de MEDLINE, se organiza de una manera jerárquica llamada Estructura de árbol de MesH, y se actualiza anualmente.

MeSH es, por lo tanto, una nomenclatura de términos médicos disponible en la Biblioteca Nacional de Medicina de EE. UU., Que tiene como objetivo crear nuevos conocimientos mediante la explotación de las relaciones entre los términos que hacen anotaciones en la literatura biomédica..  

Las personas que realizan búsquedas en MEDLINE / PubMed y otras bases de datos utilizan MeSH para ayudar en la búsqueda de temas. Los indexadores de la Biblioteca Nacional de Medicina (NLM) utilizan MeSH para describir el contenido del tema de los artículos de revistas para MEDLINE. Los catalogadores usan MeSH para describir libros y audiovisuales en NLM y otras colecciones de bibliotecas. Por lo tanto, MeSH se puede utilizar para numerosas tareas que incluyen indexación, etiquetado, búsqueda, recuperación, análisis, codificación, combinación y uso compartido de texto biomédico..

Estructura de archivos MeSH

Los descriptores de MeSH están organizados en 16 categorías:

  • UNA: anatomía
  • SEGUNDO: organismos 
  • DO: enfermedades
  • RE: drogas y quimicos
  • MI: Técnicas y equipos analíticos, diagnósticos y terapéuticos.
  • F: psiquiatría y psicología
  • SOL: Fenómenos y procesos. 
  • H: disciplinas y ocupaciones
  • YO: Antropología, educación, sociología y fenómenos sociales.
  • J: tecnología, industria, agricultura
  • K: humanidades
  • L: Ciencias de la Información
  • METRO: grupos nombrados
  • NORTE: cuidado de la salud
  • V: características de publicación
  • Z: geográficos

Puede encontrar más información sobre las categorías en la Biblioteca Nacional de Medicina de EE. UU. Como podemos ver, cada categoría se divide en subcategorías. Sin embargo, esta estructura no se considera un sistema autoritario de clasificación de sujetos, sino más bien como una disposición de descriptores para la orientación y la conveniencia de las personas que asignan títulos de sujetos a documentos o buscan literatura. Por lo tanto, no es una clasificación exhaustiva del tema y contiene solo los términos que se han seleccionado para su inclusión en este tesauro..

Aquí hay más información sobre las estructuras de árbol de MeSH:

Debido a la estructura de ramificación de las jerarquías, estas listas a veces se denominan "árboles". Cada descriptor de MeSH aparece en al menos un lugar en los árboles, y puede aparecer en tantos lugares adicionales como sea apropiado. Aquellos que indexan artículos o libros de catálogo tienen instrucciones de encontrar y usar el descriptor MeSH más específico disponible para representar cada concepto indexable.. 

Descargando un archivo MeSH

Para el propósito de este tutorial, necesitamos un archivo MeSH para trabajar en Python. Puede encontrar el archivo MeSH en el sitio de descarga de NLM.

Continuemos y descarguemos el último archivo ASCII MeSH. Primero podemos ir al archivo FTP de MeSH: ftp://nlmpubs.nlm.nih.gov/online/mesh/, y luego elegir 2017 directorio. En el asciimesh / directorio, encontrarás tres .compartimiento archivos: c2017.bind2017.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).

Vinculando términos a números

Saltemos al núcleo de este artículo. Lo que estamos tratando de hacer es leer un archivo MeSH (es decir. la .compartimiento archivo que acaba de descargar), navegue por las entradas, encuentre todos los números MeSH para cada entrada y haga una lista de los términos junto con sus números relevantes. 

Lo primero que haríamos normalmente es leer el .compartimiento archivo, como sigue:

meshFile = 'd2017.bin' con open (meshFile, mode = "rb") como archivo: mesh = file.readlines ()

Tenga en cuenta que hemos utilizado el rb Modo, lo que significa que estamos leyendo binario sin traducción de salto de línea.

También necesitamos definir un archivo de salida donde almacenaríamos los resultados (salida):

outputFile = abierto ('mesh.txt', 'w')

En este punto, queremos comprobar las líneas que comienzan con MH = (Término MeSH) y MN = (Número MeSH). No debería hacer esto ahora, pero le mostraré una instantánea del archivo MeSH para tener una idea de la estructura y eliminar cualquier confusión (MH y Minnesota están rodeados por rectángulos rojos, respectivamente).


Para comprobar las líneas que comienzan con MH = y MN =, Necesitamos usar expresiones regulares. Entonces, si queremos comprobar las líneas que comienzan con MH = seguido de cualquier carácter, haríamos lo que se muestra en el código siguiente (llegaré a lo que línea está en un momento). Note que he usado segundo en lugar de r para la expresión regular, ya que estamos aplicando el patrón en un objeto de byte y no en un objeto de cadena, por lo que deberíamos usar un patrón de byte.

importar re meshTerm = re.search (b'MH = (. +) $ ', línea)

Lo mismo se aplicaría para el número MeSH, pero esta vez para las líneas que comienzan con MN =.

Volviendo a línea, esto se refiere a las líneas en el archivo MeSH. Así que estaríamos recorriendo el archivo línea por línea, buscando los términos y números de MeSH. Como puede ver en la instantánea del archivo MeSH anterior, el término MeSH aparece antes del número MeSH. Entonces, en nuestro código, el número MeSH siempre será el número correspondiente al término MeSH capturado anteriormente. Así haremos lo siguiente:

para línea en malla: meshTerm = re.search (b'MH = (. +) $ ', línea) si meshTerm: término = meshTerm.group (1) meshNumber = re.search (b'MN = (. +) $ ', línea) si meshNumber: number = meshNumber.group (1) numbers [number.decode (' utf-8 ')] = term.decode (' utf-8 ') si término en términos: términos [term] = términos [term] + "+ number.decode ('utf-8') else: términos [term] = number.decode ('utf-8')

Vayamos por el código anterior paso a paso. Si nos fijamos en la expresión regular. MH = (. +) $, esto es básicamente diciéndonos que encontremos el literal MH = seguido de al menos un personaje. (.) Significa cualquier personaje, y + significa que tiene que ser uno o más caracteres, y devolver todo al final de la línea (PS). 

El paréntesis alrededor .+, es decir (. +), Es un grupo de captura para que podamos 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 recuperado será Calcomicina. La razón por la que estamos utilizando las sentencias if es que algunas líneas no comenzarán con MH = ni MN =.

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

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

si término en términos: términos [término] = términos [término] + "+ number.decode ('utf-8') else: términos [término] = number.decode ('utf-8')

Por lo tanto, en este caso tendremos un objeto de diccionario con pares clave-valor que consisten en un término MeSH como llave, y la colección de concatenación de todos los números MeSH correspondientes como el valor.

Lo que queremos hacer ahora es enumerar las diferentes claves (términos), y tener los valores (números) relevantes listados debajo del término relevante. Para listar los diferentes términos, hacemos lo siguiente:

meshNumberList = [] meshTermList = terms.keys () para el término en meshTermList: item_list = terms [term] .split (") para frase en item_list: meshNumberList.append (frase) 

Finalmente, listaremos el término y sus números relevantes de la siguiente manera:

used_items = set () para el elemento en meshNumberList: si los números [item] no están en used_items: print (números [item], '\ n', item, file = outputFile) used_items.add (numbers [item]) else: print ( item, file = outputFile)

Antes de mostrar la salida del programa, pongámoslo todo junto.

Poniendolo todo junto

En esta sección, te mostraré cómo se ve nuestro programa completo de Python que vincula el término MeSH con sus números:

importar re términos =  números =  meshFile = 'd2017.bin' con abierto (meshFile, mode = "rb") como archivo: mesh = file.readlines () outputFile = open ('mesh.txt', 'w ') para línea en malla: meshTerm = re.search (b'MH = (. +) $', línea) si meshTerm: término = meshTerm.group (1) meshNumber = re.search (b'MN = (. + ) $ ', línea) si meshNumber: number = meshNumber.group (1) numbers [number.decode (' utf-8 ')] = term.decode (' utf-8 ') si término en términos: términos [term] = términos [término] + "+ number.decode ('utf-8') else: términos [term] = número.decode ('utf-8') meshNumberList = [] meshTermList = terms.keys () para el término en meshTermList : item_list = términos [term] .split (") para frase en item_list: meshNumberList.append (frase) meshNumberList.sort () used_items = set () para item en meshNumberList: si los números [item] no están en los items usados: print (numbers [item], '\ n', item, file = outputFile) used_items.add (numbers [item]) else: print (item, file = outputFile)

Salida

Puedes descargar la salida desde Dropbox (1.77 MB). Tomando una muestra de la salida como se muestra a continuación, podemos ver cómo un término MeSH (Fossa Pterigopalatina) se enumera con sus números MeSH que se agrupan inmediatamente debajo.

Pterygopalatine Fossa A02.835.232.781.670 A02.835.232.781.750 A02.835.232.781.750.150 A02.835.232.781.750.165 A02.835.232.781.750.400

Conclusión

El tutorial mostró cómo podemos usar diferentes aspectos de Python (es decir. Diccionarios, listas y expresiones regulares) juntos para resolver diferentes problemas. También muestra cómo podemos usar Python para trabajar con archivos MeSH para vincular algunas partes de este archivo complejo de una manera que facilita la comprensión de su jerarquía y estructura, como hicimos aquí al vincular el término MeSH con sus números MeSH relevantes..