【自然语言处理】BOW和TF-IDF详解

文章介绍了BOW和TF-IDF两种文本预处理技术,用于将文本转换为机器可读的向量形式。BOW简单但易产生稀疏矩阵,而TF-IDF考虑了词的重要性和文档的相关性,常在机器学习模型中表现出色。词嵌入如Word2Vec等技术则进一步解决了语义理解的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BOW 和 TF-IDF 详解

机器无法处理原始形式的文本数据。我们需要将文本分解成一种易于机器阅读的数字格式(自然语言处理背后的理念!)。BOW 和 TF-IDF 都是帮助我们将文本句子转换为向量的技术。

我将用一个流行的例子来解释本文中的 Bag-of-Words(BOW)和 TF-IDF。

我们都喜欢看电影。在我决定看一部电影之前,我总是先看它的影评。我知道你们很多人也这么做!所以,我在这里用这个例子。以下是关于某部恐怖电影的评论示例:

  • 评论一:This movie is very scary and long.
  • 评论二:This movie is not scary and is slow.
  • 评论三:This movie is spooky and good.

你可以看到关于这部电影的一些对比评论,以及电影的长度和节奏。想象一下看一千篇这样的评论是多么枯燥。显然,我们可以从中汲取很多有趣的东西,并以此为基础来衡量电影的表现。

然而,正如我们在上面看到的,我们不能简单地把这些句子交给机器学习模型,让它告诉我们一篇评论是正面的还是负面的。我们需要执行某些文本预处理步骤。

BOW 和 TF-IDF 就是两个这样做的例子。让我们详细了解一下。

1.BOW

词袋(BOW)模型是数字文本表示的最简单形式。像单词本身一样,我们可以将一个句子表示为一个词包(一个数字串)。

让我们回顾一下我们之前看到的三种类型的电影评论:

  • 评论一:This movie is very scary and long.
  • 评论二:This movie is not scary and is slow.
  • 评论三:This movie is spooky and good.

我们将首先从以上三篇评论中所有的独特词汇中构建一个词汇表。词汇表由这 111111 个单词组成:“This”、“movie”、“is”、“very”、“stear”、“and”、“long”、“not”、“slow”、“spooky”、“good”。

现在,我们可以将这些单词中的每一个用 111000 标记在上面的三个电影评论中。这将为我们提供三个用于三个评论的向量:

在这里插入图片描述

  • 评论向量1:[1 1 1 1 1 1 1 0 0 0 0]
  • 评论向量2:[1 1 2 0 0 1 1 0 1 0 0]
  • 评论向量3:[1 1 1 0 0 0 1 0 0 1 1]

这就是词袋(BOW)模型背后的核心思想。

在上面的例子中,我们可以得到长度为 111111 的向量。然而,当我们遇到新的句子时,我们开始面临一些问题:

  • 如果新句子包含新词,那么我们的词汇量就会增加,因此向量的长度也会增加。
  • 此外,向量还包含许多 000,从而产生稀疏矩阵(这是我们希望避免的)。
  • 我们没有保留任何关于句子语法和文本中单词顺序的信息。

2.TF-IDF

TF-IDF 是一种用于信息检索与数据挖掘的常用加权技术。TF 是词频(Term Frequency),IDF 是逆文本频率指数(Inverse Document Frequency)。

评论 222: This movie is not scary and is slow.

TF(′this′)=评论2中出现this的次数评论2中的单词数=18TF('this')=\frac{评论2中出现this的次数}{评论2中的单词数}=\frac{1}{8}TF(this)=评论2中的单词数评论2中出现this的次数=81

我们可以这样计算所有评论的词频:

在这里插入图片描述
我们可以计算评论 222 中所有单词的 IDF 值:

IDF(′this′)=log文档数包含this一词的文档数=log33=log(1)=0IDF('this')=log\frac{文档数}{包含 this 一词的文档数}=log\frac{3}{3}=log(1)=0IDF(this)=log包含this一词的文档数文档数=log33=log(1)=0

在这里插入图片描述
因此,我们看到 “is”、“this”、“and” 等词被降为0,代表重要性很小;而 “scary”、“long”、“good” 等词则更为重要,因而具有更高的权值。

