Set di dati di ricerca aperto COVID-19

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 da COVID-19, l'Allen Institute for AI ha collaborato con i principali gruppi di ricerca per preparare e distribuire il set di dati open research COVID-19 (CORD-19). Questo set di dati è una risorsa gratuita di oltre 47.000 articoli accademici, tra cui oltre 36.000 con testo completo, circa COVID-19 e la famiglia di virus da utilizzare dalla comunità di ricerca globale.

Questo set di dati mobilita i ricercatori per applicare recenti progressi nell'elaborazione del linguaggio naturale per generare nuove informazioni a sostegno 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 garantisce, esplicitamente o implicitamente, garanzie o condizioni in relazione all'uso dei set di dati. Nella misura consentita dalla legge locale, Microsoft dichiara tutte le responsabilità per eventuali danni o perdite, tra cui diretto, consequenziale, speciale, indiretto, incidentale o incidentale, risultante 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 è reso disponibile dall'Istituto allen di intelligenza artificiale e dallo studioso semantico. 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 sul sito Web PMC, sul sito Web medRxiv e sul 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 una ridistribuzione, cita il set di dati come indicato di seguito:

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 - inclusi oltre 40.000 con testo completo - circa COVID-19, SARS-CoV-2 e virus corona correlati. Questo set di dati è stato reso disponibile gratuitamente con l'obiettivo di aiutare le comunità di ricerca a combattere la pandemia di COVID-19.

L'obiettivo di questo notebook è duplice:

  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. Procedura dettagliata per 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 open 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 sui dati. È possibile esplorare il set di dati che usa le BlockBlobService 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 con estensione json corrisponde a un singolo articolo nel set di dati. Qui vengono archiviati il titolo, gli autori, l'astrazione e (se disponibile) i dati full-text.

Uso di metadata.csv

Il set di dati CORD-19 include metadata.csv un singolo file che registra informazioni di base su tutti i documenti disponibili nel set di dati CORD-19. Questo è un buon posto 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)

Questo è molto da prendere a prima vista, quindi applichiamo un po 'di lucidatura.

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: Lettura full-text

metadata.csv non contiene il full-text stesso. Verrà ora illustrato un esempio di come leggerlo. 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 body_text, che archivia i dati di testo come indicato di seguito:

"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 PDF e PMC XML

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

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

In alternativa, per i casi con has_pmc_xml_parse == True 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 metadata.csv file per esplorare i dati, costruire il percorso del file BLOB e 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. Si supponga, ad esempio, di contare i file JSON numerici 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 di qualità dei dati

Si tratta di un set di dati di grandi dimensioni che, per ovvi motivi, è stato messo insieme piuttosto con fretta! Ecco alcuni problemi di qualità dei dati osservati.

Ombreggiature multiple

Si noti che in alcuni casi sono presenti più ombreggiature per una determinata voce.

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 usata una semplice espressione regolare per esplorare la struttura di file del contenitore nel caso in cui venga 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 il resto dei set di dati nel catalogo Open Datasets.