COVID-19 Open Research Dataset

A COVID–19-cel és a koronavírussal összefüggő tudományos cikkek teljes szövege és azok metaadatainak adatkészletei optimalizálva vannak gépi olvasásra, és felhasználhatja őket a kutatói közösség világszerte.

A COVID-19 világjárványra válaszul az Allen Institute for AI a COVID-19 open research dataset (CORD-19) előkészítéséhez és terjesztéséhez vezető kutatócsoportokkal is együttműködött. Ez az adatkészlet több mint 47 000 tudományos cikk ingyenes forrása, köztük több mint 36 000 teljes szöveggel a COVID-19-ről és a víruscsaládról a globális kutatói közösség számára.

Ez az adatkészlet arra mozgósítja a kutatókat, hogy a természetes nyelvfeldolgozás terén a közelmúltban előrelépéseket alkalmazzanak, hogy új megállapításokat nyerjenek a fertőző betegség elleni küzdelem támogatásához.

A gyűjtemény frissülni fog új kutatási eredményekkel, amelyek olyan szakmailag lektorált kiadványokban és archívumokban jelennek meg, mint a bioRxiv, a medRxiv és mások.

Megjegyzés:

A Microsoft az Azure Open Datasets szolgáltatást "adott módon" biztosítja. A Microsoft nem vállal kifejezett vagy vélelmezett garanciát vagy feltételeket az adathalmazok Ön általi használatára vonatkozóan. A microsoft a helyi jogszabályok által megengedett mértékben kizár minden felelősséget az adathalmazok használatából eredő károkért vagy veszteségekért, beleértve a közvetlen, következményi, különleges, közvetett, incidenses vagy büntető jellegű károkat is.

Az adatkészletet a Microsoft forrásadataihoz tartozó eredeti feltételek szerint szolgáltatjuk. A készlet tartalmazhat Microsofttól származó adatokat.

Licencfeltételek

Ezt az adatkészletet az Allen Institute of AI és a Szemantic Scholar teszi elérhetővé. A CORD-19 adatkészlet bármely tartalmának elérésével, letöltésével vagy bármilyen típusú használatával Ön elfogadja az adatkészlet használatára vonatkozó Adatkészlet-licenc feltételeit. Az adatkészletben található egyes tanulmányokra vonatkozó speciális licencfeltételeket a metaadatok fájl tartalmazza. További licencelési információk érhetők el a PMC webhelyén, a medRxiv webhelyén és a bioRxiv webhelyén.

Kötet és megőrzés

Ez az adatkészlet JSON formátumban van tárolva, és a legújabb kiadás több mint 36 000 teljes szöveges cikket tartalmaz. Minden tanulmányra egyetlen JSON-objektummal hivatkozik. Tekintse meg a sémát.

Tárolási hely

Az adatkészlet tárolási helye a Kelet-USA Azure-régió. Az affinitáshoz az USA keleti régiójában található számítási erőforrások keresése ajánlott.

Idézés

Ha CORD-19-adatokat tartalmaz egy kiadványban vagy terjesztésben, az adathalmazt az alábbiak szerint idézheti:

Bibliográfiában:

COVID–19 Open Research Dataset (CORD–19). 2020. Verzió: ÉÉÉÉ-HH-NN. Letöltve innen: COVID–19 Open Research Dataset (CORD–19). Hozzáférés ideje: YYYY-MM-DD. doi:10.5281/zenodo.3715505

Szövegben: (CORD-19, 2020)

KAPCSOLATTARTÓ

Az ezzel az adatkészlettel kapcsolatos kérdéseket elküldheti az partnerships@allenai.org címre.

Az adatok elérése

Azure Notebooks

A CORD-19 adatkészlet

A CORD-19 több mint 50 000 tudományos cikk gyűjteménye – köztük több mint 40 000 teljes szöveggel – a COVID-19-ről, a SARS-CoV-2-ről és a kapcsolódó koronavírusokról. Ezt az adatkészletet szabadon elérhetővé tették azzal a céllal, hogy segítséget nyújtsunk a kutatóközösségeknek a COVID-19 világjárvány elleni küzdelemben.