我们现在可以计算语料库中每个单词的 TF-IDF 分数。分数越高的单词越重要,分数越低的单词越不重要:(tf_idf)t,d=tft,d×idft(tf\_idf)_{t,d}=tf_{t,d}×idf_t(tf_idf)t,d=tft,d×idftTF−IDF(‘this’,Review2)=TF(‘this’,Review2)×IDF(‘this’)=18×0=0TF-IDF(‘this’, Review 2) = TF(‘this’, Review 2)×IDF(‘this’) = \frac{1}{8}×0 = 0TFIDF(this,Review2)=TF(this,Review2)×IDF(this)=81×0=0
在这里插入图片描述
我们现在已经获得了我们词汇的 TF-IDF 分数。TF-IDF 还为频率较低的单词提供较大的值,并且当 IDF 和 TF 值都较高时,该值较高。TF-IDF 分值高代表该单词在所有文档中都很少见,但在单个文档中很常见。

总结一下我们在文章中所讨论的内容:

  • 词袋只创建一组向量,其中包含文档中的单词出现次数,而 TF-IDF 模型还包含关于更重要的单词和不重要的单词的信息。
  • 词袋向量很容易解释。然而,在机器学习模型中,TF-IDF 通常表现得更好。

虽然 “BOW” 和 “TF-IDF” 在各自方面都很受欢迎,但在理解文字背景方面仍然存在空白。检测单词 “spooky” 和 “scary” 之间的相似性,或者将给定的文档翻译成另一种语言,需要更多关于文档的信息。

这就有关于 Word2Vec、CBOW、Skip-Gram 等词嵌入技术的由来。

