- 全链路:多源JD接入/清洗交叉验证/结构化抽取(星火+离线双通道)/时序知识图谱/新岗位发现/演化分析/人岗匹配/学习路径 - WebUI 五视图:驾驶舱/图谱工作台/岗位演化/匹配(单人+批量)/学习路径 - 设置中心(config.json)/Token鉴权/SQLite状态库/语义向量通道(BGE-M3本地或联网API) - 71 个 pytest 用例;数据目录仅保留结构(.gitkeep),数据由 scripts/generate_dataset.py 复现
34 lines
1.1 KiB
Python
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
|