自然语言处理

词袋模型(bag-of-words)

/ BAG-uv-WURDZ /

词袋模型是把一篇文档变成数字的最简单办法:把它所有的词都倒进一个袋子,摇一摇,只数每个词出现了多少次——把顺序整个扔掉。「狗咬了人」和「人咬了狗」会变成一模一样的袋子:{的: 2, 狗: 1, 咬: 1, 人: 1}。在模型眼里这两句话毫无分别,这既是该方法莫大的便利,也是它刺眼的盲点。

具体来说,你先定下一份词表——模型认识的所有词——再把每篇文档表示成一长串计数,词表里每个词占一格,绝大多数格子是零。这串数字就是机器能拿来运算的向量:比较文档、喂给分类器、做匹配检索。尽管无视了语法、词序和含义,词袋模型在那些「词是否出现本身就含信息」的任务上却出奇地有效,比如把邮件分进垃圾箱,或给新闻文章打主题标签。

它值得一学,因为它是文本处理诚实的基准线——你最先尝试的东西,也是更花哨的方法必须超越的标尺。它的弱点同样发人深省:它分不清「不好」和「好」,把「快乐」和「欢欣」当成毫不相干的陌生人,而且向量会膨胀成巨大、几乎全空的尺寸。像 TF-IDF 这样的加权方案能缓解第一个问题;嵌入则对付第二个。

词表 [I, love, hate, cats, dogs]。「I love cats」→ [1,1,0,1,0]。「I hate cats I hate dogs」→ [2,0,2,1,1]。两篇文档,如今不过是两串计数,分类器可以拿去消化。

每篇文档化作一个词频向量——词序和语法都被丢弃。

记住它致命的盲点:词袋模型丢掉了词序,所以「不好」和「好」在它看来几乎一样。它是一个强劲又廉价的基准——而非一个理解语义的模型。

又称
BoW词袋词频向量