Alex_McAvoy

想要成为渔夫的猎手

词袋模型

【概述】

词袋模型(Bag of Words,BOW)最早用于文本分类,其将每个句子看成一个袋子,袋子中装的都是单词,每个单词都是独立的,然后看这个袋子里装的都是些什么词汇,将其进行分类

如果猪、马、牛、羊、山谷、土地、拖拉机这样的词汇多些,而银行、大厦、汽车、公园这样的词汇少些,我们就倾向于判断它是一篇描绘乡村的文档,而不是描述城镇的

此外,词袋模型能够将一个句子转化为向量表示,通过计算向量的距离,可以来表征两个句子间的相似度

【基本思想】

在根据语料对句子分词后,构建键为单词值为索引的词典后,会对每个句子构建一个向量,构建规则如下:

  1. 向量的维度是词典中的单词个数
  2. 向量中每个维度顺序与句子中单词出现的顺序没有关系,只与词典中的顺序一一对应
  3. 向量中每个维度的值是每个单词在当前句子中出现的次数

假设有语料库中有三个句子:

1
2
3
句子1:小孩喜欢吃零食。
句子2:小孩喜欢玩游戏,不喜欢运动。
句子3:大人不喜欢吃零食,喜欢运动。

经过分词并构建词典后,有:

1
2
3
4
5
6
7
8
9
10
11
{
“小孩”: 1,
“喜欢”: 2,
“吃”: 3,
“零食”: 4,
“玩”: 5,
“游戏”: 6,
“大人”: 7,
“不”: 8,
“运动”: 9
}

那么,对于每个句子,就可以用一个 $9$ 维向量来表示每个句子,句子中的单词出现了几次,这个值就设置为几,如果一次也不出现,就设置为零

1
2
3
句子1:[1,1,1,1,0,0,0,0,0]
句子2:[1,2,0,0,1,1,0,1,1]
句子3:[0,2,1,1,0,0,1,1,1]

【存在问题】

相比于 One-Hot 编码,词袋模型增加了词频信息,但其仍然存在缺陷

  1. 高维护成本:可能会维护一个很大的词典
  2. 缺乏语义信息:词袋模型只是把句子看作单词的简单集合,忽略了单词出现的顺序,可能导致顺序不一样的两句话在机器看来是完全相同的语义
  3. 向量稀疏:相比于 One-Hot 编码,稀疏性有所降低,但当不同的单词数量繁多时,仍然存在稀疏性问题

【Sklearn 实现】

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.feature_extraction.text import CountVectorizer

def bow(texts):
# 文本特征提取计算类
vectorizer = CountVectorizer()
# 拟合模型,将文本中的词语转换为词频 csr_matrix 矩阵
vec = vectorizer.fit_transform(texts)
# 获取词典列表
words = vectorizer.get_feature_names()
return words, vec

texts = ['AA is BB, and BB is AA', 'CC is not AA, but CC is DD']
words, vec = bow(texts)
感谢您对我的支持,让我继续努力分享有用的技术与知识点!