scholartree
Graph visualization for relationship of scholars
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
- Repositories: 2
- Profile: https://github.com/Fisher-Wang
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}
)