Paper Search using ScopusAPI

  • 연구자라면 논문 검색이 일상입니다.
  • 매년 출간되는 논문의 편 수는 기하급수적으로 늘고 있습니다.
  • 새로운 논문을 찾거나 전체적인 트렌드를 파악하기가 점점 어려워집니다.
  • elsevier사가 제공하는 API를 사용해서 파이썬으로 데이터를 받고 정리합시다.

1. Elsevier

Elsevier
Elsevier Developers

1.1. 계정

  • Elsevier에 가입하고 로그인합니다.


1.2. API 획득

  • 데이터를 받아오려면 API key가 필요합니다.

  • https://dev.elsevier.com/에서 API key를 신청합니다.

  • I want an API Key를 눌러 들어갑니다.


  • Create API Key를 눌러 API Key 생성 모드로 들어갑니다.

  • Label과 Website URL에는 적당히 넣어줍니다.

  • 그리고 스크롤을 내려 하단의 API Service CheckboxElsevier Provisions for Text and Data Mining (TDM)에 동의 후 submit을 누릅니다.

    API Key를 다섯 개 받았습니다.

  • API Key마다 1주일간 한도가 있습니다. 많은게 좋습니다.

  • 속도 제한도 있으니 참고합니다.

2. Pybliometrics & Pandas DataFrame

2.1. Pybliometrics로 검색결과 받아오기

M. Rose et al. “pybliometrics:ScriptablebibliometricsusingaPythoninterfacetoScopus”, Software X 10 100263 (2019)
pybliometrics

  • 파이썬을 사용해 Scopus 검색과 초록, 참고문헌 등을 받아올 수 있는 라이브러리입니다.

  • 공식 홈페이지에 자세한 설명이 있습니다.

  • 여기서는 간단하게 검색과 초록 다운로드 방법을 알아봅니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    # Scopus에서 Search하는 라이브러리를 불러옵니다.
    from pybliometrics.scopus import ScopusSearch

    # 검색어: Scopus에서 키워드를 넣고 검색하면 발생하는 바로 그 검색식입니다.
    # 여기서는 도시 연구에 머신러닝과 딥러닝을 활용한 것들을 찾기로 했습니다.
    query = ' TITLE-ABS-KEY ( machine AND learning OR deep AND learning ) AND \
    TITLE-ABS-KEY ( city )'

    # 검색 시작
    s = ScopusSearch(query,
    download=True, # 검색 결과를 저장합니다.
    verbose=True) # 진행 상황을 표시합니다.

    • 실행 결과:
      1
      2
      Downloading results for query " TITLE-ABS-KEY ( machine  AND learning  OR  deep  AND learning )  AND                   TITLE-ABS-KEY ( city )":
      Progress: |██████████████████████████████████████████████████| 100.00% Complete
  • 처음 실행한다면 API Key를 넣으라는 작은 입력창이 뜰 것입니다.

  • 아까 받은 API Key를 여기에 복사해서 넣으면 됩니다.

  • 여러 개의 API Key를 이어서 사용하고 싶다면 더 좋은 방법이 있습니다.

  • ~/.scopus/에 있는 config.ini파일API Key를 쉼표(,)로 띄워서 넣어두면 자동으로 불러옵니다.

  • 몇 편이나 검색됐는지 확인합니다.

    1
    s.get_results_size()
    • 실행 결과:
      1
      5275
  • 5275편의 논문 정보를 받았습니다.

  • scopus.com에서 검색을 해도 같은 숫자가 보일겁니다.

  • 그러나 웹 검색으로는 이만큼 못가져옵니다.

  • API의 진가는 매우 다양한 정보를 한데 가져와서 처리할 수 있다는 데 있습니다.

