COVID-19 Open Research Dataset

Ein Volltext- und Metadaten-Dataset von wissenschaftlichen Artikeln im Zusammenhang mit COVID-19 und dem Corona-Virus, die für Maschinenlesbarkeit optimiert und Forschern auf der ganzen Welt zur Nutzung zur Verfügung gestellt wurden.

Als Reaktion auf die COVID-19-Pandemie ist das Allen Institute for AI eine Partnerschaft mit führenden Forschungsgruppen eingegangen, um das COVID-19 Open Research Dataset (CORD-19) vorzubereiten und zu verteilen. Dieses Dataset ist eine kostenlose Ressource mit mehr als 47.000 wissenschaftlichen Artikeln, darunter über 36.000 Artikel mit Volltext, zu COVID-19 und die Coronaviren-Familie, die von Forschern auf der ganzen Welt genutzt werden kann.

Dieses Dataset animiert Forscher dazu, aktuelle Fortschritte im Bereich der Verarbeitung natürlicher Sprache anzuwenden und so neue Erkenntnisse zu generieren, die dem Kampf gegen diese Infektionskrankheit dienen.

Der Korpus wird aktualisiert, wenn neue Forschungserkenntnisse in Artikeln mit Peer-Review und Archiven wie bioRxiv oder medRxiv veröffentlicht werden.

Hinweis

Microsoft stellt Datasets der Plattform Azure Open Datasets auf einer „As is“-Basis (d. h. ohne Mängelgewähr) zur Verfügung. Microsoft übernimmt weder ausdrücklich noch stillschweigend die Gewährleistung für Ihre Nutzung der Datasets und sichert keinerlei Garantien oder Bedingungen zu. Soweit nach örtlich anwendbarem Recht zulässig, lehnt Microsoft jegliche Haftung für Schäden oder Verluste ab. Dies schließt direkte, indirekte, besondere oder zufällige Schäden oder Verluste sowie Folge- und Strafschäden und damit verbundene Verluste ein, die sich aus Ihrer Nutzung der Datasets ergeben.

Für die Bereitstellung dieses Datasets gelten die ursprünglichen Nutzungsbedingungen, unter denen Microsoft die Quelldaten bezogen hat. Das Dataset kann Daten von Microsoft enthalten.

Lizenzbedingungen

Dieses Dataset wird vom Allen Institute of AI und Semantic Scholar zur Verfügung gestellt. Wenn Sie auf einen beliebigen im CORD-19-Dataset bereitgestellten Inhalt zugreifen, ihn herunterladen oder anderweitig nutzen, stimmen Sie der Dataset-Lizenz im Zusammenhang mit der Nutzung dieses Datasets zu. Spezifische Lizenzinformationen zu einzelnen Artikeln im Dataset stehen in der Metadatendatei zur Verfügung. Weitere Lizenzinformationen stehen auf der PMC-Website, der medRxiv-Website und der bioRxiv-Website zur Verfügung.

Volume und Aufbewahrung

Dieses Dataset wird im JSON-Format gespeichert, und die neueste Version enthält über 36.000 Volltextartikel. Jedes Paper ist ein einzelnes JSON-Objekt. Zeigen Sie das Schema an.

Speicherort

Dieses Dataset wird in der Azure-Region „USA, Osten“ gespeichert. Aus Gründen der Affinität wird die Anordnung von Computeressourcen in der Region „USA, Osten“ empfohlen.

Quellenangaben

Wenn Sie CORD-19-Daten in eine Veröffentlichung oder Weiterverbreitung einbeziehen, geben Sie das Dataset folgendermaßen an:

Im Literaturverzeichnis:

COVID-19 Open Research Dataset (CORD-19). 2020. Version JJJJ-MM-TT Quelle: COVID-19 Open Research Dataset (CORD-19). Zugriff: TT-MM-JJJJ. doi:10.5281/zenodo.3715505

In Text: (CORD-19, 2020)

Contact

Falls Sie Fragen zu diesem Dataset haben, wenden Sie sich an partnerships@allenai.org.

Datenzugriff

Azure Notebooks

Das CORD-19-Dataset

CORD-19 ist eine Sammlung von mehr als 50.000 wissenschaftlichen Artikeln – darunter mehr als 40.000 mit Volltext – zu COVID-19, SARS-CoV-2 und verwandten Coronaviren. Dieses Dataset wird kostenlos zur Verfügung gestellt, um Forscher bei der Bewältigung der COVID-19-Pandemie zu unterstützen.

