Generate lightweight feedback insights aligned with the PDF interaction.
(selected: Set[int], skipped: Set[int], papers: List[Dict])
| 434 | def build_learning_signals(selected: Set[int], skipped: Set[int], papers: List[Dict]) -> List[str]: |
| 435 | """Generate lightweight feedback insights aligned with the PDF interaction.""" |
| 436 | selected_categories = {} |
| 437 | skipped_categories = {} |
| 438 | |
| 439 | for paper_num in selected: |
| 440 | paper = papers[paper_num - 1] |
| 441 | category = paper.get("category", "unknown") |
| 442 | selected_categories[category] = selected_categories.get(category, 0) + 1 |
| 443 | |
| 444 | for paper_num in skipped: |
| 445 | paper = papers[paper_num - 1] |
| 446 | category = paper.get("category", "unknown") |
| 447 | skipped_categories[category] = skipped_categories.get(category, 0) + 1 |
| 448 | |
| 449 | signals = [] |
| 450 | |
| 451 | lower_bucket_selected = selected_categories.get("maybe_interested", 0) + selected_categories.get("edge_relevant", 0) |
| 452 | if lower_bucket_selected: |
| 453 | signals.append( |
| 454 | f"✓ 你选中了 {lower_bucket_selected} 篇原本靠后的候选,对应主题会被视为更强正信号" |
| 455 | ) |
| 456 | |
| 457 | top_bucket_skipped = skipped_categories.get("must_read", 0) + skipped_categories.get("high_relevant", 0) |
| 458 | if top_bucket_skipped: |
| 459 | signals.append( |
| 460 | f"✓ 你这次跳过了 {top_bucket_skipped} 篇 🔒/🔴 候选,我会先按弱负信号处理,不会立刻重罚" |
| 461 | ) |
| 462 | |
| 463 | if not selected: |
| 464 | signals.append("✓ 今天的“都不看”会被记为一次弱负信号,只有连续多天跳过同类论文才会明显降权") |
| 465 | |
| 466 | if selected_categories: |
| 467 | dominant_category = max(selected_categories.items(), key=lambda item: item[1])[0] |
| 468 | dominant_label = CATEGORY_LABELS.get(dominant_category, dominant_category) |
| 469 | signals.append(f"✓ 本次选择主要集中在“{dominant_label}”分组,后续我会优先沿这条线细化推荐") |
| 470 | |
| 471 | signals.extend(_build_contrastive_signals(selected, skipped, papers)) |
| 472 | |
| 473 | return signals[:4] |
| 474 | |
| 475 | |
| 476 | def format_selection_summary( |
| 477 | selected: Set[int], |
| 478 | total_papers: int, |
no test coverage detected