2.2. Pandas로 검색결과 정리하기

  • 받아온 정보를 데이터프레임에 넣습니다.

    1
    2
    3
    import pandas as pd
    df_s = pd.DataFrame(s.results)
    df_s.head()


  • column이 34개나 있다고 합니다.

  • 맨 위 논문을 가지고 column의 이름과 내용을 살펴봅니다.

  • 논문을 많이 본 분이라면 어떤 내용인지 한번에 알 수 있을 겁니다.

    1
    2
    s0 = df_s.loc[0]
    s0
    • 실행 결과: 문헌, 저자, 소속, 출판 관련 정보가 빼곡합니다.
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      eid                                                   2-s2.0-85108515894
      doi 10.1016/j.aej.2021.04.099
      pii S1110016821003410
      pubmed_id None
      title Area and energy efficient shift and accumulato...
      subtype ar
      subtypeDescription Article
      creator Hazarika A.
      afid 60115117;60015723;60000912
      affilname Indian Institute of Information Technology Guw...
      affiliation_city Guwahati;Riyadh;Howrah
      affiliation_country India;Saudi Arabia;India
      author_count 4
      author_names Hazarika, Anakhi;Poddar, Soumyajit;Nasralla, M...
      author_ids 57209273202;55321684000;55638677600;57207594144
      author_afids 60115117;60115117;60015723;60000912
      coverDate 2022-01-01
      coverDisplayDate January 2022
      publicationName Alexandria Engineering Journal
      issn 11100168
      source_id 13907
      eIssn None
      aggregationType Journal
      volume 61
      issueIdentifier 1
      article_number None
      pageRange 795-809
      description Convolutional Neural Networks (CNNs) exhibit s...
      authkeywords Approximate computing | Convolution operation ...
      citedby_count 0
      openaccess 1
      fund_acr PSU
      fund_no MEITY-PHD-3043
      fund_sponsor Prince Sultan University
  • 종류별로 구분을 합시다.

  • 예를 들어, 나는 Journal에 실린 논문을 원하지 책이나 컨퍼런스 프로시딩은 원하지 않는다면, 간단히 추릴 수 있습니다.

  • 어떤 종류의 출판물들이 있는지 살펴봅니다.

    1
    df_s["aggregationType"].unique()
    • 실행 결과: 익숙한 분류들이 보입니다.
      1
      2
      array(['Journal', 'Conference Proceeding', 'Book', 'Book Series',
      'Trade Journal'], dtype=object)
  • 년도별로 Journal에 출간된 논문들의 수를 세어봅니다.

  • pandas DataFrame의 querygroupby를 사용하면 간단합니다.

  • 년도별 출간 편수를 세기 위해 논문마다 1을 할당하고

    1
    2
    3
    4
    5
    df_s["year"] = df_s["coverDate"].apply(lambda x: x.split("-")[0])
    df_s["year"] = df_s["year"].astype(int)
    df_s["num_pub"] = [1] * df_s.shape[0]
    df_pubyear = df_s.query("aggregationType == 'Journal'").groupby("year").sum()
    df_pubyear.values.T
    • 실행 결과: 년도별 출간 건수입니다.
      1
      2
      3
      array([[  1,   1,   1,   2,   1,   1,   2,   1,   1,   1,   1,   5,   4,
      9, 7, 12, 21, 13, 18, 36, 49, 71, 113, 256, 457, 724,
      696, 1]])

2.3. Matplotlib으로 출판 추세 그리기

  • Matplotlib을 이용해서 간단히 년도별 출판 건 수를 그려봅니다.
  • 리뷰 논문에 하나씩 있는 그 그림입니다.
  • 2010년 이전엔 논문 수가 많이 적어서 안보이기에 확대를 했습니다.
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    %matplotlib inline
    import matplotlib.pyplot as plt
    import seaborn as sns

    sns.set_context("talk")

    fig, ax = plt.subplots(figsize=(10, 4), constrained_layout=True)
    ax.bar(df_pubyear.index, df_pubyear["num_pub"], fc="orange", ec="w")
    ax.set_title("Number of Publication", fontsize="large", pad=12)


    c_inset = "brown"
    ax_inset = fig.add_axes([0.15, 0.3, 0.5, 0.5])
    ax_inset.bar(df_pubyear.index, df_pubyear["num_pub"], fc="goldenrod", ec="w")
    ax_inset.set_xlim(df_pubyear.index.min()-1, 2010)
    ax_inset.set_ylim(0, 10)
    ax_inset.spines[["left", "right", "bottom", "top"]].set_edgecolor(c_inset)
    ax_inset.spines[["left", "right", "bottom", "top"]].set_linewidth(3)
    ax_inset.tick_params(color=c_inset, labelcolor=c_inset)

    ax.axvspan(df_pubyear.index.min(), 2010, fc=c_inset, alpha=0.3)
    ax.set_title("Number of Publication", fontsize="large", pad=12)
    ax.set_xlim(df_pubyear.index.min(), )

  • 다음 글에서는 API를 이용한 추가 분석을 이어가겠습니다.


도움이 되셨나요? 카페인을 투입하시면 다음 포스팅으로 변환됩니다

Share