<think>我们正在解释TF-IDF向量,这是一个文本表示方法,用于将文本转换为数值向量,以便计算机能够处理。 TF-IDF代表"词频-文档频率",它由两部组成:TF(词频)IDF(逆文档频率)。 目标:评估一个词在文档中的重要程度。基本思想是:一个词在文档中出现的次数越多,同时在其他文档中出现的次数越少,那么这个词就越重要。 步骤解: 1. 词频(TF):衡量一个词在文档中出现的频率。 TF(词, 文档) = (该词在文档中出现的次数) / (文档中总词数) 2. 逆文档频率(IDF):衡量一个词的普遍重要性。如果很多文档都包含该词,则其重要性较低。 IDF(词) = log(总文档数 / (包含该词的文档数 + 1)) (加1是为了避免母为0) 3. TF-IDF(词, 文档) = TF(词, 文档) * IDF(词) 然后,对于一个文档,我们可以为每个词计算TF-IDF值,从而形成一个向量(向量的每个维度对应一个词)。 举例说明: 假设我们有三个文档文档1: "the cat sat on my face" 文档2: "the dog sat on my bed" 文档3: "the face of my cat" 步骤1:构建词表(去除停用词?这里为了简单,我们不去除停用词,但实际中通常会去掉如"the", "on", "my"等停用词。但为了演示,我们保留并计算) 词表:['the', 'cat', 'sat', 'on', 'my', 'face', 'dog', 'bed', 'of'] 共9个词。 步骤2:计算每个文档中每个词的TF文档1:总词数6 the: 1/6, cat:1/6, sat:1/6, on:1/6, my:1/6, face:1/6 文档2:总词数6 the:1/6, dog:1/6, sat:1/6, on:1/6, my:1/6, bed:1/6 文档3:总词数5 the:1/5, face:1/5, of:1/5, my:1/5, cat:1/5 步骤3:计算每个词的IDF(总文档数N=3) the: 出现在3个文档中,IDF = log(3/(3+1)) = log(3/4) ≈ log(0.75) ≈ -0.1249(这里我们取自然对数,实际中底数可换,但通常用自然对数或log10) 注意:为了避免母为0,我们通常加1(平滑),所以母是(包含该词的文档数+1)。但有时也使用不加1的版本,这里我们按照常见做法:IDF(词) = log(N/(包含该词的文档数)),但注意如果包含0的情况,需要加1。这里我们使用加1的平滑版本,即IDF(词) = log(N/(包含该词的文档数+1))? 实际上,在gensim中,使用的是log((N+1)/(包含该词的文档数+1)),然后加1。但为了简单,我们使用标准公式:IDF(词) = log(N/(包含该词的文档数)),但是当包含该词的文档数为0时,会出问题。因此,我们使用:IDF(词) = log(N/(包含该词的文档数+1)) + 1? 实际上,有很多变体。这里我们采用最常见的:IDF(词) = log(N/(包含该词的文档数)),其中包含该词的文档数至少为1(因为我们在计算IDF时,这个词至少出现在一个文档中,否则我们不会考虑它)。但是,在计算时,为了避免母为0,我们通常用log(N/(df(t)+1))。我们采用sklearn中的公式:log((N+1)/(df(t)+1)) + 1,但是这样会使公式复杂。为了简单,我们使用经典公式:IDF(t) = log(N/df(t)),其中df(t)是包含词t的文档数。 然而,在gensim中,使用的公式是:idf(t) = log( (总文档数+1) / (包含t的文档数) ) + 1,然后取负对数?实际上,我们参考gensim文档:gensim中idf的计算是:idf(t) = log( (语料库中文档总数) / (包含词t的文档数) ),然后TF-IDF= tf * idf。 我们这里按照经典公式(不加平滑): 'the': 出现在3个文档-> IDF = log(3/3) = log(1)=0 'cat': 出现在文档1文档3,即2文档 -> IDF = log(3/2) ≈ 0.4055 'sat': 出现在文档1文档2,即2文档 -> IDF = log(3/2)≈0.4055 'on': 出现在文档1文档2,即2文档 -> IDF=log(3/2)≈0.4055 'my': 出现在所有3个文档 -> IDF=log(3/3)=0 'face': 出现在文档1文档3,即2文档 -> IDF=log(3/2)≈0.4055 'dog': 只出现在文档2 -> IDF=log(3/1)=log(3)≈1.0986 'bed': 只出现在文档2 -> IDF=log(3/1)≈1.0986 'of': 只出现在文档3 -> IDF=log(3/1)≈1.0986 步骤4:计算每个文档中每个词的TF-IDF文档1: the: (1/6)*0 = 0 cat: (1/6)*0.4055 ≈ 0.0676 sat: (1/6)*0.4055 ≈ 0.0676 on: (1/6)*0.4055 ≈ 0.0676 my: (1/6)*0 = 0 face: (1/6)*0.4055 ≈ 0.0676 dog: 0(因为文档1中没有dog) bed:0 of:0 所以文档1的TF-IDF向量(按词表顺序)为: [0, 0.0676, 0.0676, 0.0676, 0, 0.0676, 0, 0, 0] 文档2: the:0 cat:0 sat: (1/6)*0.4055≈0.0676 on: (1/6)*0.4055≈0.0676 my:0 face:0 dog: (1/6)*1.0986≈0.1831 bed: (1/6)*1.0986≈0.1831 of:0 向量:[0,0,0.0676,0.0676,0,0,0.1831,0.1831,0] 文档3: the:0 cat: (1/5)*0.4055≈0.0811 sat:0 on:0 my:0 face: (1/5)*0.4055≈0.0811 dog:0 bed:0 of: (1/5)*1.0986≈0.2197 向量:[0,0.0811,0,0,0,0.0811,0,0,0.2197] 注意:在实际中,我们通常会对向量进行归一化(例如,使向量的模长为1),但这里为了简单,我们省略了归一化。 通过这个例子,我们可以看到: - 像"the""my"这样的常见词,由于出现在所有文档中,IDF为0,因此它们对文档的区没有贡献。 - 而像"dog"、"bed"、"of"这样只出现在一个文档中的词,具有较高的IDF值,因此它们在文档中的TF-IDF值较高。 这样,每个文档就被表示成了一个向量,向量的每个维度对应一个词的TF-IDF值。我们可以用这个向量来计算文档之间的相似度(如余弦相似度),或者作为机器学习模型的输入。 现在,我们可以参考用户提供的引用[1]中的代码,展示如何使用gensim库计算TF-IDF向量。 注意:在gensim中,TF-IDF模型的计算方式可能略有不同,但基本思想一致。 代码示例(根据引用[1]修改): 我们使用用户提供的文档,但为了清晰,我们使用英文文档(与上面例子一致)或使用用户原来的中文文档(但词需要调整)。这里我们使用上面例子的文档。 但是,用户提供的代码是处理中文的,而我们的例子是英文。不过,我们可以将英文文档词(按空格即可)。 步骤: 1. 文档词(这里每个文档已经是一个字符串,我们按空格2. 创建字典 3. 构建词袋(bow)表示 4. 训练TF-IDF模型 5. 应用模型得到每个文档TF-IDF向量 代码如下(使用我们的例子):</think>### TF-IDF向量概念详解(小白友好版) #### 一、一句话理解 **TF-IDF** 是一种给词语打的技术,衡量一个词在文档中的**重要程度**。它认为: - 词在**当前文档出现次数越多**,得越高(TF- 词在**所有文档中出现越少**,得越高(IDF) 就像老师给作业打- 交作业次数多(TF高)是好学生 - 但如果是全班都交(IDF低),就不特别了 - 只有**经常交作业且别人很少交**的学生才最突出[^1] #### 二、核心概念拆解 假设有三篇文档: 1. "苹果 手机 好用" 2. "香蕉 苹果 新鲜" 3. "手机 电脑 配置" ##### 1. 词频(TF - Term Frequency) 衡量词在**当前文档**的出现频率: $$ TF(词) = \frac{词在文档中出现次数}{文档总词数} $$ 例如文档1: - TF("苹果") = 1/3 ≈ 0.33 - TF("手机") = 1/3 ≈ 0.33 ##### 2. 逆文档频率(IDF - Inverse Document Frequency) 衡量词的**稀缺程度**: $$ IDF(词) = \log(\frac{总文档数}{包含该词的文档数}) $$ 例如: - "苹果"在2文档出现 → IDF = log(3/2) ≈ 0.18 - "手机"在2文档出现 → IDF = log(3/2) ≈ 0.18 - "香蕉"只在1篇文档出现 → IDF = log(3/1) ≈ 0.48 ##### 3. TF-IDF值 最终得 = TF × IDF - "苹果"在文档1的得:0.33 × 0.18 ≈ 0.06 - "香蕉"在文档2的得:0.33 × 0.48 ≈ 0.16 #### 三、可视化示例 所有文档的词表:["苹果","手机","好用","香蕉","新鲜","电脑","配置"] 每个文档TF-IDF向量: ``` 文档1: [0.06, 0.06, 0.16, 0, 0, 0, 0 ] ↑ ↑ ↑ ↑ ↑ ↑ ↑ 苹果 手机 好用 香蕉 新鲜 电脑 配置 文档2: [0.06, 0, 0, 0.16, 0.16, 0, 0 ] 文档3: [0, 0.06, 0, 0, 0, 0.16, 0.16] ``` **关键发现**: - "好用"只在文档1出现 → 成为文档1的特征词 - "香蕉""新鲜"只在文档2出现 → 成为文档2的特征词 - 所有文档都有的词得接近0 #### 四、Python实现示例 ```python from gensim import corpora, models # 三篇文档 documents = [ "苹果 手机 好用", "香蕉 苹果 新鲜", "手机 电脑 配置" ] # 1. 词处理 texts = [doc.split() for doc in documents] # [['苹果','手机','好用'], ...] # 2. 创建词表字典 dictionary = corpora.Dictionary(texts) print("词表:", dictionary.token2id) # 输出:{'手机':0, '苹果':1, '好用':2, '电脑':3, '配置':4, '新鲜':5, '香蕉':6} # 3. 转换为词袋向量 corpus = [dictionary.doc2bow(text) for text in texts] print("词袋向量:", corpus) # 输出:[[(0,1),(1,1),(2,1)], ...] (词ID, 出现次数) # 4. 计算TF-IDF模型 tfidf = models.TfidfModel(corpus) # 5. 输出每篇文档TF-IDF向量 for i, doc in enumerate(tfidf[corpus]): print(f"\n文档{i+1}的TF-IDF向量:") # 转换格式:(词ID, TF-IDF值) → [词, 值] vector = [[dictionary[id], round(score, 2)] for id, score in doc] print(vector) ``` **输出结果**: ``` 文档1的TF-IDF向量: [['手机', 0.58], ['苹果', 0.58], ['好用', 0.58]] 文档2TF-IDF向量: [['苹果', 0.45], ['新鲜', 0.77], ['香蕉', 0.45]] 文档3的TF-IDF向量: [['手机', 0.45], ['电脑', 0.77], ['配置', 0.45]] ``` > 注意:实际输出值经过归一化处理,数值大小反映相对重要性[^1] #### 五、应用场景 1. **搜索引擎排序**: - 搜索"苹果手机"时,优先显示TF-IDF值高的网页 2. **文本类**: - 科技类文章"手机"、"电脑"的TF-IDF- 水果类文章"苹果"、"香蕉"的TF-IDF高 3. **关键词提取**: -TF-IDF值最高的词作为文章关键词 #### 六、与词袋模型对比 | **特性** | 词袋模型(BOW) | TF-IDF模型 | |----------------|----------------------|---------------------| | 计数方式 | 原始出现次数 | 加权出现次数 | | 常见词处理 | 给高频词高 | 压制高频词 | | 特征区度 | 低 | 高 | | 语义敏感性 | 无 | 部(通过IDF) | | 适用场景 | 简单文本匹配 | 需要区重要性的场景 | > **核心优势**:TF-IDF能自动降低"的"、"是"等常见词的权重,提升关键特征词的显著性[^3] --- ### 相关问题 1. TF-IDF如何处理新出现的文档或新词? 2. 为什么TF-IDF不适合处理超长文档? 3. TF-IDFWord2Vec在文本表示上有何本质区别? 4. 如何用TF-IDF实现简单的文本相似度计算? 5. 除了TF-IDF,还有哪些常用的文本特征提取方法?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大数据与AI实验室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值