COVID-19 Open Research Dataset

Gegevensset met volledige tekst en metagegevens van wetenschappelijke artikelen over COVID-19 en het coronavirus die zijn geoptimaliseerd om te kunnen worden gelezen door computers en die beschikbaar zijn voor gebruik door de wereldwijde onderzoekscommunity.

In reactie op de COVID-19-pandemie heeft het Allen Institute for AI samengewerkt met toonaangevende onderzoeksgroepen om de COVID-19 Open Research Dataset (CORD-19) voor te bereiden en te distribueren. Deze gegevensset is een gratis resource van meer dan 47.000 geleerde artikelen, waaronder meer dan 36.000 met volledige tekst, over COVID-19 en de coronavirusfamilie van virussen voor gebruik door de wereldwijde onderzoekscommunity.

Deze gegevensset mobiliseert onderzoekers om recente ontwikkelingen in natuurlijke taalverwerking toe te passen om nieuwe inzichten te genereren ter ondersteuning van de strijd tegen deze infectieziekte.

Nieuw onderzoek wordt gepubliceerd in door vakgenoten beoordeelde publicaties en archiefservices, zoals bioRxiv, medRxiv en meer.

Notitie

Microsoft biedt Azure Open Datasets op basis van 'zoals is'. Microsoft geeft geen garanties, uitdrukkelijk of impliciet, garanties of voorwaarden met betrekking tot uw gebruik van de gegevenssets. Voor zover toegestaan volgens uw lokale wetgeving, wijst Microsoft alle aansprakelijkheid af voor eventuele schade of verliezen, waaronder directe, gevolgschade, speciale, indirecte, incidentele of strafbare gegevenssets, die het gevolg zijn van uw gebruik van de gegevenssets.

Deze gegevensset wordt geleverd onder de oorspronkelijke voorwaarden dat Microsoft de brongegevens heeft ontvangen. De gegevensset kan gegevens bevatten die afkomstig zijn van Microsoft.

Licentievoorwaarden

Deze gegevensset wordt beschikbaar gesteld door het Allen Institute of AI en Semantic Scholar. Als u inhoud van de CORD-19-gegevensset opent, downloadt of anderszins gebruikt, gaat u akkoord met de gegevenssetlicentie voor het gebruik van deze gegevensset. Specifieke licentie-informatie voor afzonderlijke artikelen in de gegevensset is beschikbaar in het metagegevensbestand. Meer licentieinformatie is beschikbaar op de PMC-website, medRxiv-website en bioRxiv-website.

Volume en retentie

Deze gegevensset wordt opgeslagen in JSON-indeling en de nieuwste release bevat meer dan 36.000 artikelen met volledige tekst. Elk artikel wordt vertegenwoordigd door één JSON-object. Bekijk het schema.

Opslaglocatie

Deze gegevensset wordt opgeslagen in de Azure-regio US - oost. Het vinden van rekenresources in VS - oost wordt aanbevolen voor affiniteit.

Gegevensvermelding

Als u CORD-19-gegevens in een publicatie of herdistributie ophaalt, moet u de gegevensset als volgt citeren:

In bibliografie:

COVID-19 Open Research Dataset (CORD-19). 2020. Versie DD-MM-JJJJ. Opgehaald van COVID-19 Open Research Dataset (CORD-19). Geopend DD-MM-JJJJ. doi:10.5281/zenodo.3715505

In tekst: (CORD-19, 2020)

Contact

Voor vragen over deze gegevensset kunt contact opnemen met partnerships@allenai.org.

Toegang tot gegevens

Azure Notebooks

De CORD-19-gegevensset

CORD-19 is een verzameling van meer dan 50.000 geleerde artikelen - waaronder meer dan 40.000 met volledige tekst - over COVID-19, SARS-CoV-2 en gerelateerde coronavirussen. Deze gegevensset is vrij beschikbaar gesteld met het doel onderzoekgemeenschappen te helpen de COVID-19-pandemie te bestrijden.

