COVID-19 のオープン リサーチ データセット

機械判読用に最適化され、グローバルな研究コミュニティで使用できる、COVID-19 およびコロナウイルス関連の学術論文の全文およびメタデータ データセット。

COVID-19 パンデミックに対する応答として、 アレン人工知能研究所は、Covid 19 オープン リサーチ データセットを準備して配布する主要リサーチ グループと提携しています (CORD-19)。 このデータセットは47,000 本もの学術論文を無料公開しており、COVID-19 および世界中の研究コミュニティが使用するウィルスのコロナウィルス ファミリーについて 36,000 本以上は全文が公開されています。

このデータセットは、研究者を動員して自然言語処理における最新の進展状況を適用することで、この感染症との闘いをサポートするための新しい分析情報を生成する目的で作成されています。

全文献は、新しい研究は査読された出版物や bioRxivmedRxiv などのアーカイブ サービスで公開されると、更新される可能性があります。

Note

Microsoft は、Azure Open Datasets を "現状有姿" で提供します。 Microsoft は、データセットの使用に関して、明示または黙示を問わず、いかなる保証も行わないものとし、条件を定めることもありません。 現地の法律の下で認められている範囲内で、Microsoft は、データセットの使用に起因する、直接的、派生的、特別、間接的、偶発的、または懲罰的なものを含めたいかなる損害または損失に対しても一切の責任を負わないものとします。

このデータセットは、Microsoft がソース データを受け取った元の条件に基づいて提供されます。 データセットには、Microsoft が提供するデータが含まれている場合があります。

ライセンス条項

このデータセットは、アレン人工知能研究所の学術文献検索サービスSemantic Scholarから利用できます。 CORD-19 データセットで提供されているコンテンツにアクセスしたりダウンロードしたりすることで、このデータセットの使用に関連するデータセット ライセンスに同意したものとみなされます。 データセット内の個別の記事に関する特定のライセンス情報は、メタデータ ファイルで提供されます。 ライセンス情報についての詳細は、PMC Web サイトmedRxiv Web サイト、およびbioRxiv Web サイトで利用できます。

ボリュームとデータ保持期間

このデータセットは JSON 形式で保存されており、最新のリリースには 36,000 を超える全文記事が含まれています。 各記事は単一の JSON オブジェクトとして表されます。 スキーマを表示します

保存先

このデータセットは、米国東部 Azure リージョンに保存されています。 アフィニティのために、米国東部でコンピューティング リソースを割り当てることをお勧めします。

引用

出版物や再版物に CORD-19 データを含める場合は、次のようにデータセットを引用してください。

参考文献内:

COVID-19 Open Research Dataset (CORD-19)。 2020 年。 バージョン YYYY-MM-DD。 COVID-19 Open Research Dataset (CORD-19) より取得。 YYYY-MM-DD にアクセス。 doi:10.5281/zenodo.3715505

テキスト内: (CORD-19, 2020)

Contact

このデータセットに関するご質問がある場合は、partnerships@allenai.org にお問い合わせください。

データ アクセス

Azure Notebooks

CORD-19 データセット

CORD-19 は、COVID-19、SARS-CoV-2、関連するコロナウイルスなどについて 5 万を超える学術記事を集めたものです。このうち 4 万本は全文記事です。 このデータセットは、COVID-19 パンデミックに挑む研究コミュニティを支援する目的で自由に利用できるようになりました。

このノートブックの目標は 2 つです。

  1. Azure の CORD-19 データセットにアクセスする方法を示します。CORD-19 データセットを格納している Azure blob ストレージ アカウントに接続します。
  2. データセットの構造を確認します。データセット内の記事は json ファイルとして格納されます。 次の例を示します。
  • 記事を検索する方法 (コンテナー内を移動する)
  • 記事を読む方法 (jacon スキーマ内を移動する)

依存関係: このノートブックには、次のライブラリが必要です。

  • Azure ストレージ (例: pip install azure-storage)
  • NLTK (説明書)
  • Pandas (例: pip install pandas)

Azure からの CORD-19 データの取得

CORD-19 データが Azure オープン データセットとしてこちらにアップロードされています。 この CORD-19 オープン データセットにリンクされている BLOB サービスを作成します。

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

この BLOB サービスは、データのハンドルとして使用できます。 BlockBlobService API を活用するデータセットを移動できます。 詳細については次を参照してください。

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のデータセットには、 CORD-19データセットで利用可能なすべての論文に関する基本情報を記録する 1 つのファイルである metadata.csv が付属しています。 これは、Web カメラを探すには便利なサイトです!

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

これで、この BLOB に関連付けられている json コンテンツを次のように読み取ることができます。

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

PDF と PMC XML 解析

上記の例では、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 からデータを読み取ります。 もう 1 つの方法は、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

次のステップ

Open Datasets カタログの残りのデータセットを表示します。