Zestaw danych badań otwartych covid-19

Zestaw danych obejmujący pełne teksty i metadane artykułów naukowych dotyczących epidemii COVID-19 i koronawirusa, zoptymalizowany pod kątem odczytu przez maszyny i udostępniony do użytku przez globalną społeczność badaczy.

W odpowiedzi na pandemię COVID-19 Instytut Allen for AI współpracuje z wiodącymi grupami badawczymi w celu przygotowania i dystrybucji zestawu danych badań open research (CORD-19). Ten zestaw danych jest bezpłatnym zasobem ponad 47 000 artykułów naukowych, w tym ponad 36 000 z pełnym tekstem, o COVID-19 i rodziną wirusów do wykorzystania przez globalną społeczność badawczą.

Ten zestaw danych mobilizuje naukowców do stosowania ostatnich postępów w przetwarzaniu języka naturalnego, aby wygenerować nowe szczegółowe informacje na temat walki z tą chorobą zakaźną.

Zbiór może być aktualizowany w miarę publikowania nowych badań w dokumentach weryfikowanych przez inne osoby z branży i usługach archiwalnych, takich jak bioRxiv, medRxiv i inne.

Uwaga

Firma Microsoft udostępnia zestawy danych Platformy Azure open na zasadzie "tak, jak to jest". Firma Microsoft nie udziela żadnych gwarancji, wyraźnych lub domniemanych, gwarancji ani warunków w odniesieniu do korzystania z zestawów danych. W zakresie dozwolonym zgodnie z prawem lokalnym firma Microsoft nie ponosi odpowiedzialności za wszelkie szkody lub straty, w tym bezpośrednie, wtórne, specjalne, pośrednie, przypadkowe lub karne wynikające z korzystania z zestawów danych.

Zestaw danych jest udostępniany zgodnie z pierwotnymi warunkami, na jakich firma Microsoft otrzymała dane źródłowe. Zestaw danych może zawierać dane pozyskane z firmy Microsoft.

Postanowienia licencyjne

Ten zestaw danych jest udostępniany przez Allen Institute of AI i Semantic Scholar. Uzyskując dostęp do danych dostarczonych w zestawie danych CORD-19, pobierając go lub w inny sposób korzystając z niego, akceptujesz licencję zestawu danych związaną z użytkowaniem tego zestawu danych. Konkretne informacje o licencjonowaniu pojedynczych artykułów w zestawie danych są dostępne w pliku metadanych. Więcej informacji o licencjonowaniu jest dostępnych na stronie internetowej PMC, witrynie internetowej medRxiv i witrynie internetowej bioRxiv.

Wolumin i przechowywanie

Ten zestaw danych jest przechowywany w formacie JSON, a najnowsza wersja zawiera ponad 36 000 artykułów pełnotekstowych. Każdy dokument jest reprezentowany jako pojedynczy obiekt JSON. Wyświetl schemat.

Lokalizacja przechowywania

Ten zestaw danych jest przechowywany w regionie platformy Azure Wschodnie stany USA. Lokalizowanie zasobów obliczeniowych w regionie Wschodnie stany USA jest zalecane w przypadku koligacji.

Odsyłacz bibliograficzny

W przypadku dołączania danych CORD-19 do publikacji lub redystrybucji należy przytaczać zestaw danych w następujący sposób:

W bibliografii:

Otwarty zestaw danych badań dotyczących choroby COVID-19 (CORD-19). 2020. Wersja RRRR-MM-DD. Pobrano z otwartego zestawu danych badań dotyczących choroby COVID-19 (CORD-19). Uzyskano dostęp RRRR-MM-DD. doi:10.5281/zenodo.3715505

W tekście: (CORD-19, 2020)

Kontakt biznesowy

Jeśli masz pytania na temat tego zestawu danych, napisz na adres partnerships@allenai.org.

Dostęp do danych

Azure Notebooks

Zestaw danych CORD-19

CORD-19 to zbiór ponad 50 000 artykułów naukowych - w tym ponad 40 000 z pełnym tekstem - o COVID-19, SARS-CoV-2 i powiązanych wirusów koronowych. Ten zestaw danych został udostępniony swobodnie w celu pomocy społecznościom badawczym w walce z pandemią COVID-19.

