344. AgentX:词频统计(词袋)和 word2vec:文字怎样变成可比较的数字?

2026.07.30

·fdeagentx

先说结论

早期语言模型也得先把文字改写成数字,程序才能分类、检索或计算相似度。有两种方式转成数字

  • ① 词频统计:把一整条文本直接变成向量。
    • 先定一个词表,再记录每个词出现了几次。
    • 代价是从一开始就不看词序。
  • word2vec :把每个词变成向量。
    • 它从大量文本的邻近词关系里,为词表中的每个词学一串固定数字。
    • 之后还要另想办法,才能把多个词向量合成一句话的向量

“词袋模型”(Bag of Words,BoW)是词频统计的常见叫法。这个名字容易让人以为有什么“装袋”机制;其实重点只有一个:它把一句话当成一堆不分顺序的词来计数。下面统一叫“词频统计”。

这篇只回答一个问题:售后系统把一条工单变成数字后,原句里哪些信息还在,哪些已经丢了。

案例:两条只能走相反流程的工单

售后自动分流收到两条工单:

text
A:支付已经扣款,但订单没有生成。
B:支付没有扣款,但订单已经生成。
  • A 要查扣款成功后为什么没有建单;B 要查为什么没有扣款却出现了订单。
    • 两条工单要走相反的排查流程。
    • 数字表示若把它们变成同一个输入,后续分类器就没有机会分开它们。

词频统计:文本直接变成计数

  • 它把文本变成向量的关系是:
text
工单文字 → 切成 Token → 按固定词表计数 → 词频向量

先把句子切分成一个个 Token|560

第一步不是理解句意,而是把连续文字拆成可以计数的 Token。

  • Token 是系统拿来计数的文字片段。 把所有不同 Token 收集成固定词表|528

词表决定向量的每一个位置分别代表哪个 Token。

  • 固定词表决定向量的每个位置分别代表哪个词。 图 1-5:词袋把每个词的出现次数排成一个向量|464

按固定词表排好词频后,文字第一次变成固定长度的数字数组。

  • 词频向量只填写“这个词出现几次”,不填写它出现在句子的什么位置。
  • 按下面的教学切分,A、B 会变成同一串数字:
text
词表:支付 已经 扣款 但 订单 没有 生成
A:   1    1    1   1   1    1    1
B:   1    1    1   1   1    1    1
  • A、B 的词和次数相同,词频向量也相同。
    • “没有”否定的是“扣款”还是“生成”,没有进入向量。
    • “已经扣款”和“订单没有生成”分别出现在哪个位置,也没有进入向量。
  • 这就是它适合关键词统计、却不能单独承担这类工单分流的原因
    • A、B 不是词不够,而是词之间的顺序和关系没有保住

word2vec:先从邻近词学出词向量

它训练词向量的关系是:

text
大量句子 → 中心词和邻近词 → 预测任务 → 每个词的固定词向量

word2vec 通过预测两个词是否相邻来学习词嵌入|680

word2vec 不是人工给词标属性,而是用邻近词预测反复调整每个词的坐标。

  • 它不只数词,而是在大量句子里反复学习“一个词周围通常会出现哪些词”。
  • 它要解决的是词频统计没有解决的另一件事:两个不同的词能不能按相似程度比较。
    • 最终,词表中的每个词都有一行数字:
text
扣款 -> [0.14, -0.62, 0.08, ...]
订单 -> [-0.31, 0.21, 0.57, ...]

词向量的每一维不是人写好的 “支付程度” 或 “金额程度” ;它是训练为了做好邻近词预测自己调出来的一串坐标

用少量可命名属性对比 apple 和 baby|704

图里把坐标暂时画成可命名属性,只为建立直觉;真实词向量的维度更多,也不一定能直接命名。

  • 这让 word2vec词频统计多保住了词与词的相似关系。====> 换言之,可计算了
    • “扣款”和“支付”常在相似语境出现,向量通常会更接近。
    • 它们不再只是词表中两个毫无关系的位置。
    • 坐标之间可以计算距离或余弦相似度;距离更近,通常表示它们在训练语料里的用法更相近。
    • 这不是在断言两个词绝对同义,而是让程序能用一个数值比较“它们像不像”。

图 1-9:含义相近的词在向量空间中通常彼此靠近|592

真实向量空间的维度很高;图压成二维,只为了让“距离更近”这件事看得见。

但一个词 “苹果” 只有一个坐标,仍然不够

  • 但它的词向量是静态的。
    • 同一个词无论出现在什么句子里,都先查到同一行向量。
    • “苹果很好吃” 和 “苹果发布了新手机”中的“苹果”,word2vec 先给出的都是同一行数字,同一串坐标
    • 所以它还不会根据当前句子,改变一个词的表示。
  • “苹果”这个案例说明的问题,和 A、B 不一样。
    • A、B 的问题是整句话的词序与否定关系丢了。
    • “苹果”的问题是同一个词在不同语境有不同含义,却只有一个固定坐标
  • 所以下一步需要的是上下文化表示
    • 同一个 Token 要结合句中其它 Token,算出不同的向量。
    • 这样才有机会让“没有”连到它否定的事实,也让两个“苹果”落到不同位置。
    • 是否真的分对,仍要用真实工单数据评测。

考考你

为什么词频统计会把 A、B 变成同一个向量?

  • 它只记录词表中每个词出现几次。
  • A、B 的词和次数相同。
  • 词序和否定关系没有进入向量,所以输入完全一样。

word2vec 学到的到底是什么?

  • 它为词表里的每个词学习一行稠密数字,也就是词向量。
  • 常见训练方式是用一个词预测窗口内的周围词,或反过来预测中心词。
  • 词向量之间可以计算距离或余弦相似度,用来比较两个词的用法是否接近。

为什么 word2vec 仍分不清两个“苹果”?

  • word2vec 给每个词固定一行向量。
  • 两句话里的“苹果”都查到同一行坐标。
  • 它没有根据当前句子改写这个词的表示,所以无法区分水果和品牌。

参考