Het doel van dit notitieblok is tweevoud:

  1. Demonstreert hoe u toegang hebt tot de CORD-19-gegevensset in Azure: We maken verbinding met het Azure Blob Storage-account dat de CORD-19-gegevensset bevat.
  2. Doorloop de structuur van de gegevensset: artikelen in de gegevensset worden opgeslagen als json-bestanden. We bieden voorbeelden die het volgende laten zien:
  • De artikelen zoeken (door de container navigeren)
  • De artikelen lezen (door het json-schema navigeren)

Afhankelijkheden: voor dit notebook zijn de volgende bibliotheken vereist:

  • Azure Storage (bijvoorbeeld pip install azure-storage)
  • NLTK (docs)
  • Pandas (bijvoorbeeld pip install pandas)

De CORD-19-gegevens ophalen uit Azure

De CORD-19-gegevens zijn hier geüpload als een Azure Open Dataset. We maken een blobservice die is gekoppeld aan deze open CORD-19-gegevensset.

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,
)

We kunnen deze blobservice gebruiken als ingang voor de gegevens. We kunnen navigeren in de gegevensset die gebruikmaakt van de BlockBlobService API's. Zie hier voor meer informatie:

De CORD-19-gegevens worden opgeslagen in de covid19temp container. Dit is de bestandsstructuur in de container samen met een voorbeeldbestand.

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
        ...

Elk JSON-bestand komt overeen met een afzonderlijk artikel in de gegevensset. Hier worden de titel, auteurs, abstract en (indien beschikbaar) de volledige tekstgegevens opgeslagen.

Metadata.csv gebruiken

De gegevensset CORD-19 wordt geleverd met metadata.csv één bestand waarin basisinformatie wordt vastgelegd over alle documenten die beschikbaar zijn in de CORD-19-gegevensset. Dit is een goede plek om te beginnen met verkennen!

# 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)

Dat is veel om op het eerste gezicht in te nemen, dus laten we een beetje polijsten.

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

Voorbeeld: Volledige tekst lezen

metadata.csv bevat niet de volledige tekst zelf. Laten we een voorbeeld bekijken van hoe u dat kunt lezen. Zoek de json in de volledige tekst en pak deze uit en converteer deze naar een lijst met zinnen.

# 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)

De json-inhoud die aan deze blob is gekoppeld, kan nu als volgt worden gelezen.

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()))

Voor het doel van dit voorbeeld zijn we geïnteresseerd in het body_text, waarin de tekstgegevens als volgt worden opgeslagen:

"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"
    },
    ...
]

Het volledige json-schema is hier beschikbaar.

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])

PDF versus PMC XML Parseren

In het bovenstaande voorbeeld hebben we gekeken naar een case met has_pdf_parse == True. In dat geval was het pad naar het blobbestand van het formulier:

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

Voor gevallen met has_pmc_xml_parse == True de volgende indeling kunt u ook de volgende indeling gebruiken:

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

Bijvoorbeeld:

# 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).

Rechtstreeks door blobs doorlopen

In de bovenstaande voorbeelden hebben we het metadata.csv bestand gebruikt om door de gegevens te navigeren, het pad naar het blobbestand samen te stellen en gegevens uit de blob te lezen. Een alternatief is het herhalen van de blobs zelf.

# 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)

Nu kunnen we de blobs rechtstreeks herhalen. Laten we bijvoorbeeld het aantal JSON-bestanden tellen dat beschikbaar is.

# 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

Bijlage

Problemen met gegevenskwaliteit

Dit is een grote gegevensset die, om voor de hand liggende redenen, nogal haastig is samengesteld! Hier volgen enkele problemen met de kwaliteit van gegevens.

Meerdere shas

In sommige gevallen zijn er meerdere shas voor een bepaalde vermelding.

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

Indeling van de container

Hier gebruiken we een eenvoudige regex om de bestandsstructuur van de container te verkennen voor het geval dit in de toekomst wordt bijgewerkt.

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

Volgende stappen

Bekijk de rest van de gegevenssets in de catalogus Open Datasets.