Celem tego notesu jest dwa razy:

  1. Pokazano, jak uzyskać dostęp do zestawu danych CORD-19 na platformie Azure: nawiązujemy połączenie z kontem usługi Azure Blob Storage, które zawiera zestaw danych CORD-19.
  2. Przejdź do struktury zestawu danych: artykuły w zestawie danych są przechowywane jako pliki json. Udostępniamy przykłady pokazujące:
  • Jak znaleźć artykuły (nawigowanie po kontenerze)
  • Jak przeczytać artykuły (nawigowanie po schemacie json)

Zależności: ten notes wymaga następujących bibliotek:

  • Azure Storage (na przykład pip install azure-storage)
  • NLTK (docs)
  • Pandas (na przykład pip install pandas)

Pobieranie danych cord-19 z platformy Azure

Dane cord-19 zostały przekazane jako zestaw danych Azure Open Tutaj. Tworzymy usługę obiektów blob połączoną z otwartym zestawem danych 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,
)

Możemy użyć tej usługi obiektów blob jako dojścia do danych. Możemy nawigować po zestawie danych korzystającym z BlockBlobService interfejsów API. Aby uzyskać więcej informacji, zobacz tutaj:

Dane CORD-19 są przechowywane w kontenerze covid19temp . Jest to struktura plików w kontenerze wraz z przykładowym plikiem.

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

Każdy plik json odpowiada poszczególnym artykułom w zestawie danych. W tym miejscu są przechowywane tytuły, autorzy, abstrakcje i (tam, gdzie są dostępne) pełne dane tekstowe.

Korzystanie z pliku metadata.csv

Zestaw danych CORD-19 zawiera metadata.csv jeden plik, który rejestruje podstawowe informacje na temat wszystkich dokumentów dostępnych w zestawie danych CORD-19. To jest dobre miejsce, aby rozpocząć eksplorowanie!

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

To dużo do podjęcia na pierwszy rzut oka, więc zastosujmy trochę polski.

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

Przykład: Odczytywanie pełnego tekstu

metadata.csv nie zawiera samego pełnotekstu. Zobaczmy przykład tego, jak to przeczytać. Znajdź i rozpakuj pełny tekst json i przekonwertuj go na listę zdań.

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

Teraz możemy odczytać zawartość json skojarzona z tym obiektem blob w następujący sposób.

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

Na potrzeby tego przykładu body_textinteresuje nas element , który przechowuje dane tekstowe w następujący sposób:

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

Pełny schemat json jest dostępny tutaj.

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

Analizowanie plików PDF i XML PMC

W powyższym przykładzie przyjrzeliśmy się wielkości literom has_pdf_parse == True. W takim przypadku ścieżka pliku obiektu blob miała postać:

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

Alternatywnie w przypadku przypadków z has_pmc_xml_parse == True użyciem następującego formatu:

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

Na przykład:

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

Iterowanie bezpośrednio przez obiekty blob

W powyższych przykładach użyliśmy metadata.csv pliku do nawigowania po danych, konstruowania ścieżki pliku obiektu blob i odczytywania danych z obiektu blob. Alternatywą jest iteracja samych obiektów blob.

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

Teraz możemy iterować bezpośrednio przez obiekty blob. Na przykład policzmy dostępne pliki json liczbowe.

# 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

Dodatek

Problemy z jakością danych

Jest to duży zestaw danych, który z oczywistych powodów został ułożone dość pochopnie! Poniżej przedstawiono niektóre problemy z jakością danych, które zaobserwowaliśmy.

Wiele cieni

Zauważamy, że w niektórych przypadkach istnieje wiele cieni dla danego wpisu.

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

Układ kontenera

W tym miejscu użyjemy prostego wyrażenia regularnego, aby zbadać strukturę plików kontenera w przypadku, gdy zostanie to zaktualizowane w przyszłości.

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

Następne kroki

Wyświetl pozostałe zestawy danych w katalogu Open Datasets (Otwieranie zestawów danych).