| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647 |
- """论文辅助函数 —— arXiv ID 标准化与论文元数据提取."""
- from typing import Any
- from ...utils import normalize_arxiv_id
- def daily_paper_identity_sig(p: Any) -> str:
- ax = normalize_arxiv_id(getattr(p, "arxiv_id", None))
- if ax:
- return f"arxiv:{ax}"
- doi = (getattr(p, "doi", None) or "").strip().lower()
- if doi:
- return f"doi:{doi}"
- t = (getattr(p, "title", None) or "").strip().lower()
- y = int(getattr(p, "year", 0) or 0)
- return f"ty:{t}|{y}"
- def graph_author_node_id(paper_id: int, author_index: int, author: Any) -> str:
- raw_orcid = getattr(author, "orcid", None)
- orc = None
- if raw_orcid:
- s = str(raw_orcid).strip().lower()
- for prefix in ("https://orcid.org/", "http://orcid.org/"):
- if s.startswith(prefix):
- s = s[len(prefix):]
- s = s.strip().rstrip("/")
- if len(s) >= 10:
- orc = s
- if orc:
- return f"author:o:{orc}"
- try:
- aid = getattr(author, "db_id", None)
- if aid is not None and int(aid) > 0:
- return f"author:db:{int(aid)}"
- except Exception:
- pass
- return f"author:p:{int(paper_id)}:{int(author_index)}"
- def graph_author_label(author: Any, author_index: int, node_id: str) -> str:
- name = (getattr(author, "name", None) or "").strip() or "Unknown"
- if not str(node_id).startswith("author:p:"):
- return name[:120]
- aff = (getattr(author, "affiliation", None) or "").strip()
- if aff:
- short = aff[:26] + ("…" if len(aff) > 26 else "")
- return f"{name[:80]} ({short})"
- return f"{name[:80]} (#{author_index + 1})"
|