A jegyzetfüzet célja kétirányú:

  1. Bemutatja, hogyan férhet hozzá a CORD-19 adatkészlethez az Azure-ban: Csatlakozunk a CORD-19 adatkészletet tároló Azure Blob Storage-fiókhoz.
  2. Az adathalmaz felépítése: Az adathalmazban lévő cikkek json-fájlokként vannak tárolva. Példákat mutatunk be:
  • A cikkek megkeresése (a tárolóra való navigálás)
  • A cikkek elolvasása (a json-séma navigálása)

Függőségek: Ehhez a jegyzetfüzethez a következő kódtárak szükségesek:

  • Azure Storage (például pip install azure-storage)
  • NLTK (dokumentumok)
  • Pandas (például pip install pandas)

A CORD-19-adatok lekérése az Azure-ból

A CORD-19-adatokat itt töltötték fel Azure Open Datasetként. Létrehozunk egy blobszolgáltatást, amely ehhez a CORD-19 nyitott adatkészlethez kapcsolódik.

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

Ezt a blobszolgáltatást használhatjuk az adatok kezelőjeként. Az API-k használatával navigálhatunk az BlockBlobService adathalmazban. További részletekért lásd itt:

A CORD-19-adatokat a covid19temp tároló tárolja. Ez a tárolón belüli fájlstruktúra egy példafájllal együtt.

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

Minden .json-fájl az adathalmaz egy-egy cikkének felel meg. Itt tárolja a teljes szöveges adatokat a cím, a szerzők, az absztrakt és (ahol elérhető) a rendszer.

A metadata.csv használata

A CORD-19 adatkészlet egyetlen fájllal metadata.csv rendelkezik, amely a CORD-19 adatkészletben elérhető összes dokumentum alapvető adatait rögzíti. Ez egy jó hely a felfedezés megkezdéséhez!

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

Első pillantásra sokat kell belevenni, ezért alkalmazzunk egy kis polírozást.

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élda: Teljes szöveg olvasása

metadata.csv nem tartalmazza magát a teljes szöveget. Lássunk egy példát arra, hogyan olvashatja ezt el. Keresse meg és csomagolja ki a teljes szöveges jsont, és konvertálja mondatok listájára.

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

Most az alábbiak szerint olvashatjuk a blobhoz társított json-tartalmat.

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

Ebben a példában body_texta szöveges adatokat az alábbiak szerint tároljuk:

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

A teljes json-séma itt érhető el.

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 és PMC XML-elemzés

A fenti példában megvizsgáltunk egy esetet a következővel has_pdf_parse == True: . Ebben az esetben a blobfájl elérési útja az űrlap volt:

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

Másik lehetőségként az alábbi formátumot has_pmc_xml_parse == True használó esetekben:

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

Például:

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

Iterálás közvetlenül blobokon keresztül

A fenti példákban a fájl használatával navigáltunk az metadata.csv adatok között, létrehoztuk a blobfájl elérési útját, és adatokat olvastunk a blobból. Egy másik lehetőség a blobokon keresztüli iterálás.

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

Most már közvetlenül át tudjuk iterálni a blobokat. Tegyük fel például, hogy megszámoljuk az elérhető JSON-fájlok számát.

# 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

Függelék

Adatminőségi problémák

Ez egy nagy adatkészlet, amely nyilvánvaló okokból meglehetősen sietősen lett összeállítva! Az alábbiakban néhány adatminőségi problémát észleltünk.

Több shas

Megfigyeljük, hogy bizonyos esetekben több shas egy adott bejegyzéshez.

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

A tároló elrendezése

Itt egy egyszerű regex használatával vizsgáljuk meg a tároló fájlstruktúráját, ha ez a jövőben frissül.

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

További lépések

Tekintse meg a többi adathalmazt az Open Datasets katalógusban.