公司动态
颠覆传统排名程序以产出数量定高下,编写程序,同等数量作品下,思路差异化程度越高,综合得分越高,鼓励原创创新。
实际应用场景描述在心理健康与创新能力的研究中发散思维Divergent Thinking 是衡量创造力的核心指标之一。传统的创作辅助或排名系统往往陷入一个误区以产出数量论英雄。无论是在学术研究、内容创作还是头脑风暴场景中单纯统计产出数量KPI会诱导参与者走向同质化堆量的捷径从而产生大量低质、雷同的作品。本程序旨在颠覆这一排名逻辑在同等产出数量下引入思路差异化程度Semantic Diversity 作为核心加权因子。它不仅统计作品数量更通过自然语言处理NLP技术量化每篇作品的独特价值。当数量相当时思路越独特、越分散综合得分越高。这从机制上鼓励创作者跳出舒适区追求真正的原创性。引入痛点1. 数量陷阱Quantity Trap传统排名机制诱导刷量行为忽略了质量与原创性的权重。2. 同质化竞争在内容创作、学术投稿等场景中高分作品往往趋同。模仿爆款思路比探索新思路更容易获得短期收益但这扼杀了创新。3. 创新激励错位现有的评估工具缺乏对市场同质化程度的量化感知无法从机制上奖励第一个吃螃蟹的人。4. 心理倦怠当创作者发现复制粘贴比苦思冥想得分更高时会产生挫败感进而放弃创新尝试。核心逻辑讲解程序的核心是一个数量 x 差异化的双维评估引擎1. 语义向量化Semantic Vectorization利用预训练的语言模型如sentence-transformers将每篇作品转化为高维向量。向量间的距离代表了语义上的差异。2. 差异化指数计算Diversity Index* 对于单个作品计算它与所有其他作品的平均语义距离余弦距离。距离越远说明该作品越独树一帜。* 对于作品集整体差异化计算所有作品向量构成的集合的平均成对距离Average Pairwise Distance。3. 综合得分公式Composite ScoringScore N \times (1 \alpha \cdot D)* N 作品数量Quantity。* D 差异化指数Diversity Index归一化到 0~1 之间。* \alpha 创新激励系数默认 0.5可调。当 \alpha 越大差异化带来的加分越明显。* 核心逻辑如果两人都有 10 篇作品甲的内容千篇一律 D 值趋近于 0得分约等于 10乙的内容涉及 10 个不同角度 D 值趋近于 1得分约等于 15。代码模块化实现项目结构innovation_ranker/├── README.md├── requirements.txt├── core/│ ├── vectorizer.py # 文本向量化与语义分析│ ├── scorer.py # 核心评分引擎│ └── ranker.py # 排名与报告生成├── utils/│ ├── config.py # 配置管理│ └── logger.py # 日志工具└── main.py # 主入口requirements.txtsentence-transformers2.2.2 # 语义向量化核心库numpy1.24.0 # 数值计算与矩阵运算scikit-learn1.3.0 # 余弦距离计算rich13.0.0 # 终端美化输出pyyaml6.0 # 配置文件解析pandas2.0.0 # 数据报表生成可选utils/config.py配置管理模块管理模型选择、评分权重等可变参数from pathlib import Pathimport yamlDEFAULT_CONFIG {model: {name: paraphrase-multilingual-MiniLM-L12-v2, # 多语言模型支持中文device: cpu # 若有GPU可改为 cuda},scoring: {alpha: 0.5, # 差异化激励系数 (0~1)normalize_method: min-max # 归一化方法: min-max / z-score},output: {top_n: 10 # 默认展示前10名}}def load_config(config_path: str config.yaml) - dict:加载外部配置文件缺失则使用默认配置path Path(config_path)if path.exists():with open(path, r, encodingutf-8) as f:user_cfg yaml.safe_load(f) or {}return {**DEFAULT_CONFIG, **user_cfg}return DEFAULT_CONFIGutils/logger.py统一日志管理import loggingfrom rich.logging import RichHandlerdef setup_logger(name: str InnovationRanker, level: str INFO) - logging.Logger:logger logging.getLogger(name)logger.setLevel(getattr(logging, level.upper(), logging.INFO))handler RichHandler(rich_tracebacksTrue)handler.setFormatter(logging.Formatter(%(message)s))logger.addHandler(handler)return loggercore/vectorizer.py语义向量化模块将文本作品转化为高维向量是计算差异化的基础from sentence_transformers import SentenceTransformerimport numpy as npfrom typing import List, Dict, Anyfrom utils.logger import setup_loggerlogger setup_logger(Vectorizer)class WorkVectorizer:def __init__(self, model_name: str, device: str cpu):加载预训练模型try:self.model SentenceTransformer(model_name, devicedevice)logger.info(f模型加载成功: {model_name} on {device})except Exception as e:logger.error(f模型加载失败: {e})raisedef encode(self, texts: List[str]) - np.ndarray:将文本列表转化为向量矩阵输出维度: (len(texts), embedding_dim)if not texts:return np.array([])embeddings self.model.encode(texts, show_progress_barFalse)return embeddingsdef compute_diversity(self, embeddings: np.ndarray) - Dict[str, Any]:计算作品集的差异化指标1. pairwise_distances: 所有作品两两之间的语义距离矩阵2. avg_pairwise_distance: 平均成对距离全局差异化指标3. individual_scores: 每个作品相对于其他作品的平均距离from sklearn.metrics.pairwise import cosine_distancesif len(embeddings) 2:return {avg_pairwise_distance: 0.0,individual_scores: [0.0] * len(embeddings),distance_matrix: []}# 计算余弦距离矩阵dist_matrix cosine_distances(embeddings)# 平均成对距离去掉对角线上的0n dist_matrix.shape[0]mask np.ones((n, n), dtypebool)np.fill_diagonal(mask, 0)avg_dist dist_matrix[mask].mean()# 每个作品的平均距离去掉自身individual (dist_matrix.sum(axis1) - np.diag(dist_matrix)) / (n - 1)return {avg_pairwise_distance: float(avg_dist),individual_scores: individual.tolist(),distance_matrix: dist_matrix.tolist()}core/scorer.py核心评分引擎实现 数量 x 差异化 的复合评分逻辑import numpy as npfrom typing import List, Dict, Anyfrom utils.logger import setup_loggerlogger setup_logger(Scorer)class InnovationScorer:def __init__(self, alpha: float 0.5, normalize_method: str min-max):alpha: 差异化激励系数alpha0 → 纯数量排名传统模式alpha1 → 数量与差异化同等重要normalize_method: 差异化分数的归一化方式self.alpha max(0.0, min(1.0, alpha)) # 限制在 [0, 1]self.normalize_method normalize_methoddef normalize(self, values: List[float]) - List[float]:将差异化分数归一化到 [0, 1] 区间if not values or len(values) 1:return [0.5] * len(values)arr np.array(values, dtypefloat)if self.normalize_method min-max:min_v, max_v arr.min(), arr.max()if max_v - min_v 1e-10:return [0.5] * len(values)return ((arr - min_v) / (max_v - min_v)).tolist()elif self.normalize_method z-score:mean, std arr.mean(), arr.std()if std 1e-10:return [0.5] * len(values)return ((arr - mean) / std).tolist()return valuesdef calculate(self, participants: List[Dict[str, Any]]) - List[Dict[str, Any]]:计算所有参与者的综合得分输入格式:participants [{id: user_001,name: 张三,works: [作品1文本..., 作品2文本...],work_titles: [标题1, 标题2], # 可选diversity_scores: [0.7, 0.3, ...], # 来自 vectorizeravg_diversity: 0.65},...]输出: 追加 composite_score 字段并按得分降序排列if not participants:return []# 提取各参与者的关键指标quantities [len(p[works]) for p in participants]diversities [p.get(avg_diversity, 0.0) for p in participants]# 归一化使不同量纲可比norm_q self.normalize(quantities)norm_d self.normalize(diversities)# 综合得分: Score N * (1 alpha * D_norm)# 这里使用归一化后的数量作为基数避免大数碾压results []for i, p in enumerate(participants):N quantities[i]D norm_d[i]composite N * (1 self.alpha * D)results.append({**p,quantity: N,raw_diversity: diversities[i],norm_quantity: round(norm_q[i], 4),norm_diversity: round(D, 4),composite_score: round(composite, 4)})logger.debug(f{p[name]}: N{N}, D{D:.4f}, Score{composite:.4f})# 按综合得分降序排列results.sort(keylambda x: x[composite_score], reverseTrue)# 添加排名for rank, r in enumerate(results, 1):r[rank] rankreturn resultscore/ranker.py排名展示与报告生成模块from rich.table import Tablefrom rich.console import Consolefrom rich.panel import Panelfrom rich.text import Textfrom typing import List, Dict, Anyfrom utils.logger import setup_loggerlogger setup_logger(Ranker)console Console()def display_rankings(results: List[Dict[str, Any]], top_n: int 10) - None:输出美观的排名表格display_list results[:top_n]console.print(\n *70, styledim)console.print( 创新力排名 —— 数量 × 差异化, stylebold cyan)console.print(*70, styledim)table Table(show_headerTrue, header_stylebold magenta, boxNone)table.add_column(排名, width6, justifycenter)table.add_column(参与者, stylegreen, width16)table.add_column(作品数, justifycenter, styleyellow)table.add_column(差异化指数, justifycenter, stylecyan)table.add_column(综合得分, justifycenter, stylebold red)table.add_column(作品思路预览, styledim, no_wrapFalse)for r in display_list:# 差异化可视化d_bar █ * int(r[norm_diversity] * 20)d_text Text(f{r[norm_diversity]:.2f} {d_bar}, stylecyan)# 作品标题预览titles r.get(work_titles, [])if not titles:titles [f作品{i1} for i in range(r[quantity])]preview , .join(titles[:3])if len(titles) 3:preview f 等{r[quantity]}篇# 高亮排名rank_style bold gold1 if r[rank] 3 else boldtable.add_row(Text(str(r[rank]), stylerank_style),r[name],str(r[quantity]),d_text,Text(str(r[composite_score]), stylebold red),preview[:50])console.print(table)console.print(*70, styledim)# 输出洞察if len(results) 2:top results[0]runner_up results[1]if top[quantity] runner_up[quantity]:console.print(f\n 洞察: {top[name]}与{runner_up[name]}作品数相同({top[quantity]}篇)f但{top[name]}因思路差异化更高({top[norm_diversity]-runner_up[norm_diversity]:.2f})而领先\n,stylebold yellow)main.py主程序入口编排: 数据加载 → 向量化 → 评分 → 排名展示 完整流水线import argparseimport jsonfrom pathlib import Pathfrom typing import List, Dict, Anyfrom utils.config import load_configfrom utils.logger import setup_loggerfrom core.vectorizer import WorkVectorizerfrom core.scorer import InnovationScorerfrom core.ranker import display_rankingslogger setup_logger(Main)def load_participants(data_path: str) - List[Dict[str, Any]]:加载参与者数据支持 JSON 格式:[{id: u1,name: 张三,works: [文本内容..., ...],work_titles: [标题1, 标题2]}]path Path(data_path)if not path.exists():logger.error(f数据文件不存在: {data_path})return []with open(path, r, encodingutf-8) as f:data json.load(f)return datadef run_pipeline(data_path: str, config_path: str config.yaml) - None:执行完整评估流水线config load_config(config_path)# Step 1: 加载数据participants load_participants(data_path)if not participants:logger.warning(没有参与者数据退出)returnlogger.info(f加载了 {len(participants)} 位参与者的数据)# Step 2: 初始化向量化器model_cfg config[model]vectorizer WorkVectorizer(model_namemodel_cfg[name],devicemodel_cfg[device])# Step 3: 为每位参与者计算差异化指标scoring_cfg config[scoring]for p in participants:works p.get(works, [])if not works:p[avg_diversity] 0.0p[diversity_scores] []continueembeddings vectorizer.encode(works)div_result vectorizer.compute_diversity(embeddings)p[avg_diversity] div_result[avg_pairwise_distance]p[diversity_scores] div_result[individual_scores]logger.info(f {p[name]}: {len(works)} 篇作品, f差异化指数{p[avg_diversity]:.4f})# Step 4: 综合评分scorer InnovationScorer(alphascoring_cfg[alpha],normalize_methodscoring_cfg[normalize_method])results scorer.calculate(participants)# Step 5: 展示排名output_cfg config[output]display_rankings(results, top_noutput_cfg.get(top_n, 10))# Step 6: 导出详细结果output_path ranking_result.jsonwith open(output_path, w, encodingutf-8) as f:json.dump(results, f, ensure_asciiFalse, indent2)logger.info(f详细结果已导出: {output_path})def main():parser argparse.ArgumentParser(descriptionInnovation Ranker — 以差异化驱动的创新力排名)parser.add_argument(--data, requiredTrue,help参与者数据文件路径JSON格式)parser.add_argument(--config, defaultconfig.yaml,help配置文件路径)args parser.parse_args()run_pipeline(args.data, args.config)if __name__ __main__:main()README.md# Innovation Ranker — 差异化驱动的创新力排名引擎 *The spread of ideas is the essence of creativity.*## 是什么Innovation Ranker 是一个 Python 工具用于评估并排名创作者的**创新力**。它颠覆了传统的以量取胜排名逻辑引入**语义差异化Semantic Diversity** 作为核心加权因子。**核心理念**同等数量下思路越独特得分越高。## 排名公式综合得分 作品数量 × (1 α × 差异化指数)αalpha差异化激励系数默认 0.5差异化指数基于作品间语义余弦距离计算## 安装bashgit clone repo-urlcd innovation_rankerpython -m venv .venvsource .venv/bin/activatepip install -r requirements.txt **注意**首次运行会自动下载约 400MB 的预训练模型paraphrase-multilingual-MiniLM-L12-v2请确保网络畅通。## 准备数据创建 participants.json 文件json[{id: u1,name: 张三,works: [短视频时代的内容创作策略分析...,从用户心理学角度看推荐算法...],work_titles: [内容策略, 推荐心理]},{id: u2,name: 李四,works: [论短视频的流行趋势...,短视频行业发展报告...],work_titles: [流行趋势, 行业报告]}]## 运行bashpython main.py --data participants.json## 配置编辑 config.yamlyamlmodel:name: paraphrase-multilingual-MiniLM-L12-v2device: cpu # 有GPU改为 cudascoring:alpha: 0.5 # 差异化激励系数 (0纯数量, 1差异化同等重要)normalize_method: min-max # min-max / z-scoreoutput:top_n: 10## 输出示例 创新力排名 —— 数量 × 差异化排名 参与者 作品数 差异化指数 综合得分 作品思路预览1 张三 5 0.72 ████████████ 7.68 内容策略, 推荐心理 等5篇2 李四 5 0.35 ██████ 6.75 流行趋势, 行业报告 等5篇3 王五 3 0.81 █████████████ 4.37 设计思维, 用户研究... 洞察: 张三与李四作品数相同(5篇)但张三因思路差异化更高(0.37)而领先## 模块说明| 模块 | 职责 ||------|------|| core/vectorizer.py | 文本语义向量化 差异化指数计算 || core/scorer.py | 综合评分引擎数量 × 差异化 || core/ranker.py | 排名展示与洞察报告 || utils/config.py | 配置管理 || utils/logger.py | 日志管理 |## 许可MIT License核心知识点卡片┌───────────────────────────────────────────────────────────┐│ 知识点卡片 #1语义向量化Sentence Embedding │├───────────────────────────────────────────────────────────┤│ 概念将文本映射到高维连续向量空间 ││ 模型Transformer-based如 BERT、MiniLM ││ 关键特性 ││ - 语义相似的文本向量距离更近 ││ - 支持多语言本方案使用 multilingual 模型 ││ - 维度通常为 384/768/1024 ││ Python 库sentence-transformers ││ 代码位置core/vectorizer.py → WorkVectorizer.encode() │└───────────────────────────────────────────────────────────┘┌───────────────────────────────────────────────────────────┐│ 知识点卡片 #2余弦距离Cosine Distance │├───────────────────────────────────────────────────────────┤│ 概念衡量两个向量方向差异的指标 ││ 公式dist(A,B) 1 - cos(θ) 1 - (A·B)/(|A||B|) ││ 取值范围[0, 2] ││ - 0 → 方向完全相同语义几乎一致 ││ - 1 → 正交语义无关 ││ - 2 → 方向完全相反 ││ 优势对向量长度不敏感只关注语义方向 ││ 代码位置sklearn.metrics.pairwise.cosine_distances │└───────────────────────────────────────────────────────────┘┌───────────────────────────────────────────────────────────┐│ 知识点卡片 #3成对距离矩阵Pairwise Distance │├───────────────────────────────────────────────────────────┤│ 概念计算集合中所有元素两两之间的距离 ││ 矩阵形状(N, N)N 为作品数量 ││ 性质 ││ - 对角线为 0自身距离为0 ││ - 对称矩阵dist(i,j) dist(j,i) ││ 全局差异化 所有非对角元素的平均值 ││ 应用聚类分析、异常检测、多样性量化 │└───────────────────────────────────────────────────────────┘┌───────────────────────────────────────────────────────────┐│ 知识点卡片 #4归一化策略Normalization │├───────────────────────────────────────────────────────────┤│ 问题数量N和差异化D量纲不同不能直接比较 ││ 解决方案 ││ 1. Min-Max 归一化 ││ x (x - min) / (max - min) → 映射到 [0, 1] ││ 优点直观保留分布形状 ││ 缺点受极值影响大 ││ 2. Z-Score 标准化 ││ x (x - μ) / σ ││ 优点不受极值影响适合正态分布数据 ││ 代码位置core/scorer.py → InnovationScorer.normalize() │└───────────────────────────────────────────────────────────┘┌───────────────────────────────────────────────────────────┐│ 知识点卡片 #5复合评分设计模式 │├───────────────────────────────────────────────────────────┤│ 模式Score Base × (1 α × Bonus) ││ 这是游戏化设计中常见的乘法加成模式 ││ 特性 ││ - 当 Bonus0 时Score Base保底分 ││ - α 控制 Bonus 的影响力度 ││ - 乘法结构保证 Base 大的仍然占优但 Bonus 可以拉开差距 ││ 应用场景 ││ - 创新排名本方案 ││ - 游戏角色评分属性 × 加成 ││ - 信用评分基础分 × 行为修正 │└───────────────────────────────────────────────────────────┘总结传统排名系统的根本缺陷在于将产出等同于价值。本方案从心理健康与创新能力的视角出发基于发散思维理论构建了一套数量 × 差异化的双维评估体系。核心贡献1. 机制设计通过复合评分公式从数学上保证同质化堆量的收益低于差异化创作。2. 技术实现利用 Sentence-BERT 将文本语义量化使思路差异从主观判断变为可计算的指标。3. 中立性排名结果不依赖人工评审完全由算法驱动减少人为偏见。技术要点回顾- Sentence-Transformers 实现工业级语义向量化- 余弦距离矩阵量化作品集整体差异化- Min-Max / Z-Score 归一化消除量纲差异- 复合乘法评分模型平衡数量与质量利用AI解决实际问题如果你觉得这个工具好用欢迎关注长安牧笛