COVID-19 Open Research Dataset

Set di dati di dati con testo completo e metadati relativo ad articoli accademici correlati a COVID-19 e coronavirus ottimizzati per la leggibilità da parte di computer e resi disponibili per l'uso da parte della community di ricerca globale.

In risposta alla pandemia COVID-19, l'Istituto Allen per l'intelligenza artificiale ha collaborato con i principali gruppi di ricerca per preparare e distribuire il set di dati COVID-19 Open Research (CORD-19). Questo set di dati è una risorsa gratuita di oltre 47.000 articoli accademici, tra cui oltre 36.000 con testo completo, su COVID-19 e sulla famiglia di virus coronavirus per l'uso da parte della community di ricerca globale.

Questo set di dati mobilita i ricercatori per applicare i recenti progressi nell'elaborazione del linguaggio naturale per generare nuove informazioni a supporto della lotta contro questa malattia infettiva.

È possibile che questa raccolta di articoli venga aggiornata quando nuove ricerche vengono pubblicate in pubblicazioni sottoposte a revisione paritaria e in servizi di archiviazione come bioRxiv, medRxiv e altri ancora.

Nota

Microsoft fornisce set di dati aperti di Azure su base "così come è". Microsoft non fa alcuna garanzia, espressa o implicita, garanzie o condizioni in relazione all'uso dei set di dati. Nella misura consentita dalla legge locale, Microsoft rilasci tutte le responsabilità per eventuali danni o perdite, inclusi diretti, consequenziali, speciali, indiretti, incidentali o punitivi, derivanti dall'uso dei set di dati.

Questo set di dati viene fornito in conformità con le condizioni originali in base alle quali Microsoft ha ricevuto i dati di origine. Il set di dati potrebbe includere dati provenienti da Microsoft.

Condizioni di licenza

Questo set di dati viene reso disponibile dall'Istituto di intelligenza artificiale e semanticadi Allen. Se esegui l'accesso, scarichi o usi in altro modo i contenuti forniti nel set di dati CORD-19, accetti la licenza per set di dati correlata all'uso di questo set di dati. Le informazioni specifiche sulle licenze per i singoli articoli nel set di dati sono disponibili nel file di metadati. Altre informazioni sulle licenze sono disponibili nel sito Web PMC,nel sito Web medRxive nel sito Web bioRxiv.

Volume e conservazione

Questo set di dati viene archiviato in formato JSON e la versione più recente contiene oltre 36.000 articoli full-text. Ogni documento è rappresentato come singolo oggetto JSON. Visualizzare lo schema.

Posizione di archiviazione

Questo set di dati è archiviato nell'area Stati Uniti orientali di Azure. L'individuazione delle risorse di calcolo negli Stati Uniti orientali è consigliata per l'affinità.

Citazione

Quando si includono dati CORD-19 in una pubblicazione o in una ridistribuzione, cita il set di dati come segue:

Nella bibliografia:

CORD-19 (COVID-19 Open Research Dataset). 2020. Versione AAAA-MM-GG. Recuperato da COVID-19 Open Research Dataset (CORD-19). Accesso: AAAA-MM-GG. doi:10.5281/zenodo.3715505

Nel testo: (CORD-19, 2020)

Contatto

Se hai domande su questo set di dati, contatta partnerships@allenai.org.

Accesso ai dati

Azure Notebooks

Set di dati CORD-19

CORD-19 è una raccolta di oltre 50.000 articoli accademici, tra cui oltre 40.000 con testo completo, su COVID-19, SARS-CoV-2 e sui virus della corona correlati. Questo set di dati è stato reso disponibile gratuitamente con l'obiettivo di aiutare le comunità di ricerca a contrastare la pandemia COVID-19.

L'obiettivo di questo notebook è doppio:

  1. Illustrare come accedere al set di dati CORD-19 in Azure: ci si connette all'account di archiviazione BLOB di Azure che ospita il set di dati CORD-19.
  2. Illustrare la struttura del set di dati: gli articoli nel set di dati vengono archiviati come file JSON. Vengono forniti esempi che illustrano:
  • Come trovare gli articoli (esplorazione del contenitore)
  • Come leggere gli articoli (esplorazione dello schema JSON)

Dipendenze: questo notebook richiede le librerie seguenti:

  • Archiviazione di Azure (ad esempio, pip install azure-storage )
  • NLTK (docs)
  • Pandas (ad esempio, pip install pandas )

Recupero dei dati CORD-19 da Azure

I dati CORD-19 sono stati caricati come set di dati aperti di Azure qui. Viene creato un servizio BLOB collegato a questo set di dati aperto CORD-19.

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

È possibile usare questo servizio BLOB come handle per i dati. È possibile esplorare il set di dati che usa BlockBlobService le API. Per altri dettagli, vedere qui:

I dati CORD-19 vengono archiviati nel covid19temp contenitore. Si tratta della struttura di file all'interno del contenitore insieme a un file di esempio.

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

Ogni file JSON corrisponde a un singolo articolo nel set di dati. Qui vengono archiviati il titolo, gli autori, astratti e (se disponibili) i dati full-text.

Uso di metadata.csv

Il set di dati CORD-19 include un singolo file che registra informazioni di base su tutti i documenti disponibili nel set di dati metadata.csv CORD-19. Questo è un buon punto per iniziare a esplorare.

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

Questa operazione è molto importante a prima vista, quindi si applica un po' di smalto.

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

Esempio: Leggere il testo completo

metadata.csv non contiene il full-text stesso. Di seguito è riportato un esempio di come leggere questa operazione. Individuare e decomprimere il codice JSON full-text e convertirlo in un elenco di frasi.

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

È ora possibile leggere il contenuto JSON associato a questo BLOB come indicato di seguito.

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

Ai fini di questo esempio, si è interessati a , che body_text archivia i dati di testo nel modo seguente:

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

Lo schema JSON completo è disponibile qui.

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

Analisi XML pdf e PMC

Nell'esempio precedente è stato esaminato un caso con has_pdf_parse == True . In tal caso, il percorso del file BLOB è nel formato seguente:

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

In alternativa, per i casi con has_pmc_xml_parse == True usare il formato seguente:

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

Ad esempio:

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

Scorrere direttamente i BLOB

Negli esempi precedenti è stato usato il file per esplorare i dati, costruire il percorso del file BLOB e metadata.csv leggere i dati dal BLOB. Un'alternativa è l'iterazione dei BLOB stessi.

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

È ora possibile scorrere direttamente i BLOB. Ad esempio, si conta il numero di file JSON disponibili.

# 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

Appendice

Problemi relativi alla qualità dei dati

Si tratta di un set di dati di grandi dimensioni che, per ovvi motivi, è stato creato in modo piuttosto ergoto. Di seguito sono riportati alcuni problemi di qualità dei dati osservati.

Più sha

Si osserva che in alcuni casi sono presenti più sha per una voce specifica.

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

Layout del contenitore

In questo caso viene utilizzata una semplice espressione regolare per esplorare la struttura di file del contenitore nel caso in cui questa operazione verrà aggiornata in 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

Passaggi successivi

Visualizzare gli altri set di dati nel catalogo Apri set di dati.