COVID-19 Open Research Dataset
Datová sada metadat a úplného znění pro vědecké články související s COVID-19 a koronavirem, která je optimalizovaná pro strojovou čitelnost a zpřístupněná globální komunitě výzkumných pracovníků
V reakci na epidemii COVID-19 spolupracuje Allen Institute for AI s předními výzkumnými skupinami, které připraví a distribuují otevřenou datovou sadu pro výzkum COVID-19 (CORD-19). Tato datová sada je bezplatný zdroj více než 47 000 vědeckých článků, včetně více než 36 000 s úplným textem, o COVID-19 a rodině virů pro použití globální výzkumnou komunitou.
Tato datová sada mobilizuje výzkumné pracovníky, aby použili nedávné pokroky v zpracování přirozeného jazyka, aby vygenerovali nové poznatky o podpoře boje proti této infekční nemoci.
Tento korpus se může aktualizovat novými výzkumy publikovanými ve vědeckých pracích a archivačních službách, jako jsou bioRxiv, medRxiv a další.
Poznámka:
Microsoft poskytuje datové sady Azure Open Datasets na bázi "tak, jak je". Společnost Microsoft neposkytuje žádné záruky, výslovné ani předpokládané záruky ani podmínky týkající se vašeho používání datových sad. V rozsahu povoleném vaším místním zákonem společnost Microsoft odmítá veškerou odpovědnost za případné škody nebo ztráty, včetně přímých, následných, zvláštních, nepřímých, náhodných nebo represivních, vyplývajících z vašeho používání datových sad.
Na tuto datovou sadu se vztahují původní podmínky, které Microsoft přijal se zdrojovými daty. Datová sada může obsahovat data pocházející z Microsoftu.
Licenční podmínky
Tuto datovou sadu zpřístupní Allen Institute of AI a Sémantic Scholar. Přístupem k obsahu poskytovanému v datové sadě CORD-19, jeho stažením nebo jiným použitím vyjadřujete svůj souhlas s licencí související s použitím této datové sady. Konkrétní licenční informace pro jednotlivé články v této datové sadě jsou k dispozici v souboru metadat. Další informace o licencování jsou k dispozici na webových stránkách PMC, na webových stránkách medRxiv a na webových stránkách bioRxiv.
Objem a uchovávání
Tato datová sada je uložená ve formátu JSON a nejnovější vydaná verze obsahuje více než 36 000 článků s úplným textem. Každá publikace je reprezentovaná jako jeden objekt JSON. Zobrazte schéma.
Umístění úložiště
Tato datová sada se uchovává v oblasti Azure Východní USA. Pro spřažení se doporučuje vyhledání výpočetních prostředků v oblasti USA – východ.
Citace
Pokud do publikace nebo redistribuce zahrnete data CORD-19, citujte datovou sadu následujícím způsobem:
V bibliografii:
COVID-19 Open Research Dataset (CORD-19). 2020 Verze RRRR-MM-DD. Načteno z webu COVID-19 Open Research Dataset (CORD-19). Přístup ze dne DD. MM. YYYY doi:10.5281/zenodo.3715505
V textu: (CORD-19, 2020)
Kontakt
Pokud máte k této datové sadě nějaké dotazy, obraťte se na partnerships@allenai.org.
Přístup k datům
Azure Notebooks
Datová sada CORD-19
CORD-19 je kolekce více než 50 000 vědeckých článků - včetně více než 40 000 s úplným textem - o COVID-19, SARS-CoV-2 a souvisejících koronových virů. Tato datová sada byla volně zpřístupněna s cílem pomoci výzkumných komunitám bojovat proti epidemii COVID-19.
Cílem tohoto poznámkového bloku je dvounásobný:
- Demonstrujte, jak získat přístup k datové sadě CORD-19 v Azure: Připojujeme se k účtu úložiště objektů blob v Azure, který je uložený v datové sadě CORD-19.
- Projděte si strukturu datové sady: Články v datové sadě se ukládají jako soubory JSON. Nabízíme příklady ukazující:
- Jak najít články (navigace v kontejneru)
- Jak číst články (navigace ve schématu JSON)
Závislosti: Tento poznámkový blok vyžaduje následující knihovny:
- Azure Storage (například
pip install azure-storage-blob
) - NLTK (dokumentace)
- Pandas (například
pip install pandas
)
Získání dat CORD-19 z Azure
Data CORD-19 se tady nahrála jako datová sada Azure Open Dataset. Vytvoříme službu blob propojenou s touto otevřenou datovou sadou 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,
)
Tuto službu objektů blob můžeme použít jako popisovač dat. Můžeme procházet datovou sadu, která využívá BlockBlobService
rozhraní API. Další podrobnosti najdete tady:
Data CORD-19 jsou uložená v kontejneru covid19temp
. Toto je struktura souborů v rámci kontejneru společně s ukázkovým souborem.
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ždý .json soubor odpovídá jednotlivému článku v datové sadě. Tady je název, autoři, abstrakce a (kde jsou k dispozici) uložená úplná textová data.
Použití metadata.csv
Datová sada CORD-19 obsahuje metadata.csv
jeden soubor, který zaznamenává základní informace o všech dokumentech dostupných v datové sadě CORD-19. To je dobré místo, kde začít zkoumat!
# 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 je na první pohled hodně, takže pojďme použít trochu leštější.
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
Příklad: Čtení celého textu
metadata.csv
neobsahuje samotný fulltext. Podívejme se na příklad toho, jak to přečíst. Vyhledejte a rozbalte celý text JSON a převeďte ho na seznam vět.
# 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)
Teď můžeme přečíst obsah JSON přidružený k tomuto objektu blob následujícím způsobem.
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()))
Pro účely tohoto příkladu nás zajímá body_text
, který ukládá textová data následujícím způsobem:
"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"
},
...
]
Úplné schéma JSON je k dispozici tady.
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 vs PMC XML Parse
V předchozím příkladu jsme se podívali na případ s has_pdf_parse == True
. V takovém případě byla cesta k souboru objektu blob ve formuláři:
'<full_text_file>/pdf_json/<sha>.json'
Případně pro případy s has_pmc_xml_parse == True
použitím následujícího formátu:
'<full_text_file>/pmc_json/<pmcid>.xml.json'
Příklad:
# 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).
Přímé iterace přes objekty blob
V předchozích příkladech jsme použili metadata.csv
soubor k procházení dat, vytvoření cesty k souboru objektu blob a čtení dat z objektu blob. Alternativou je iterace samotných objektů 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)
Teď můžeme iterovat objekty blob přímo. Pojďme například spočítat počet souborů JSON, které jsou k dispozici.
# 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
Problémy s kvalitou dat
Jedná se o velkou datovou sadu, která se zjevných důvodů dala dohromady spíše zatěžovat! Tady jsou některé problémy s kvalitou dat, které jsme zaznamenali.
Více stínů
Vidíme, že v některých případech existuje několik stínů pro danou položku.
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
Rozložení kontejneru
Tady použijeme jednoduchý regulární výraz k prozkoumání struktury souborů kontejneru v případě, že se to v budoucnu aktualizuje.
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
Další kroky
Prohlédněte si zbývající datové sady v katalogu Open Datasets.