Files
RoyirinRosmontis a10442d78c CareerNexus 职联:岗位能力图谱构建与动态演化分析平台(挑战杯 XH-202621)
- 全链路:多源JD接入/清洗交叉验证/结构化抽取(星火+离线双通道)/时序知识图谱/新岗位发现/演化分析/人岗匹配/学习路径
- WebUI 五视图:驾驶舱/图谱工作台/岗位演化/匹配(单人+批量)/学习路径
- 设置中心(config.json)/Token鉴权/SQLite状态库/语义向量通道(BGE-M3本地或联网API)
- 71 个 pytest 用例;数据目录仅保留结构(.gitkeep),数据由 scripts/generate_dataset.py 复现
2026-08-03 13:15:35 +08:00

34 lines
1.1 KiB
Python

"""时间衰减:招聘数据存在时滞,越旧的 JD 对当前能力刻画的贡献越低。
权重公式:w = exp(-λ · age),age 为发布日期距参考日期的年数。
"""
from __future__ import annotations
import logging
import math
from datetime import date
from app.models import JDRecord
logger = logging.getLogger(__name__)
def decay_weight(publish_date: date, ref_date: date, lam: float = 0.35) -> float:
"""计算单条 JD 的时间衰减权重。"""
age_years = max(0.0, (ref_date - publish_date).days / 365.25)
return round(math.exp(-lam * age_years), 4)
def apply_decay(
records: list[JDRecord],
ref_date: date | None = None,
lam: float = 0.35,
) -> list[JDRecord]:
"""就地更新每条记录的 weight(与已有降权相乘,不会覆盖抄袭降权)。"""
if ref_date is None:
ref_date = max((r.publish_date for r in records), default=date.today())
for r in records:
r.weight = round(r.weight * decay_weight(r.publish_date, ref_date, lam), 4)
logger.info("时间衰减完成:λ=%.3f,参考日期 %s", lam, ref_date.isoformat())
return records