词袋模型(Bag of Words, BoW)

279 阅读3分钟

词袋模型(Bag of Words, BoW)是自然语言处理(NLP)中的一种基础文本表示方法,通过统计词频将文本转化为数值向量,广泛应用于文本分类、情感分析等任务。以下是其核心要点及实际应用:


🔍 ​一、基本原理

  1. 忽略词序与语法
    将文本视为词的无序集合,仅关注词的出现频率,不保留语法结构或顺序。
    示例​:

    • 句子A:"我喜欢苹果" → 向量 [我:1, 喜欢:1, 苹果:1]
    • 句子B:"苹果喜欢我" → 向量相同(语义不同但表示一致)。
  2. 向量化表示

    • 构建词汇表​:统计所有文本中的不重复词,形成固定维度的词表。
    • 生成向量​:每段文本对应一个向量,维度值表示词在文本中的出现次数。

⚙️ ​二、实现步骤

  1. 文本预处理
    分词、去除停用词(如“的”“了”)、标点符号清理,并进行词干提取(如“running”→“run”)。
  2. 构建词汇表
    汇总所有文本中的唯一词,形成词表(例如:["我", "喜欢", "苹果", "香蕉"])。
  3. 生成词频向量
    统计每个词在文本中的出现次数,生成向量(例如:"我喜欢苹果" → [1, 1, 1, 0])。

⚖️ ​三、优缺点分析

优点缺点
✅ ​简单高效​:实现成本低,适合大规模文本处理。❌ ​忽略语义​:无法捕捉词序(如“不快乐”≠“快乐”)和多义词(如“苹果”指水果或品牌)。
✅ ​兼容性强​:可与朴素贝叶斯、SVM等分类算法结合。❌ ​高维稀疏​:词表规模大时,向量维度高且含大量0值(存储和计算效率低)。
✅ ​实时性好​:适用于需快速响应的场景(如垃圾邮件过滤)。❌ ​无法处理新词​:未在词表中的词无法表示。

🌐 ​四、应用场景

  1. 文本分类

    • 新闻分类​:基于词频区分政治、经济等类别。
    • 垃圾邮件过滤​:通过高频词(如“免费”“赢大奖”)识别垃圾邮件。
  2. 情感分析
    电商评论中统计情感词频率(如“好”“差”),结合分类模型判断正负面。

  3. 信息检索
    计算查询词与文档的词频匹配度,用于搜索引擎排序(如搜索“旅行目的地”)。


🛠️ ​五、改进方法

  1. TF-IDF加权
    降低常见词权重,提升稀有词重要性(如“的”权重低,“优惠”权重高)。
  2. N-gram模型
    捕捉局部词序(如二元组“纽约”区别于单字“纽”“约”)。
  3. 词嵌入(Word Embedding)​
    采用Word2Vec、GloVe等生成低维稠密向量,解决稀疏性并保留语义相似性。

🐍 ​六、Python实现示例

使用scikit-learn库快速构建词袋模型:

python
python
复制
from sklearn.feature_extraction.text import CountVectorizer

# 示例文本
texts = ["我喜欢滑雪", "我不喜欢滑雪", "滑雪是一种很好的运动"]

# 初始化向量化器
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(texts)

# 输出词表及向量
print("词汇表:", vectorizer.get_feature_names_out())
print("词频矩阵:\n", X.toarray())

输出​:

markdown
markdown
复制
词汇表: ['一种' '不错' '我' '喜欢' '是' '的' '运动' '滑雪']  
词频矩阵: 
[[0 0 1 1 0 0 0 1]  # "我喜欢滑雪"
 [0 0 1 1 0 0 0 1]  # "我不喜欢滑雪"(因停用词未处理,"不"被忽略)
 [1 1 0 0 1 1 1 1]] # "滑雪是一种很好的运动"

💎 ​总结

词袋模型凭借简单高效的特点,至今仍是文本任务的实用基线方法。其局限性可通过TF-IDF、N-gram或词嵌入技术弥补。在实时性要求高、语义复杂度低的场景(如垃圾邮件识别),BoW仍是优选;而在需深度语义理解的任务中,建议结合更先进的嵌入模型。