COVID-19 Open Research Dataset

Conjunto de datos de texto completo y metadatos de COVID-19 y artículos académicos relacionados con el coronavirus optimizados para la legibilidad por máquina y disponibles para que los utilice la comunidad de investigación global.

En respuesta a la pandemia de la COVID-19, el Instituto Para la Inteligencia Artificial se ha asociado con grupos de investigación líderes para preparar y distribuir el conjunto de datos COVID-19 Open Research Dataset (CORD-19). Este conjunto de datos es un recurso gratuito de más de 47 000 artículos académicos, incluidos más de 36 000 con texto completo, sobre la COVID-19 y la familia de los coronavirus para uso de la comunidad investigadora mundial.

Este conjunto de datos moviliza a los investigadores para que apliquen los avances recientes en el procesamiento del lenguaje natural para generar nuevas conclusiones en apoyo de la lucha contra esta enfermedad infecciosa.

El corpus se puede actualizar a medida que se publique una nueva investigación en publicaciones revisadas por expertos y servicios de archivo, como bioRxiv, medRxiv, etc.

Nota

Microsoft proporciona Azure Open Datasets "tal cual". Microsoft no ofrece ninguna garantía, expresa o implícita, ni condición con respecto al uso que usted haga de los conjuntos de datos. En la medida en la que lo permita su legislación local, Microsoft declina toda responsabilidad por posibles daños o pérdidas, incluidos los daños directos, consecuenciales, especiales, indirectos, incidentales o punitivos, que resulten de su uso de los conjuntos de datos.

Este conjunto de datos se proporciona bajo los términos originales con los que Microsoft recibió los datos de origen. El conjunto de datos puede incluir datos procedentes de Microsoft.

Términos de licencia

Este conjunto de datos está disponible en el Instituto Para la Inteligencia Artificial y el Semantic Scholar. Al acceder, descargar o, de otro modo, usar cualquier contenido proporcionado en el conjunto de datos CORD-19, acepta la licencia del conjunto de datos relacionada con el uso de este conjunto de datos. En el archivo de metadatos se encuentra disponible información de licencia específica para artículos individuales del conjunto de datos. Puede obtener más información sobre licencias en el los sitios web de PMC, medRxiv y bioRxiv.

Volumen y retención

Este conjunto de datos se almacena en formato JSON y la versión más reciente contiene más de 36 000 artículos de texto completo. Cada artículo se representa como un único objeto JSON. Consulta del esquema.

Ubicación de almacenamiento

Este conjunto de datos se almacena en la región Este de EE. UU. de Azure. Se recomienda asignar recursos de proceso de la misma región por afinidad.

Referencia bibliográfica

Al incluir datos de CORD-19 en una publicación o redistribución, cite el conjunto de datos de la siguiente forma:

En bibliografía:

Conjunto de datos de investigación abierto para el COVID-19 (CORD-19). 2020. Versión AAAA-MM-DD. Recuperado de Conjunto de datos de investigación abierto para el COVID-19 (CORD-19). Último acceso el AAAA-MM-DD. doi:10.5281/zenodo.3715505

En el texto: (CORD-19, 2020)

Contacto

Si tiene preguntas relacionadas con este conjunto de datos, póngase en contacto con partnerships@allenai.org.

Acceso a datos

Azure Notebooks

Conjunto de datos CORD-19

CORD-19 es una colección de más de 50 000 artículos( incluidos más de 40 000 con texto completo) sobre la COVID-19, el SARS-CoV-2 y virus relacionados. Este conjunto de datos se ha puesto a disposición libre con el objetivo de ayudar a las comunidades de investigación a combatir la pandemia de la COVID-19.

El objetivo de este cuaderno es doble:

  1. Demostrar cómo acceder al conjunto de datos CORD-19 en Azure: nos conectamos a la cuenta de Azure Blob Storage que contiene el conjunto de datos CORD-19.
  2. Recorrer la estructura del conjunto de datos: los artículos del conjunto de datos se almacenan como archivos JSON. Se proporcionan ejemplos que muestran:
  • Cómo buscar los artículos (navegar por el contenedor)
  • Cómo leer los artículos (navegar por el esquema JSON)

Dependencias: este cuaderno necesita las siguientes bibliotecas.

  • Azure Storage (por ejemplo, pip install azure-storage)
  • NLTK (docs)
  • Pandas (por ejemplo, pip install pandas)

Obtención de los datos de CORD-19 de Azure

Los datos de CORD-19 se han cargado como un conjunto de datos de Azure Open Datasets aquí. Creamos un servicio de blob vinculado a este conjunto de datos de CORD-19 abierto.

from azure.storage.blob import BlockBlobService

