给句子做个“语义审计”:从词向量到句子向量的方法论 从“证件照”到“公司全貌”你已经有了词向量。每个词都是一张“证件照”——300 维的数字记录着这个词的“长相”。但现实任务里你面对的是一句话。一句话少则三五个词多则几十个词。每个词都有一张“证件照”你手里捏着一叠照片怎么看出全貌呢这就是句子向量要解决的问题把一叠词向量融合成一个句子向量。那怎么融合呢不同的人有不同的思路。接下来我们基于公司的角度按几种基本方法逐个分析。2. 方法一把所有照片叠在一起取平均最直接的想法把所有词向量加起来除以词数。例句: 我 喜欢 吃 苹果v(我) [0.1, 0.3, ...]v(喜欢) [0.5, 0.2, ...]v(吃) [0.4, 0.1, ...]v(苹果) [0.8, 0.6, ...]句子向量 (v(我) v(喜欢) v(吃) v(苹果)) / 4就像你想了解一家公司的薪资水平把所有人的工资加一起取平均——简单粗暴。示例代码如下import numpy as npv_我 np.array([0.1, 0.3, 0.2, 0.5])v_喜欢 np.array([0.5, 0.2, 0.8, 0.1])v_吃 np.array([0.4, 0.1, 0.3, 0.6])v_苹果 np.array([0.8, 0.6, 0.7, 0.2])sentence_vec (v_我 v_喜欢 v_吃 v_苹果) / 4print(sentence_vec) # [0.45, 0.3, 0.5, 0.35]优点快仅一行代码即可计算结果。问题“前台“ 和 ”CEO“ 的权重一样。“我” 和 “喜欢” 对句子语义的贡献跟 “的”、“了” 一样大。显然不合理。3. 方法二给重要的人更高权重TF-IDFCEO 说的话要比前台更有分量。那怎么判断一个词重不重要分两个维度TF词频在这句话里出现次数多的词可能更重要。IDF逆文档频率在整个语料库里到处出现的词“的”、“了”、“是”反而不重要。TF-IDF 就是这两个指标的乘积。用它做权重给每个词的向量加权例句: 自然语言处理 是 人工智能 的 一个 分支TF-IDF 权重:的 → 0.01 到处都有几乎无意义是 → 0.02 常见虚词自然语言处理 → 0.85 重要实词人工智能 → 0.80 重要实词→ 实词主导句子向量虚词被压到几乎为零优点能区分主次。问题需要语料库来统计 IDF语料不同结果不同。还是没考虑词序。“人咬狗”和“狗咬人”权重一样向量也一样。4. 方法三剔除“行业共性”只看个性SIF⭐ 推荐TF-IDF 有进步但还有问题。假如你分析两家公司的财务报表会发现不管什么行业的公司都有一些“共性”支出——房租、水电、办公耗材。这些共性信息对你区分两家公司几乎没有帮助。真正有用的是剔除共性之后剩下的个性一家公司研发投入占比奇高另一家销售费用占比奇高。SIF 干的就是这件事。第一步计算每个词的权重和 TF-IDF 类似但更平滑这个词在整个语料里出现的频率。一个很小的常数通常取 0.0001 到 0.001。高频词“的”、“是”频率高 → 分母大 → 权重接近 0。低频词频率低 → 分母小 → 权重接近 1。第二步加权平均这一步和 TF-IDF 加权很像只是权重公式不一样。第三步移除第一主成分关键这是 SIF 的灵魂。把所有句子的向量放在一起找到它们共同的方向第一主成分然后把这个方向从每个句子向量里减掉。你可以这样理解所有句子共享的那个“共同方向”就是前面说的“房租”、“水电”等——它存在于每个句子里但对区分句子的语义没有贡献。减掉它剩下的才是每个句子真正独特的东西。论文[1]里的实验数据也证明了这一点简单平均效果一般TF-IDF 加权提升有限SIF 加权 移除第一主成分才能带来显著跃升优点效果远好于简单平均和 TF-IDF实现也不复杂。问题仍然没考虑词序。5. 方法四按时间顺序读会议纪要RNN / LSTM前面的方法都有一个致命缺陷不区分词序。“狗咬人”和“人咬狗”简单平均之后向量完全一样。但语义天差地别。我们需要一种能按顺序读的方法。就像看一份公司会议纪要你不会把所有人说的话打散再理解——你会从头到尾阅读理解事情的来龙去脉。RNN循环神经网络就是这样狗 咬 人t1: RNN 读取 v(狗) → 输出 h₁当前的“记忆”t2: RNN 读取 v(咬) h₁ → 输出 h₂融合了“狗咬”的信息t3: RNN 读取 v(人) h₂ → 输出 h₃融合了“狗咬人”的全部信息h₃ 就是句子向量。如果是“人咬狗”读取顺序不同最终 h₃ 也不同。LSTM是 RNN 的升级版解决了长句子读到后面“忘记”开头的问题。BiLSTM双向 LSTM更进一步一句话正着读一遍反着读一遍两边的结果拼在一起。这样每个词都能“看到”前后两个方向的信息。优点保留词序捕捉上下文。问题训练慢长距离依赖还是会衰减。而且——得从头训练一个模型不像前面几种方法直接用现成的词向量就行。6. 方法五请麦肯锡做尽调BERT / SBERT⭐⭐⭐ 当前主流前面四种方法都有一个共同的思路先有静态的词向量再想办法把它们聚合起来。但 Transformer 和 BERT 的思路完全不同。BERT 不是“先有证件照再叠在一起”。而是把一整句话一次性读进去让每个词根据上下文动态调整自己的向量然后直接输出整句话的理解结果。就像你请麦肯锡来做尽职调查。他们当然也要看员工数据但工作方式和前面完全不同简单平均是把所有人的档案拿出来算个平均值结论是“本公司员工平均年薪 30 万”麦肯锡是和高管访谈、了解各部门之间的协作关系、对比行业标杆、最后给出一份综合评估报告。这份报告里同一个人在不同业务板块的表现可能完全不一样。BERT 就是那个“麦肯锡顾问”。它不是直接取平均而是让每个词在整句话的上下文里重新理解自己。例句: 我喜欢吃苹果[CLS] 我 喜 欢 吃 苹 果 [SEP]↓ ↓ ↓ ↓ ↓ ↓ ↓Transformer 编码器12层自注意力↓每个词得到一个“上下文感知”的向量↓取 [CLS] 的向量作为整句话的表示关键区别特性Word2Vec 词向量BERT 词向量“苹果”的向量固定不变在“吃苹果”里偏向水果在“苹果手机”里偏向电脑多义词❌ 一个向量覆盖所有含义✅ 上下文自动消歧句子表示需要手动聚合直接取[CLS]或池化SBERTSentence-BERT是专门为句子相似度任务微调过的 BERT。普通的 BERT 直接取[CLS]做句子向量效果一般SBERT 专门优化了这个环节效果显著更好。优点效果最好词序、上下文、重要度一次性全解决。问题需要 GPU推理慢模型大。7. 方法六直接算两家公司的“迁移成本”WMD还有一种完全不同的思路。前面的方法都是把句子压缩成一个向量然后比较向量。WMD 是不压缩了直接算两个句子之间的“距离”。就像你不把两家公司各自总结成一份报告再比较而是直接算把甲公司变成乙公司最少要花多少钱句子A“小明 买 苹果”句子B“男孩 购 水果”WMD 思路- “小明” → “男孩”语义接近移动成本低- “买” → “购” 语义接近移动成本低- “苹果” → “水果”语义接近移动成本低总移动成本 最优词对齐下的最小总距离。这个方法理论很漂亮但计算成本较高WMD 需要在两个句子的所有词之间找最优的“搬运方案”。这个优化问题的标准解法时间复杂度是 O(n³ log n)n 是词汇表大小——不是句子长度是整个词汇表。也就是说每比较两个句子都要在几万甚至几十万个词的层面上做优化。所以 WMD 更多是一个“理论上很优雅”的方法。实际项目里除非你对速度完全没要求否则通常会选择更快的替代方案比如对 WMD 做近似加速或者直接用 SBERT 算余弦相似度。8. 一张表对比审计工作句子向量任务词序感知上下文感知实现难度效果一家公司一个完整的句子员工词语员工简历/证件照词向量分析公司的方法论句子嵌入方法- 全员薪资取平均简单平均法❌❌⭐⭐⭐- 高管权重高前台权重低TF-IDF 加权法❌❌⭐⭐⭐⭐⭐- 剔除行业共性只看个性SIF 加权法❌❌⭐⭐⭐⭐⭐⭐- 从头到尾读会议纪要RNN / LSTM 方法✅部分⭐⭐⭐⭐⭐⭐- 请麦肯锡做尽调BERT / SBERT 方法✅✅⭐⭐⭐⭐⭐⭐⭐⭐⭐- 直接算两家公司的迁移成本WMD 方法❌❌⭐⭐⭐⭐⭐一个行业/集团一个段落各子公司尽调报告各句子的向量合并报表写行业研报段落向量9. 实际场景怎么选场景是什么│├── 有 GPU、追求最佳效果│ └── ✅ SBERT / BGE直接输出高质量句子向量│├── 无 GPU、用 Word2Vec 词向量│ └── ✅ SIF 加权平均效果最好、实现不复杂│├── 快速验证想法│ └── ✅ 简单平均一行代码│└── 计算两个句子的相似度└── ✅ SBERT 或直接上 WMD