Открытый набор данных исследований по COVID-19

Машиночитаемый набор данных, состоящий из метаданных и полнотекстовых научных статей, посвященных COVID-19 и семейству коронавирусов. Набор доступен для мирового исследовательского сообщества.

В рамках реагирования на пандемию COVID-19 Институт Аллена по развитию искусственного интеллекта (AI2) в сотрудничестве с ведущими группами разработчиков подготавливает и распространяет открытый набор данных исследований по COVID-19 (CORD-19). Этот набор предназначен для бесплатного использования всем глобальным исследовательским сообществом и включает в себя более 47 000 научных статей (из которых более 36 000 включены полностью) о COVID-19 и семействе коронавирусов.

Этот набор данных позволяет исследователям применять последние достижения в сфере обработки естественного языка для генерации новых идей под эгидой борьбы с этим инфекционным заболеванием.

Собрание документов может обновляться по мере публикации результатов новых исследований в рецензируемых изданиях и архивных службах, таких как bioRxiv, medRxiv и др.

Примечание.

Корпорация Майкрософт предоставляет Открытые наборы данных Azure как есть. Корпорация Майкрософт не предоставляет никаких гарантий (явных или подразумеваемых) и не определяет никаких условий в связи с использованием этих наборов данных. В рамках, допускаемых местным законодательством, корпорация Майкрософт отказывается от ответственности за ущерб и убытки (в том числе прямые, косвенные, специальные, опосредованные, случайные и штрафные), понесенные в результате использования вами этих наборов данных.

Этот набор данных предоставляется на тех же условиях, на которых корпорация Майкрософт получила исходные данные. Этот набор может включать данные, полученные от корпорации Майкрософт.

Условия лицензии

Набор данных предоставляется институтом Аллена по развитию искусственного интеллекта (AI2) и платформой Semantic Scholar. Получая доступ к любому содержимому из набора данных CORD-19, а также скачивая такое содержимое или используя его другим образом, вы принимаете условия лицензии на набор данных, касающиеся его использования. Конкретные сведения о лицензировании для отдельных статей в наборе данных содержатся в файле метаданных. Дополнительные сведения о лицензировании доступны на веб-сайте PMC, веб-сайте medRxiv и веб-сайте bioRxiv.

Объем данных и их хранение

Этот набор данных хранится в формате JSON. Последний выпуск содержит более 36 000 полнотекстовых статей. Каждый документ представлен в виде объекта JSON. Просмотр схемы.

Расположение для сохранения

Этот набор данных хранится в регионе Azure "Восточная часть США". Для обеспечения сходства рекомендуется выделять вычислительные ресурсы в том же регионе "Восточная часть США".

Источник

Если вы включаете данные из CORD-19 в свои публикации или для распространения, укажите ссылку на набор данных следующим образом:

В библиографии:

COVID-19 Open Research Dataset (CORD-19). 2020 г. Версия ГГГГ-ММ-ДД. Получено из: COVID-19 Open Research Dataset (CORD-19). Получено: ГГГГ-ММ-ДД doi:10.5281/zenodo.3715505

Текст: (CORD-19, 2020)

Контактные сведения

С вопросами об этом наборе данных обращайтесь по адресу partnerships@allenai.org.

Доступ к данным

Записные книжки Azure

Набор данных CORD-19

CORD-19 содержит более 50 000 научных статей (из которых более 40 000 полнотекстовых) о COVID-19, SARS-CoV-2 и других коронавирусах. Этот набор данных бесплатно предоставляется в открытый доступ, чтобы помочь сообществам исследователей в борьбе с пандемией COVID-19.

Эта записная книжка имеет две цели:

  1. Продемонстрировать способ получения доступа к набору данных CORD-19 на платформе Azure: мы подключимся к учетной записи Хранилища BLOB-объектов с набором данных CORD-19.
  2. Описание структуры набора данных: статьи в этом наборе данных хранятся в формате файлов JSON. Наши примеры демонстрируют следующее:
  • поиск нужных статей (навигация по контейнеру);
  • чтение статей (навигация по схеме JSON).

Зависимости. Для этой записной книжки требуются следующие библиотеки:

  • хранилище Azure (например, pip install azure-storage);
  • NLTK (документация);
  • Pandas (например, pip install pandas).

Получение данных CORD-19 на платформе Azure

Данные CORD-19 загружены сюда в формате открытого набора данных Azure. Мы создадим службу BLOB-объектов, связанную с открытым набором данных 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,
)

Эта служба будет выполнять роль дескриптора данных. Перемещение по набору данных выполняется с помощью API BlockBlobService. В следующих статьях вы найдете дополнительные сведения:

Данные CORD-19 сохранены в контейнере covid19temp. Здесь приводятся структура файлов в контейнере и пример файла.

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

Каждый JSON-файл содержит отдельную статью в наборе данных. Именно в нем хранятся сведения об авторах, заголовки, аннотация и (если применимо) полнотекстовая статья.

Использование файла metadata.csv

Набор данных CORD-19 предоставляется с отдельным файлом metadata.csv, в котором хранится основная информация обо всей документации, доступной в наборе данных CORD-19. Лучше всего начать поиск именно здесь.

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

Информации очень много, так что сделаем следующее.

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

Пример получения полного текста статьи

В файле metadata.csv нет полнотекстовой статьи. Вот пример того, как ее получить. Найдите и разверните код JSON с полнотекстовой статьей, а затем преобразуйте текст в список предложений.

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

Теперь мы можем считывать содержимое JSON, связанное с этим BLOB-объектом.

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

Для этой статьи нам нужно значение 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 доступна здесь.

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

Синтаксический анализ PMC XML и PDF

В приведенном выше примере рассматривался вариант с has_pdf_parse == True. Путь к файлу BLOB-объекта при этом выглядел так:

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

Для других вариантов с has_pmc_xml_parse == True используйте следующий формат:

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

Например:

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

Итерация по BLOB-объектам

В примерах выше мы использовали файл metadata.csv для навигации по данным, создания пути к файлу BLOB-объекта и считывания данных из него. Есть и другой вариант — выполнить прямую итерацию по 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)

Итак, теперь мы может напрямую использовать BLOB-объекты. Давайте для примера узнаем число доступных JSON-файлов.

# 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

Приложение

Проблемы с качеством данных

Это большой набор данных, и мы по понятным причинам получали его ускоренными темпами. Ниже перечислены несколько проблем с качеством данных, которые мы заметили.

Несколько ключей SHA

Выяснилось, что в некоторых случаях одна запись имеет несколько ключей SHA.

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

Макет контейнера

Здесь мы с помощью несложного регулярного выражения проверим структуру файла контейнера на случай будущих изменений.

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

Следующие шаги

Ознакомьтесь с другими наборами в каталоге Открытых наборов данных.