# storage account details
azure_storage_account_name = "azureopendatastorage"
azure_storage_sas_token = "sv=2019-02-02&ss=bfqt&srt=sco&sp=rlcup&se=2025-04-14T00:21:16Z&st=2020-04-13T16:21:16Z&spr=https&sig=JgwLYbdGruHxRYTpr5dxfJqobKbhGap8WUtKFadcivQ%3D"

# create a blob service
blob_service = BlockBlobService(
    account_name=azure_storage_account_name,
    sas_token=azure_storage_sas_token,
)

Podemos usar este servicio de blobs como identificador en los datos. Podemos recorrer el conjunto de datos con las API de BlockBlobService. Obtenga más información aquí:

Los datos de CORD-19 se almacenan en el contenedor covid19temp. Esta es la estructura de archivos dentro del contenedor junto con un archivo de ejemplo.

metadata.csv
custom_license/
    pdf_json/
        0001418189999fea7f7cbe3e82703d71c85a6fe5.json        # filename is sha-hash
        ...
    pmc_json/
        PMC1065028.xml.json                                  # filename is the PMC ID
        ...
noncomm_use_subset/
    pdf_json/
        0036b28fddf7e93da0970303672934ea2f9944e7.json
        ...
    pmc_json/
        PMC1616946.xml.json
        ...
comm_use_subset/
    pdf_json/
        000b7d1517ceebb34e1e3e817695b6de03e2fa78.json
        ...
    pmc_json/
        PMC1054884.xml.json
        ...
biorxiv_medrxiv/                                             # note: there is no pmc_json subdir
    pdf_json/
        0015023cc06b5362d332b3baf348d11567ca2fbb.json
        ...

Cada archivo .json corresponde a un artículo individual del conjunto de datos. Aquí es donde se almacenan el título, los autores, los resúmenes y (si están disponibles) los datos de texto completo.

Uso de metadata.csv

El conjunto de datos CORD-19 incluye metadata.csv, un único archivo que registra información básica sobre todos los documentos disponibles en el conjunto de datos CORD-19. El cuadro de búsqueda es un buen punto de partida.

# container housing CORD-19 data
container_name = "covid19temp"

# download metadata.csv
metadata_filename = 'metadata.csv'
blob_service.get_blob_to_path(
    container_name=container_name,
    blob_name=metadata_filename,
    file_path=metadata_filename
)
import pandas as pd

# read metadata.csv into a dataframe
metadata_filename = 'metadata.csv'
metadata = pd.read_csv(metadata_filename)
metadata.head(3)

Esto es muy importante a primera vista, así que vamos a pulirlo un poco.

simple_schema = ['cord_uid', 'source_x', 'title', 'abstract', 'authors', 'full_text_file', 'url']

def make_clickable(address):
    '''Make the url clickable'''
    return '<a href="{0}">{0}</a>'.format(address)

def preview(text):
    '''Show only a preview of the text data.'''
    return text[:30] + '...'

format_ = {'title': preview, 'abstract': preview, 'authors': preview, 'url': make_clickable}

metadata[simple_schema].head().style.format(format_)
# let's take a quick look around
num_entries = len(metadata)
print("There are {} many entries in this dataset:".format(num_entries))

metadata_with_text = metadata[metadata['full_text_file'].isna() == False]
with_full_text = len(metadata_with_text)
print("-- {} have full text entries".format(with_full_text))

with_doi = metadata['doi'].count()
print("-- {} have DOIs".format(with_doi))

with_pmcid = metadata['pmcid'].count()
print("-- {} have PubMed Central (PMC) ids".format(with_pmcid))

with_microsoft_id = metadata['Microsoft Academic Paper ID'].count()
print("-- {} have Microsoft Academic paper ids".format(with_microsoft_id))
There are 51078 many entries in this dataset:
-- 42511 have full text entries
-- 47741 have DOIs
-- 41082 have PubMed Central (PMC) ids
-- 964 have Microsoft Academic paper ids

Ejemplo: Lectura de texto completo

metadata.csv no contiene el texto completo en sí. Veamos un ejemplo de cómo leerlo. Busque y desempaquete el JSON de texto completo y conviértalo en una lista de oraciones.

# choose a random example with pdf parse available
metadata_with_pdf_parse = metadata[metadata['has_pdf_parse']]
example_entry = metadata_with_pdf_parse.iloc[42]

# construct path to blob containing full text
blob_name = '{0}/pdf_json/{1}.json'.format(example_entry['full_text_file'], example_entry['sha'])  # note the repetition in the path
print("Full text blob for this entry:")
print(blob_name)

Ahora podemos leer el contenido JSON asociado a este blob como se muestra a continuación.

import json
blob_as_json_string = blob_service.get_blob_to_text(container_name=container_name, blob_name=blob_name)
data = json.loads(blob_as_json_string.content)

