维度向量 + 曼哈顿距离的匹配系统机制
这个 SBTI 的评分机制本质上是一个**“先算 15 个维度画像再和人格模板做距离匹配”**的流程。可以拆成 4 步看1. 先给每道题计分前端测试页收集用户答案写进sessionStorage到了结果页再统一计算。核心计算函数是scoring.ts里的calculateResult()。每道题的选项分值来自questions.json分值只有三档选项分数 1 / 2 / 3如果用户漏答某题系统不会跳过而是默认按 2 分处理也就是这句逻辑的意思raw answers[q.id] ?? 2含义是有答案就加该答案的分没有答案就加 2 分。2. 按维度汇总分数系统不会直接拿单题分数去匹配人格而是先按维度聚合。也就是说一个维度下面可能对应若干题先把这些题的得分加总得到这个维度的原始分raw。然后再把这个原始分转换成维度等级 3→L 4→M 5→H所以每个维度最后不会保留原始分而是被压缩成三档L 低M 中H 高接着系统再把这三档编码成数值L → 0M → 1H → 2最后形成一个15 维用户向量。例如可能长这样[2, 1, 0, 2, 1, 1, 0, 2, 2, 1, 0, 1, 2, 1, 0]这就是用户的“人格画像向量”。3. 用 15 维向量去匹配人格模板每种人格的标准答案在personalities.json里也是一个 15 维向量。系统会把用户向量和每个人格模板向量逐一比较使用的是曼哈顿距离15 个维度上逐项做绝对值差再把差值全部加起来公式可以理解成distance |u1-p1| |u2-p2| ... |u15-p15|因为每一维只有0 / 1 / 2三种值所以每一维最大差值是 2。15 维情况下总最大距离就是15 × 2 30所以这个系统里距离范围是0 ~ 300 完全一致30 差异最大4. 把距离换算成相似度百分比系统不是直接展示距离而是换成一个更直观的相似度s i m i l a r i t y m a x ( 0 , r o u n d ( ( 1 − d i s t a n c e / 30 ) ∗ 100 ) ) similarity max(0, round((1 - distance / 30) * 100))similaritymax(0,round((1−distance/30)∗100))意思是距离越小相似度越高距离为 0 时相似度 100%距离为 30 时相似度 0%举例distance 0→100%distance 6→80%distance 15→50%distance 30→0%排名是怎么决定的如果多个候选人格都参与比较排序优先级是曼哈顿距离更小的排前面如果距离相同完全一致的维度数更多的排前面如果还相同再比较similarity高低所以它的核心判断标准是“谁离你最近”。隐藏人格怎么触发这里还有一个特殊分支优先级高于普通人格匹配如果隐藏题满足drink coffee且drinkAttitude addict那系统就直接返回隐藏人格不再走正常的 15 维匹配流程且匹配度固定为100%这相当于一个“彩蛋判定”。你可以把整个机制理解成一句话这个 SBTI 不是传统心理测验里那种复杂加权模型它更像是一个题目打分 → 压缩成 15 个维度等级 → 转成向量 → 和预设人格模板做最近邻匹配这个机制的特点它有几个很明显的特征优点规则简单容易解释前后端实现成本低人格结果稳定便于做产品化展示限制每题只有1/2/3分辨率比较低L/M/H三档会损失细节漏答默认记 2 分会把用户往“中间型”拉曼哈顿距离默认所有维度权重一样不能体现某些维度更重要一个简化例子假设某个维度有两道题Q1 3 分Q2 2 分维度总分raw 3 2 5按规则 5→HH → 2于是这个维度在用户向量中的值就是2。如果某人格在这一维的模板值也是2这一维距离贡献就是0如果模板值是1贡献就是1如果模板值是0贡献就是2。所有 15 维都这样累计最后得出总距离再换算成百分比。