Mit diesem Notebook sollen zwei Ziele erreicht werden:

  1. Veranschaulichung des Zugriffs auf das CORD-19-Dataset in Azure: Wir stellen eine Verbindung mit dem Azure Blob Storage-Konto her, in dem sich das CORD-19-Dataset befindet.
  2. Exemplarische Schritte durch die Struktur des Datasets: Artikel im Dataset werden als JSON-Dateien gespeichert. Wir stellen Beispiele bereit, die Folgendes zeigen:
  • Suchen der Artikel (Navigieren im Container)
  • Lesen der Artikel (Navigieren im JSON-Schema)

Abhängigkeiten: Für dieses Notebook sind die folgenden Bibliotheken erforderlich:

  • Azure Storage (zum Beispiel pip install azure-storage)
  • NLTK (Dokumentation)
  • Pandas (zum Beispiel pip install pandas)

Abrufen der CORD-19-Daten aus Azure

Die CORD-19-Daten wurden hier als Azure Open Dataset hochgeladen. Wir erstellen einen Blob-Dienst, der mit dem offenen Dataset CORD-19 verknüpft ist.

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

Wir können diesen Blob-Dienst als Handle für die Daten verwenden. Wir können durch das Dataset navigieren und dabei die BlockBlobService-APIs verwenden. Ausführlichere Informationen finden Sie unter Folgendem:

Die CORD-19-Daten werden im Container covid19temp gespeichert. Dies ist die Dateistruktur innerhalb des Containers zusammen mit einer Beispieldatei.

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

Jede JSON-Datei entspricht einem einzelnen Artikel im Dataset. Hier werden Titel, Autoren, abstrakte Daten und (sofern verfügbar) die Volltextdaten gespeichert.

Verwenden von metadata.csv

Das CORD-19-Dataset enthält metadata.csv – eine einzelne Datei, die grundlegende Informationen zu allen Dokumenten aufzeichnet, die im CORD-19-Dataset verfügbar sind. Dies ist ein guter Ausgangspunkt für Erkundungen!

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

Auf den ersten Blick gibt es viel zu begreifen, daher wenden wir ein wenig Feinschliff an.

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

Beispiel: Volltext lesen

metadata.csv enthält nicht den Volltext selbst. Sehen wir uns ein Beispiel an, wie das gelesen wird. Suchen Sie die Volltext-JSON-Datei, entpacken Sie sie, und konvertieren Sie sie in eine Liste von Sätzen.

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

Wir können nun den JSON-Inhalt, der diesem Blob zugeordnet ist, wie folgt lesen.

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

Im Rahmen dieses Beispiels sind wir an body_text interessiert, wo die Textdaten wie folgt gespeichert sind:

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

Das vollständige JSON-Schema finden Sie hier.

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 Parse gegenüber PMC XML Parse

Im obigen Beispiel haben wir uns einen Fall mit has_pdf_parse == True angesehen. In dem Fall hatte der Blobdateipfad folgendes Format:

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

Verwenden Sie alternativ für Fälle mit has_pmc_xml_parse == True das folgende Format:

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

Beispiel:

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

Direktes Durchlaufen von Blobs

In den obigen Beispielen haben wir die Datei metadata.csv verwendet, um durch die Daten zu navigieren, den Blobdateipfad zu erstellen und Daten aus dem Blob zu lesen. Eine Alternative ist das Durchlaufen der Blobs selbst.

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

Nun können wir die Blobs direkt durchlaufen. Zählen wir beispielsweise die Anzahl der verfügbaren JSON-Dateien.

# 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

Anhang

Probleme mit der Datenqualität

Dies ist ein großes Dataset, das aus offensichtlichen Gründen eher hastig zusammengestellt wurde! Hier sind einige Datenqualitätsprobleme, die wir beobachtet haben.

Mehrere Shas

Wir beobachten, dass es in einigen Fällen mehrere Shas für einen bestimmten Eintrag gibt.

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 des Containers

Hier verwenden wir einen einfachen regulären Ausdruck, um die Dateistruktur des Containers zu untersuchen, falls dies in Zukunft aktualisiert wird.

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

Nächste Schritte

Machen Sie sich mit den restlichen Datasets im Open Datasets-Katalog vertraut.