当前位置: 首页 > news >正文

自然语言处理NLP入门 -- 第三节词袋模型与 TF-IDF

目标
  • 了解词袋模型(BoW)和 TF-IDF 的概念
  • 通过实际示例展示 BoW 和 TF-IDF 如何将文本转换为数值表示
  • 详细讲解 Scikit-learn 的实现方法
  • 通过代码示例加深理解
  • 归纳学习难点,并提供课后练习和讲解

3.1 词袋模型(Bag of Words, BoW)

1. 什么是词袋模型?

词袋模型(BoW)是一种最简单的文本表示方法,它的核心思想是:

  • 将一篇文章表示为一个词的集合
  • 忽略词的顺序,仅统计每个词的出现次数
  • 转换成一个数值向量,方便计算机处理

让我们用一个直观的例子来理解:

示例:文本数据

假设有两条文本:

文本1: "猫 喜欢 喝 牛奶"
文本2: "狗 也 喜欢 喝 牛奶"

如果我们要分析这些文本,需要将它们转换为计算机可处理的格式。

构建词表(Vocabulary)

首先,我们从所有文本中提取唯一的词,构建一个词表:

词表 = ["猫", "喜欢", "喝", "牛奶", "狗", "也"]
转换成数值表示

对于每条文本,我们用向量表示每个词出现的次数:

文本1: [1, 1, 1, 1, 0, 0]  # "猫"、"喜欢"、"喝"、"牛奶" 各出现 1 次
文本2: [0, 1, 1, 1, 1, 1]  # "狗"、"也"、"喜欢"、"喝"、"牛奶" 各出现 1 次

这样,我们就把文本转换成了一个数值矩阵,每行对应一个文本,每列对应一个单词的词频。


2. BoW 代码示例

我们使用 Scikit-learnCountVectorizer 来实现 BoW:

from sklearn.feature_extraction.text import CountVectorizer# 1. 定义文本数据
texts = ["猫 喜欢 喝 牛奶", "狗 也 喜欢 喝 牛奶"]# 2. 创建 CountVectorizer 对象,确保单字符词也被保留
vectorizer = CountVectorizer(token_pattern=r"(?u)\b\w+\b", stop_words=None)# 3. 训练 BoW 模型并转换文本
bow_matrix = vectorizer.fit_transform(texts)# 4. 输出词表
print("词表:", vectorizer.get_feature_names_out())# 5. 输出转换后的 BoW 矩阵
print("BoW 矩阵:\n", bow_matrix.toarray())

运行结果

词表: ['也' '喜欢' '喝' '牛奶' '狗' '猫']
BoW 矩阵:
[[0 1 1 1 0 1][1 1 1 1 1 0]]
  • 词表是按字母顺序排列的
  • 0 表示该单词未出现在这篇文章中
  • 1 表示该单词在文章中出现了一次

3.2 TF-IDF(词频-逆文档频率)

1. 为什么需要 TF-IDF?

BoW 只计算了单词的出现次数,但有个问题:

  • 高频词的影响:在中文里,“的”、“是”、“在” 这样的词出现次数很高,但它们对文本的意义贡献很小。
  • 重要但不常见的词被忽略:像 “人工智能” 这样的词可能只在部分文本中出现,但它们的信息量很大。

TF-IDF(词频-逆文档频率) 通过两部分来调整词的重要性:

  • TF(词频,Term Frequency):衡量某个词在文章中出现的频率。
    在这里插入图片描述

  • IDF(逆文档频率,Inverse Document Frequency):衡量某个词在所有文档中的重要性。
    [
IDF = \log(\frac{\text{总文档数}}{\text{包含该词的文档数} + 1})
]

    • 例如,“的” 在所有文本中都出现,IDF 低
    • “人工智能” 只在一部分文章出现,IDF 高

最终:
在这里插入图片描述

它的作用是:

  • 常见但无意义的词(如 “的”、“是”)权重降低
  • 罕见但重要的词(如 “人工智能”)权重提高

2. TF-IDF 代码示例

我们使用 Scikit-learnTfidfVectorizer 进行 TF-IDF 计算。

