COVID-19 Açık Araştırma Veri Kümesi

COVID-19 ve koronavirüs ile ilgili bilimsel makalelere ait tam metinleri ve meta verileri makine tarafından okunabilecek şekilde iyileştirilmiş olarak içeren ve küresel araştırma topluluğunun kullanımına sunulan veri kümesi.

COVID-19 pandemisine yanıt olarak Allen Yapay Zeka Enstitüsü, COVID-19 Açık Araştırma Veri Kümesini (CORD-19) hazırlamak ve dağıtmak için önde gelen araştırma gruplarıyla işbirliği yapmaktadır. Bu veri kümesi, COVID-19 hakkında 36.000'den fazla tam metin içeren 47.000'den fazla bilimsel makalenin ve küresel araştırma topluluğu tarafından kullanılmak üzere koronavirüs virüs ailesinin ücretsiz kaynağıdır.

Bu veri kümesi, araştırmacıları bu bulaşıcı hastalığa karşı mücadeleyi destekleyen yeni içgörüler oluşturmak üzere doğal dil işlemede son gelişmeleri uygulamaya yönelik harekete geçirdi.

Yeni araştırmalar, hakemli yayınlarda ve bioRxiv ile medRxiv gibi pek çok arşiv hizmetinde yayımlandıkça bu derleme güncelleştirilebilir.

Dekont

Microsoft, Azure Open Datasets'i "olduğu gibi" sağlar. Microsoft, veri kümelerini kullanımınızla ilgili olarak açık veya zımni hiçbir garanti veya koşul sağlamaz. Yerel yasalarınız kapsamında izin verilen ölçüde, Microsoft veri kümelerini kullanımınızdan kaynaklanan doğrudan, sonuçsal, özel, dolaylı, arızi veya cezai dahil olmak üzere tüm zarar veya kayıplar için tüm sorumluluğu kabul etmez.

Bu veri kümesi Microsoft’un kaynak verileri aldığı orijinal hükümler kapsamında sağlanır. Veri kümesi Microsoft’tan alınan verileri içerebilir.

Lisans Koşulları

Bu veri kümesi Allen Institute of AI ve Semantic Scholar tarafından kullanıma sunulmuştur. CORD-19 Veri Kümesine erişerek, bunu indirerek veya herhangi bir şekilde içeriğini kullanarak bu veri kümesinin kullanımına ilişkin Veri Kümesi Lisansı’nı kabul etmiş olursunuz. Veri kümesindeki ayrı ayrı makalelere yönelik belirli lisanslama bilgileri, meta veri dosyasında yer alır. PmC web sitesinde, medRxiv web sitesinde ve bioRxiv web sitesinde daha fazla lisanslama bilgisi mevcuttur.

Birim ve saklama

Bu veri kümesi JSON biçiminde depolanır ve en son sürümde 36.000'den fazla tam metin makalesi bulunur. Her sayfa, tek bir JSON nesnesi olarak gösterilir. Şemayı görüntüleyin.

Depolama Konumu

Bu veri kümesi Doğu ABD Azure bölgesinde depolanır. Benzeşim için Doğu ABD'de işlem kaynaklarının bulunması önerilir.

Alıntı

CORD-19 verilerini bir yayına veya yeniden dağıtıma dahil ederken veri kümesini aşağıdaki gibi alıntılayın:

Kaynakçada:

COVID-19 Açık Araştırma Veri Kümesi (CORD-19). 2020. Sürüm YYYY-AA-GG. COVID-19 Açık Araştırma Veri Kümesi’nden (CORD-19) alınmıştır. Erişim tarihi: DD.MM.YYYY. doi:10.5281/zenodo.3715505

Metin olarak: (CORD-19, 2020)

İlgili Kişi

Bu veri kümesiyle ilgili sorularınız için partnerships@allenai.org ile iletişime geçin.

Veri erişimi

Azure Notebooks

CORD-19 Veri Kümesi

