【概述】
词袋模型(Bag of Words,BOW)最早用于文本分类,其将每个句子看成一个袋子,袋子中装的都是单词,每个单词都是独立的,然后看这个袋子里装的都是些什么词汇,将其进行分类
如果猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的
此外,词袋模型能够将一个句子转化为向量表示,通过计算向量的距离,可以来表征两个句子间的相似度
【基本思想】
在根据语料对句子分词后,构建键为单词值为索引的词典后,会对每个句子构建一个向量,构建规则如下:
- 向量的维度是词典中的单词个数
- 向量中每个维度顺序与句子中单词出现的顺序没有关系,只与词典中的顺序一一对应
- 向量中每个维度的值是每个单词在当前句子中出现的次数
假设有语料库中有三个句子:
1 | 句子1:小孩喜欢吃零食。 |
经过分词并构建词典后,有:
1 | { |
那么,对于每个句子,就可以用一个 $9$ 维向量来表示每个句子,句子中的单词出现了几次,这个值就设置为几,如果一次也不出现,就设置为零
1 | 句子1:[1,1,1,1,0,0,0,0,0] |
【存在问题】
相比于 One-Hot 编码,词袋模型增加了词频信息,但其仍然存在缺陷
- 高维护成本:可能会维护一个很大的词典
- 缺乏语义信息:词袋模型只是把句子看作单词的简单集合,忽略了单词出现的顺序,可能导致顺序不一样的两句话在机器看来是完全相同的语义
- 向量稀疏:相比于 One-Hot 编码,稀疏性有所降低,但当不同的单词数量繁多时,仍然存在稀疏性问题
【Sklearn 实现】
1 | from sklearn.feature_extraction.text import CountVectorizer |