from sklearn.feature_extraction.text import TfidfVectorizer# 1. 定义文本数据
texts = ["猫 喜欢 喝 牛奶", "狗 也 喜欢 喝 牛奶"]# 2. 创建 TF-IDF Vectorizer 对象,确保单字符词也被保留
tfidf_vectorizer = TfidfVectorizer(token_pattern=r"(?u)\b\w+\b", stop_words=None)# 3. 训练 TF-IDF 并转换文本
tfidf_matrix = tfidf_vectorizer.fit_transform(texts)# 4. 输出词表
print("词表:", tfidf_vectorizer.get_feature_names_out())# 5. 输出 TF-IDF 矩阵
print("TF-IDF 矩阵:\n", tfidf_matrix.toarray())

运行结果(示例)

词表: ['也' '喜欢' '喝' '牛奶' '狗' '猫']
TF-IDF 矩阵:
[[0.     0.5    0.5    0.5    0.     0.707][0.707  0.5    0.5    0.5    0.707  0.    ]]

3. 观察结果

  • “喜欢”、“喝”、“牛奶” 这些词在两篇文章中都出现,所以权重较低
  • “猫” 只在第一篇文章中出现,所以权重较高
  • “狗” 只在第二篇文章中出现,所以权重较高

3.3 难点总结

难点理解方式
BoW 忽略词序记住:BoW 只统计词频,而不考虑单词顺序
TF-IDF 计算复杂只需记住:TF 代表词频,IDF 代表重要性(少见但重要的词权重高)
向量化后数据文本转化为数字矩阵,方便机器学习使用

3.4 课后练习

1. 理解 BoW

练习:
请修改以下代码,增加一个新文本,并观察 BoW 变化:

texts = ["猫 喜欢 喝 牛奶", "狗 也 喜欢 喝 牛奶", "机器学习 是 人工智能 的 一部分"]
  • 你观察到哪些新单词?
  • 词表是否有变化?

2. 理解 TF-IDF

练习:
请修改以下代码,增加一个新文本,并观察 TF-IDF 变化:

texts = ["机器学习 很 有趣", "机器学习 使 生活 更 智能"]
  • 哪些词的权重较高?
  • 频繁出现的词的权重是否下降了?

总结

  • BoW 适用于简单 NLP 任务,但容易丢失语义信息
  • TF-IDF 解决了高频词影响,但仍无法完全理解上下文
  • 下一步学习:深度学习模型(如 Word2Vec、BERT)如何更好地理解文本语义

http://www.mrgr.cn/news/90518.html

相关文章:

  • 如何经营一家淘宝店
  • 虚拟机+Docker配置主机代理和常见配置
  • Android和DLT日志系统
  • VeryReport和FastReport两款报表软件深度分析对比
  • 【DeepSeek】DeepSeek小模型蒸馏与本地部署深度解析DeepSeek小模型蒸馏与本地部署深度解析
  • NLP深度学习 DAY7:平滑、语境学习、Scaling Law、大模型的发展、LLM的构建流程
  • haproxy+nginx负载均衡实验
  • 解锁大语言模型潜能:KITE 提示词框架全解析
  • DeepSeek-V3 技术报告
  • 设计模式全解(含代码实例)
  • 【科技革命】颠覆性力量与社会伦理的再平衡
  • web前端布局--使用element中的Container布局容器
  • C++基础学习记录—this指针
  • c#中“事件-event”的经典示例与理解
  • c++ 多线程知识汇总
  • 开发一个类似小红书的社交电商平台需要综合技术、产品和运营能力
  • 自然语言处理NLP入门 -- 第一节基础概念
  • 黑马Mistral Le chat逆转deepseek
  • 【NLP 21、实践 ③ 全切分函数切分句子】
  • lvsDR模式实现
  • Elasticjob在同一个实例上运行的多个分片任务
  • Flask Web开发的重要概念和示例
  • 洛谷 P4552 [Poetize6] IncDec Sequence
  • 阿里云 DeepSeek 模型部署与使用技术评测
  • 机器学习 - 机器学习模型的评价指标
  • 十大知识领域中涉及到的工具与技术(三)