# in addition to the body text, the metadata is also stored within the individual json files
print("Keys within data:", ', '.join(data.keys()))

Para los fines de este ejemplo, nos interesa el body_text, que almacena los datos de texto como se muestra a continuación:

"body_text": [                      # list of paragraphs in full body
    {
        "text": <str>,
        "cite_spans": [             # list of character indices of inline citations
                                    # e.g. citation "[7]" occurs at positions 151-154 in "text"
                                    #      linked to bibliography entry BIBREF3
            {
                "start": 151,
                "end": 154,
                "text": "[7]",
                "ref_id": "BIBREF3"
            },
            ...
        ],
        "ref_spans": <list of dicts similar to cite_spans>,     # e.g. inline reference to "Table 1"
        "section": "Abstract"
    },
    ...
]

El esquema JSON completo está disponible aquí.

from nltk.tokenize import sent_tokenize

# the text itself lives under 'body_text'
text = data['body_text']

# many NLP tasks play nicely with a list of sentences
sentences = []
for paragraph in text:
    sentences.extend(sent_tokenize(paragraph['text']))

print("An example sentence:", sentences[0])

Análisis de PDF frente a XML de PMC

En el ejemplo anterior, hemos visto un caso con has_pdf_parse == True. En ese caso, la ruta de acceso del archivo de blob tenía el formato:

'<full_text_file>/pdf_json/<sha>.json'

Alternativamente, para casos con has_pmc_xml_parse == True utilice el siguiente formato:

'<full_text_file>/pmc_json/<pmcid>.xml.json'

Por ejemplo:

# choose a random example with pmc parse available
metadata_with_pmc_parse = metadata[metadata['has_pmc_xml_parse']]
example_entry = metadata_with_pmc_parse.iloc[42]

# construct path to blob containing full text
blob_name = '{0}/pmc_json/{1}.xml.json'.format(example_entry['full_text_file'], example_entry['pmcid'])  # note the repetition in the path
print("Full text blob for this entry:")
print(blob_name)

blob_as_json_string = blob_service.get_blob_to_text(container_name=container_name, blob_name=blob_name)
data = json.loads(blob_as_json_string.content)

# the text itself lives under 'body_text'
text = data['body_text']

# many NLP tasks play nicely with a list of sentences
sentences = []
for paragraph in text:
    sentences.extend(sent_tokenize(paragraph['text']))

print("An example sentence:", sentences[0])
Full text blob for this entry:
custom_license/pmc_json/PMC546170.xml.json
An example sentence: Double-stranded small interfering RNA (siRNA) molecules have drawn much attention since it was unambiguously shown that they mediate potent gene knock-down in a variety of mammalian cells (1).

Recorrer en iteración los blobs directamente

En los ejemplos anteriores, se usa el archivo metadata.csv para navegar por los datos, construir la ruta de acceso del archivo de blob y leer datos del blob. Una alternativa es recorrer en iteración los propios blobs.

# get and sort list of available blobs
blobs = blob_service.list_blobs(container_name)
sorted_blobs = sorted(list(blobs), key=lambda e: e.name, reverse=True)

Ahora podemos recorrer en iteración los blobs directamente. Por ejemplo, vamos a contar el número de archivos JSON disponibles.

# we can now iterate directly though the blobs
count = 0
for blob in sorted_blobs:
    if blob.name[-5:] == ".json":
        count += 1
print("There are {} many json files".format(count))
There are 59784 many json files

Apéndice

Problemas de calidad de los datos

Se trata de un conjunto de datos grande que, por motivos obvios, se ha recopilado con bastante prisa. Estos son algunos problemas de calidad de los datos que hemos observado.

Varios shas

Observamos que en algunos casos hay varios shas para una entrada determinada.

metadata_multiple_shas = metadata[metadata['sha'].str.len() > 40]

print("There are {} many entries with multiple shas".format(len(metadata_multiple_shas)))

metadata_multiple_shas.head(3)
There are 1999 many entries with multiple shas

Diseño del contenedor

Aquí se usa una expresión regular sencilla para explorar la estructura de archivos del contenedor en caso de que se actualice en el futuro.

container_name = "covid19temp"
blobs = blob_service.list_blobs(container_name)
sorted_blobs = sorted(list(blobs), key=lambda e: e.name, reverse=True)
import re
dirs = {}

pattern = '([\w]+)\/([\w]+)\/([\w.]+).json'
for blob in sorted_blobs:
    
    m = re.match(pattern, blob.name)
    
    if m:
        dir_ = m[1] + '/' + m[2]
        
        if dir_ in dirs:
            dirs[dir_] += 1
        else:
            dirs[dir_] = 1
        
dirs

Pasos siguientes

Consulte el resto de los conjuntos de datos en el catálogo de Open Datasets.