CORD-19, COVID-19, SARS-CoV-2 ve ilgili korona virüsleri hakkında 40.000'den fazla tam metin içeren 50.000'den fazla bilimsel makaleden oluşan bir koleksiyondur. Bu veri kümesi, araştırma topluluklarının COVID-19 pandemisiyle mücadelesine yardımcı olmak amacıyla serbestçe kullanıma sunulmuştur.

Bu not defterinin amacı iki katlıdır:

  1. Azure'da CORD-19 veri kümesine erişmeyi gösterme: CORD-19 veri kümesini barındıran Azure blob depolama hesabına bağlanıyoruz.
  2. Veri kümesinin yapısına bakın: Veri kümesindeki makaleler json dosyaları olarak depolanır. Şu örnekleri gösteriyoruz:
  • Makaleleri bulma (kapsayıcıda gezinme)
  • Makaleleri okuma (json şemasında gezinme)

Bağımlılıklar: Bu not defteri aşağıdaki kitaplıkları gerektirir:

  • Azure depolama (örneğin, pip install azure-storage)
  • NLTK (belgeler)
  • Pandas (örneğin, pip install pandas)

Azure'dan CORD-19 verilerini alma

CORD-19 verileri burada Azure Açık Veri Kümesi olarak karşıya yüklendi. Bu CORD-19 açık veri kümesine bağlı bir blob hizmeti oluşturuyoruz.

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

Bu blob hizmetini veriler üzerinde tanıtıcı olarak kullanabiliriz. API'leri kullanarak veri kümesinde BlockBlobService gezinebiliriz. Diğer ayrıntılar için buraya bakın:

CORD-19 verileri kapsayıcıda covid19temp depolanır. Bu, örnek bir dosyayla birlikte kapsayıcı içindeki dosya yapısıdır.

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

Her .json dosyası veri kümesindeki tek bir makaleye karşılık gelir. Başlık, yazarlar, özet ve (varsa) tam metin verilerinin depolandığı yerdir.

metadata.csv kullanma

CORD-19 veri kümesi, CORD-19 veri kümesinde bulunan tüm kağıtlarla ilgili temel bilgileri kaydeden tek bir dosyayla birlikte metadata.csv gelir. Burası keşfetmeye başlamak için iyi bir yer!

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

İlk bakışta bu çok fazla, bu yüzden biraz cila uygulayalım.

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

Örnek: Tam metni okuma

metadata.csv tam metnin kendisini içermez. Şimdi bunun nasıl okunduğuna dair bir örnek görelim. Tam metin json dosyasını bulup açın ve tümce listesine dönüştürün.

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

Artık bu blobla ilişkili json içeriğini aşağıdaki gibi okuyabiliriz.

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

Bu örneğin amaçları doğrultusunda, metin verilerini aşağıdaki gibi depolayan ile ilgileniyoruz body_text:

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

JSON şemasının tamamına buradan ulaşabilirsiniz.

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 Ayrıştırma

Yukarıdaki örnekte ile has_pdf_parse == Truebir servis talebine baktık. Bu durumda blob dosya yolu şu biçimdeydi:

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

Alternatif olarak, aşağıdaki biçimi kullanan durumlar has_pmc_xml_parse == True için:

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

Örneğin:

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

Bloblar arasında doğrudan yineleme

Yukarıdaki örneklerde verileri gezinmek, blob dosya yolunu oluşturmak ve blobdan veri okumak için dosyasını kullandık metadata.csv . Alternatif olarak blobların kendileri de yinelenir.

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

Artık blobları doğrudan yineleyebiliriz. Örneğin, kullanılabilir json dosyalarını sayalım.

# 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

Ek

Veri kalitesi sorunları

Bu, belirgin nedenlerden dolayı aceleyle bir araya getirildiği büyük bir veri kümesidir! İşte gözlemlediğimiz bazı veri kalitesi sorunları.

Birden çok gölge

Bazı durumlarda belirli bir girdi için birden çok sha olduğunu gözlemliyoruz.

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

Kapsayıcının düzeni

Burada, gelecekte güncelleştirilmesi durumunda kapsayıcının dosya yapısını keşfetmek için basit bir regex kullanırız.

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

Sonraki adımlar

Açık Veri Kümeleri kataloğundaki diğer veri kümelerini görüntüleyin.