scholartree

Graph visualization for relationship of scholars

https://github.com/fisher-wang/scholartree

Science Score: 31.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
  • DOI references
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (0.6%) to scientific vocabulary
Last synced: 10 months ago · JSON representation ·

Repository

Graph visualization for relationship of scholars

Basic Info
  • Host: GitHub
  • Owner: Fisher-Wang
  • Language: Python
  • Default Branch: main
  • Size: 11.7 KB
Statistics
  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • Open Issues: 0
  • Releases: 0
Created about 2 years ago · Last pushed almost 2 years ago
Metadata Files
Readme Citation

README.md

Scholar Tree

Owner

  • Name: Fisher Wang
  • Login: Fisher-Wang
  • Kind: user

PKU

Citation (citations.py)

import datetime
import os

from notion_client import Client
from scholarly import scholarly

from notion_database.client import Cell, DatabaseClient
from notion_database.enums import PROPERTY_TYPE
from utils.common import get_scholar_names, safe_get

DATABASE_ID = os.getenv("NOTION_DATABASE_ID")


def get_citations(names):
    rst = {}
    for i, name in enumerate(names):
        search_query = scholarly.search_author(name)

        for _ in range(1):
            author = next(search_query, None)
            if author is None:
                break

            if author["name"].lower().strip().replace(
                " ", ""
            ) == name.lower().strip().replace(" ", ""):
                rst[name] = author["citedby"]
                print(
                    f"[INFO] Find scholar {author['name']} with citation count {author['citedby']}"
                )
                break
            else:
                print(f"[INFO] Result {author['name']} not match {name}")

        if name not in rst:
            print(f"[INFO] Cannot find scholar {name}")

    return rst


def filter_scholar_names(notion: Client, names):
    db_rows = notion.databases.query(database_id=DATABASE_ID)
    names_filtered = []
    for row in db_rows["results"]:
        name = safe_get(row, "properties.Name.title.0.plain_text")
        if name in names:
            citation_update_time = safe_get(
                row, "properties.Citations last updated time.date.start"
            )
            if citation_update_time:
                citation_update_time = datetime.datetime.fromisoformat(
                    citation_update_time
                )
                time_diff = (
                    citation_update_time.astimezone()
                    - datetime.datetime.now().astimezone()
                )
                if time_diff > datetime.timedelta(days=7):
                    names_filtered.append(name)
            else:
                names_filtered.append(name)
    return names_filtered


def update_citations(notion: Client, scholar_names=None):
    scholar_names = get_scholar_names(notion) if not scholar_names else scholar_names
    scholar_names = filter_scholar_names(notion, scholar_names)
    print(f"[INFO] Updating citations for {scholar_names}")
    citations = get_citations(scholar_names)

    template_cells = [
        Cell(type=PROPERTY_TYPE.TITLE, name="Name", data=""),
        Cell(type=PROPERTY_TYPE.NUMBER, name="Citations", data=""),
        Cell(type=PROPERTY_TYPE.DATE, name="Citations last updated time", data=""),
    ]

    database = DatabaseClient(DATABASE_ID, notion, template_cells)

    for name, citation in citations.items():
        date = datetime.datetime.now().astimezone().isoformat()
        database.updateByTitle(
            "Name", name, **{"Citations": citation, "Citations last updated time": date}
        )

GitHub Events

Total
Last Year