词袋模型简介

词袋模型是一种在用机器学习算法对文本进行建模时表示文本数据的方法。

词袋模型易于理解和实现,在语言建模和文档分类等问题中取得了巨大成功。

在本教程中,您将了解自然语言处理中用于特征提取的词袋模型。

完成本教程后,您将了解:

  • 词袋模型是什么以及为什么需要它来表示文本。
  • 如何为文档集合开发词袋模型。
  • 如何使用不同的技术来准备词汇表和对单词进行评分。

用我的新书《自然语言处理深度学习》来启动您的项目,其中包括逐步教程和所有示例的Python 源代码文件。

让我们开始吧。

A Gentle Introduction to the Bag-of-Words Model

词袋模型简介
图片来源:Do8y,保留部分权利。

教程概述

本教程分为6个部分;它们是

  1. 文本问题
  2. 什么是词袋?
  3. 词袋模型示例
  4. 管理词汇表
  5. 词语评分
  6. 词袋的局限性

需要深度学习处理文本数据的帮助吗?

立即参加我的免费7天电子邮件速成课程(附代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

文本问题

文本建模的一个问题是它很混乱,而机器学习算法等技术更喜欢定义明确的固定长度输入和输出。

机器学习算法不能直接处理原始文本;文本必须转换为数字。具体来说,是数字向量。

在语言处理中,向量 x 是从文本数据中派生出来的,以反映文本的各种语言特性。

— 第 65 页,《自然语言处理中的神经网络方法》,2017 年。

这被称为特征提取或特征编码。

一种流行且简单的文本数据特征提取方法称为文本词袋模型。

什么是词袋?

词袋模型,简称 BoW,是一种从文本中提取特征以用于建模(例如机器学习算法)的方法。

该方法非常简单灵活,可以以多种方式用于从文档中提取特征。

词袋是一种文本表示,描述了文档中单词的出现情况。它包括两件事:

  1. 已知词汇表。
  2. 衡量已知词汇出现情况的度量。

它被称为“词袋”,因为文档中词语顺序或结构的所有信息都被丢弃了。该模型只关注已知词语是否出现在文档中,而不关注它们在文档中的位置。

句子和文档的一种非常常见的特征提取过程是词袋方法(BOW)。在这种方法中,我们查看文本中单词的直方图,即将每个单词计数视为一个特征。

— 第 69 页,《自然语言处理中的神经网络方法》,2017 年。

直觉是,如果文档具有相似的内容,那么它们就是相似的。此外,仅从内容中我们就可以了解文档的含义。

词袋可以像您喜欢的那样简单或复杂。复杂性在于决定如何设计已知词(或标记)的词汇表,以及如何对已知词的出现进行评分。

我们将仔细研究这两个问题。

词袋模型示例

让我们通过一个具体的例子来解释词袋模型。

步骤 1:收集数据

下面是查尔斯·狄更斯所著《双城记》一书的前几行文本摘录,取自古腾堡计划。

那是最好的时代,
那是最坏的时代,
那是智慧的时代,
那是愚蠢的时代,

对于这个小例子,让我们将每一行视为一个单独的“文档”,并将这 4 行视为我们整个文档语料库。

步骤 2:设计词汇表

现在我们可以列出模型词汇表中的所有单词。

这里唯一的单词(忽略大小写和标点符号)是

  • “it”
  • “was”
  • “the”
  • “best”
  • “of”
  • “times”
  • “worst”
  • “age”
  • “wisdom”
  • “foolishness”

这是一个包含 24 个词的语料库,其中有 10 个词的词汇表。

步骤 3:创建文档向量

下一步是给每个文档中的单词打分。

目标是将每个自由文本文档转换为一个向量,我们可以将其用作机器学习模型的输入或输出。

因为我们知道词汇表有 10 个单词,所以我们可以使用一个固定长度的 10 位文档表示,向量中的每个位置对应一个单词的得分。

最简单的评分方法是将单词的存在标记为布尔值,0 表示不存在,1 表示存在。

使用上面词汇表中任意的单词顺序,我们可以遍历第一个文档(“It was the best of times”),并将其转换为一个二进制向量。

文档的评分将如下所示

  • “it” = 1
  • “was” = 1
  • “the” = 1
  • “best” = 1
  • “of” = 1
  • “times” = 1
  • “worst” = 0
  • “age” = 0
  • “wisdom” = 0
  • “foolishness” = 0

作为一个二进制向量,它将如下所示

其他三个文档将如下所示

所有单词的顺序都被名义上地丢弃了,我们有了一个从语料库中任何文档中提取特征的一致方法,可以用于建模。

新文档与已知词汇表有重叠,但可能包含词汇表之外的单词,仍然可以进行编码,其中只对已知词的出现进行评分,而忽略未知词。

您可以想象这会自然地扩展到大型词汇表和大型文档。

管理词汇表

随着词汇量大小的增加,文档的向量表示也会增加。

在前面的例子中,文档向量的长度等于已知词的词数。

您可以想象,对于一个非常大的语料库,例如数千本书,向量的长度可能是数千或数百万个位置。此外,每个文档可能只包含词汇表中很少的已知词。

这会导致一个包含大量零分数的向量,称为稀疏向量或稀疏表示。

稀疏向量在建模时需要更多的内存和计算资源,并且大量的位置或维度会使传统算法的建模过程非常具有挑战性。

因此,在使用词袋模型时,存在减小词汇量大小的压力。

有一些简单的文本清理技术可以作为第一步,例如

  • 忽略大小写
  • 忽略标点符号
  • 忽略不包含太多信息的常用词,称为停用词,例如“a”、“of”等。
  • 修正拼写错误的单词。
  • 使用词干提取算法将单词还原为词干(例如,“play”来自“playing”)。

一种更复杂的方法是创建分组词的词汇表。这既改变了词汇表的范围,又允许词袋从文档中捕获更多含义。

在这种方法中,每个单词或标记被称为一个“gram”。创建两个单词对的词汇表,反过来,被称为二元模型。同样,只对语料库中出现的二元组进行建模,而不是所有可能的二元组。

N-gram 是一个由 N 个标记组成的单词序列:2-gram(更常称为二元组)是两个单词的序列,如“please turn”、“turn your”或“your homework”;3-gram(更常称为三元组)是三个单词的序列,如“please turn your”或“turn your homework”。

— 第 85 页,《语音和语言处理》,2009 年。

例如,前一节文本第一行“It was the best of times”中的二元组如下:

  • “it was”
  • “was the”
  • “the best”
  • “best of”
  • “of times”

然后,跟踪三元组的词汇表称为三元模型,这种通用方法称为 N 元模型,其中 N 指的是分组词的数量。

通常,对于文档分类等任务,简单的二元方法优于一元词袋模型。

词袋表示比词袋表示强大得多,在许多情况下,它被证明很难被击败。

— 第 75 页,《自然语言处理中的神经网络方法》,2017 年。

词语评分

一旦选定了词汇表,就需要对示例文档中单词的出现情况进行评分。

在已完成的示例中,我们已经看到了一种非常简单的评分方法:单词存在或不存在的二元评分。

其他一些简单的评分方法包括:

  • 计数。计算每个单词在文档中出现的次数。
  • 频率。计算每个单词在文档中出现的频率,即该单词在文档中所有单词中的比例。

词哈希

您可能还记得计算机科学中,哈希函数是一种将数据映射到固定大小数字集的数学运算。

例如,我们在编程中在哈希表中使用它们,其中名称可能转换为数字以进行快速查找。

我们可以使用词汇表中已知词的哈希表示。这解决了大型文本语料库词汇量过大的问题,因为我们可以选择哈希空间的大小,而哈希空间的大小又决定了文档向量表示的大小。

单词被确定性地哈希到目标哈希空间中的相同整数索引。然后可以使用二元分数或计数来对单词进行评分。

这被称为“哈希技巧”或“特征哈希”。

挑战在于选择一个哈希空间来适应所选的词汇量大小,以最大限度地减少冲突的可能性并权衡稀疏性。

TF-IDF

词频评分的一个问题是,高频词在文档中开始占据主导地位(例如,分数更高),但对模型来说,它们可能不像稀有但可能是领域特定的词那样包含更多的“信息内容”。

一种方法是根据词在所有文档中出现的频率重新调整词的频率,这样像“the”这样在所有文档中都很频繁的词的分数就会受到惩罚。

这种评分方法称为术语频率-逆文档频率,简称 TF-IDF,其中

  • 术语频率:是对当前文档中单词频率的评分。
  • 逆文档频率:是对单词在所有文档中稀有程度的评分。

分数是一种权重,并非所有单词都同样重要或有趣。

这些分数的作用是突出显示给定文档中独特(包含有用信息)的词语。

因此,稀有词的 idf 很高,而频繁词的 idf 可能很低。

— 第 118 页,《信息检索导论》,2008 年。

词袋的局限性

词袋模型非常容易理解和实现,并为针对特定文本数据进行自定义提供了很大的灵活性。

它在语言建模和文档分类等预测问题中取得了巨大成功。

尽管如此,它也存在一些缺点,例如:

  • 词汇表:词汇表需要仔细设计,最重要的是要管理其大小,这会影响文档表示的稀疏性。
  • 稀疏性:稀疏表示更难建模,既有计算原因(空间和时间复杂度),也有信息原因,其中挑战在于模型如何在如此大的表示空间中利用如此少的信息。
  • 意义:丢弃词序会忽略文档中词的上下文,进而忽略词的意义(语义)。上下文和意义可以为模型提供很多东西,如果建模得当,可以区分相同词语的不同排列(“this is interesting”与“is this interesting”)、同义词(“old bike”与“used bike”)等等。

进一步阅读

如果您想深入了解此主题,本节提供了更多资源。

文章

书籍

总结

在本教程中,您了解了用于文本数据特征提取的词袋模型。

具体来说,你学到了:

  • 词袋模型是什么以及为什么需要它。
  • 如何逐步应用词袋模型到文档集合。
  • 哪些技术可用于准备词汇表和对单词进行评分。

你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。

立即开发文本数据的深度学习模型!

Deep Learning for Natural Language Processing

在几分钟内开发您自己的文本模型

...只需几行python代码

在我的新电子书中探索如何实现
用于自然语言处理的深度学习

它提供关于以下主题的自学教程
词袋模型、词嵌入、语言模型、标题生成、文本翻译等等...

最终将深度学习应用于您的自然语言处理项目

跳过学术理论。只看结果。

查看内容

对《词袋模型简介》的 125 条回复

  1. 塞缪尔 2017 年 10 月 13 日上午 6:00 #

    很棒的文章,感谢您保持其简洁明了,易于理解和阅读。

  2. 2017 年 10 月 13 日下午 4:58 #

    很好的阅读材料和参考。

  3. 奥萨马·哈米德 2017 年 10 月 18 日凌晨 1:33 #

    这真是一个温和的介绍。

  4. 法特玛 2018 年 1 月 9 日晚上 9:25 #

    非常有用且清晰的逐步解释。

    谢谢。
    法特玛

  5. 安娜 2018 年 1 月 26 日上午 5:55 #

    嗨,Jason,

    很棒的文章!那么,既然词袋模型不考虑词语之间的关系或词序。将词袋模型转换为 CNN 能解决这个问题并提高预测准确性吗?我一直在寻找关于实现 BOW + CNN 进行文本分类的文章,但到目前为止还没有找到。

    谢谢你

    • 杰森·布朗利 2018 年 1 月 27 日上午 5:47 #

      不行。但你可以使用词嵌入和 LSTM,它们可以学习词语之间的关系。

      • 尼基尔 2019 年 3 月 22 日晚上 10:35 #

        嗨…很棒的文章。

        如果您有撰写任何文章或解释词嵌入或 LSTM 以理解单词之间关系的任何其他文章..
        请分享链接,对我会有帮助。

        谢谢你

  6. 天顶 2018 年 2 月 14 日凌晨 4:24 #

    如果我理解正确,词哈希的目的是为了方便地将值映射到单词并轻松更新计数。我的问题是,如果我直接使用字典而不是实现词哈希,会不会更容易?

    • 杰森·布朗利 2018 年 2 月 14 日上午 8:25 #

      什么字典?

    • 文斯 2019 年 1 月 17 日凌晨 3:35 #

      请注意,在 Python 中,字典就是哈希表的实现。不过,您仍然需要决定单词映射到什么,我认为词哈希的想法是每个单词都映射到它自己的哈希值。如果查找比您的哈希函数更快且内存不是限制,那么拥有一个将每个单词映射到其自身哈希值的字典可能会有所帮助,但您不能真正用字典“替换”哈希函数。

  7. 格奥尔基 2018 年 3 月 23 日凌晨 4:14 #

    谢谢你的文章
    读完之后我其实不明白词袋是什么
    1) 二进制向量是现成的 BOW 模型输出吗?
    [1, 1, 1, 1, 1, 1, 0, 0, 0, 0]
    2) 如果一个单词出现不止一次,它会是什么样子?
    [1, 1, 2, 1, 1, 1, 0, 0, 0, 0](不是严格的例子,但假设文档中“the”出现了两次)
    3) 我不明白为什么我们不能将词袋放入 RNN 模型中?例如放入 LSTM

    • 杰森·布朗利 2018 年 3 月 23 日上午 6:12 #

      将文档表示为词频向量就是词袋模型。

      您可以选择如何计数,无论是存在/不存在,还是计数,或其它方式。

      我们可以将单词插入 RNN 中,通常我们会在前端使用词嵌入来获得单词的更分布式表示
      https://machinelearning.org.cn/what-are-word-embeddings/

      这对乔治有帮助吗?

  8. 曾辰峰 2018 年 5 月 22 日上午 5:38 #

    你好!谢谢您的插图。我们正在进行一个基于歌曲歌词的音乐流派分类项目。然而,由于版权问题,我们只能获取词袋格式的歌词,无法访问完整的歌词。我们正在尝试使用 TFIDF,结合词袋模型。但是,在我们的案例中,我们无法获取文档向量,因为我们没有完整的句子信息。我们需要获取完整的歌词文本进行训练吗?还是现在我们拥有的数据足以实现模型?非常感谢!

    • 杰森·布朗利 2018 年 5 月 22 日上午 6:32 #

      看看你能用 BoW 走多远。要使用嵌入/LSTM,你需要原始文档。

  9. Lakshmikanth K A 2018 年 6 月 23 日上午 5:19 #

    假设我有 10 份文档。在删除停用词和词干提取等操作后,我有 50 个词的词汇表。我的每个文档都将是 50 个 tf-idf 值的向量,我将使用因变量对其进行建模。这意味着我的建模数据有 10 行 * 50 个特征 + 1 个因变量列。每个单元格都包含该词汇词的 tf-idf。这种方法正确吗?

    此外,tf-idf 是一个值,它是术语、文档和所有文档的函数。因为 tf 来自于给定文档中术语是什么及其频率,而 idf 来自于该术语在所有文档的总集合中的频率。
    这种理解正确吗?

    或者 tf-idf…计算后…是在术语级别还是文档级别进行汇总?

    • 杰森·布朗利 2018 年 6 月 23 日上午 6:21 #

      是的,它是语料库中和文档间在统计上描述的术语。

      • 扎基尔 2020 年 1 月 21 日晚上 10:03 #

        亲爱的杰森,我非常喜欢您的文章。举个例子,我有许多类别,每个类别可能包含 2 或 3 条评论。每个类别的评论都不同,例如类别 1 有 5 条评论,类别 2 有 3 条评论等。我将如何将类别视为文档,以及如何转换为类别-类别矩阵?

  10. 尼尔 2018 年 7 月 5 日下午 4:09 #

    嗨,杰森博士,

    我有两个问题,寻求帮助。
    1. 我看到 R 中有一个叫做术语文档矩阵 (TDM) 的东西,它和 Python 中的词袋是同一个东西吗?
    2. 我在您的一篇文章中读到词袋模型会导致稀疏向量,我想知道在获得稀疏向量后,在使用机器学习算法之前是否有必要将它们转换为密集向量。

    此致

    • 杰森·布朗利 2018 年 7 月 6 日上午 6:39 #

      抱歉,我不了解 TDM。

      无需转换为密集。

      • 尼尔 2018 年 7 月 7 日凌晨 2:16 #

        明白了。谢谢。

  11. 恩里科·马尔佐恩 2018 年 7 月 7 日下午 12:07 #

    您好。我想问一下我是否可以使用词袋模型来过滤单词。例如,我从 Twitter 获取了推文,然后我需要过滤掉我认为是相关数据的推文。然后这些过滤后的数据将用于分类。

    我需要您的帮助。提前感谢您。

    • 杰森·布朗利 2018 年 7 月 8 日上午 6:15 #

      抱歉,我没有文本过滤的示例,无法给您好的建议。

  12. 穆罕默德 2018 年 7 月 14 日凌晨 2:27 #

    嘿,杰森博士,

    非常感谢您。
    这确实是一个温和而精彩的介绍。

  13. 瓦伦蒂娜·罗德里格斯 2018 年 7 月 26 日晚上 8:27 #

    您提到了这个
    这会导致一个包含大量零分数的向量,称为稀疏向量或稀疏表示。

    但在 Google 的机器学习速成课程中,他们提到了这个

    * 这句话的密集表示必须为所有一百万个单元格设置一个整数,其中大部分为 0,少数为低整数。

    * 这句话的稀疏表示只存储那些象征句子中实际存在的单词的单元格。因此,如果句子只包含 20 个独特的单词,那么该句子的稀疏表示将只存储 20 个单元格中的整数。

    链接:https://developers.google.com/machine-learning/glossary/#sparse_features

  14. 阿迪 2018 年 8 月 1 日凌晨 2:49 #

    嗨,杰森,非常棒的文章。我正在尝试根据主题对推文进行分类。例如,包含亚马逊的推文被归入一个集群,包含 Netflix 的推文被归入另一个集群。假设有 3 个主题:A、B、C。我的传入推文流是 ABABAACCABA 等。我只需要将它们聚类到各自的组中。我正在使用 Spark Streaming 和 StreamingKMeans 模型来完成此操作。

    我该如何向量化推文,以便这些向量在被 K-Means 模型预测时,被放置在同一个集群中?

  15. 阿维尼什 2018 年 8 月 5 日晚上 9:17 #

    嗨,Jason,

    如何建模一个系统,其中您有一系列文档映射到某些标签,以及一些未标记的示例。

    文档标签
    D1 —- c1
    D2 —- c2
    D3 —- c3
    .
    .
    .
    .
    .
    Dk —– c1

    这里有两个问题:-

    Q1. 我将来看到的标签可能与我训练时拥有的标签不同
    甚至语料库也可能在某种程度上发生变化。因此,我必须应用半监督
    或无监督学习以在线(即时)学习,然后在后续预测中做得更好
    对于已见的标签,将其分类到适当的类别(标签)。

    Q2. 如果我看到一个我已经见过的标签(假设是 c1),并且我遇到类似的特征
    向量,我只是将其分类为 1;如果我看到一个标签(假设是 ck),如果 ck 以前从未出现过,我预测它为 0,但应该能够学习这个,并在以后也预测 ck 为 1。
    基本上是分类为二元分类,例如某个工单有一个父工单
    (预测为 1)而没有任何父工单(0)。这里的文本文档是工单
    描述。
    我正在努力为这个问题设计一个架构,如果您能指导我,那将非常有帮助。

    我正在努力为这个问题设计一个架构,如果您能指导我,那将非常有帮助。

  16. 拉维·辛格 2018 年 8 月 7 日下午 4:48 #

    嗨,我遵循了本教程,现在我有一个使用词袋训练的模型,
    我所做的是将我的文本转换为稀疏矩阵并训练模型。它给出了 95% 的准确率,但现在我无法使用该模型预测一个简单的语句。

    这是我的代码 –

    我有一个数据框,其中包含 2 个类别标签和主体。

    # 使用词袋模型
    cout_vect = CountVectorizer()
    # 从对象转换为 Unicode
    final_count = cout_vect.fit_transform(df['body'].values.astype('U'))

    #模型
    # 对词袋表示使用分类器
    from sklearn.model_selection import train_test_split
    来自 keras.models import Sequential
    from keras.layers import Dense
    来自 keras.wrappers.scikit_learn 的 KerasClassifier
    from keras.utils import np_utils
    X_train, X_test, y_train, y_test = train_test_split(final_count, df['label'], test_size = .3, random_state=25)

    model = Sequential()
    model.add(Dense(264, input_dim=X_train.shape[1], activation='relu'))
    model.add(Dense(128, activation='relu'))
    model.add(Dense(64, activation='relu'))
    model.add(Dense(32, activation='relu'))
    model.add(Dense(16, activation=’relu’))
    model.add(Dense(8, activation='relu'))
    model.add(Dense(3, activation=’softmax’))
    # 编译模型
    model.compile(loss=’categorical_crossentropy’, optimizer=’adam’, metrics=[‘accuracy’])
    y_train = np_utils.to_categorical(y_train, num_classes=3)
    y_test = np_utils.to_categorical(y_test, num_classes=3)

    model.fit(X_train, y_train, epochs=50, batch_size=32)
    model.evaluate(x=X_test, y=y_test, batch_size=None, verbose=1, sample_weight=None)

    现在我想使用我的模型预测这个语句。该怎么做呢?

    x = "您的账户余额已被扣除 4300"

    model.predict(x, batch_size=None, verbose=0, steps=None)

    • 杰森·布朗利 2018 年 8 月 8 日上午 6:15 #

      干得好。

      要进行预测,您必须以与准备训练数据相同的方式准备输入。

  17. 舒巴姆 2018 年 10 月 26 日晚上 9:43 #

    你好,
    我阅读了这篇文章。我想问如何从不同的文档中提取一些难词(术语),并将其存储在向量中,作为机器的词汇表。词袋模型是更好的解决方案,还是我应该寻找其他方法?
    不同的文档并将其存储在向量中作为机器的词汇表。词袋模型是更好的解决方案还是我应该寻找其他方法。

    • 杰森·布朗利 2018 年 10 月 27 日上午 5:59 #

      我不确定我是否理解。

      词袋模型和 word2vec 是机器学习中文本数据的两种流行表示方法。

  18. 迈克 2018 年 11 月 7 日下午 12:33 #

    非常棒的文章。非常清晰。谢谢杰森!

  19. 穆斯塔法 2018 年 12 月 7 日晚上 10:09 #

    感谢这篇内容丰富的文章。我好奇
    BOW 和 TF 有什么区别?
    它们是同一个东西吗?

    • 杰森·布朗利 2018 年 12 月 8 日上午 7:07 #

      词袋和词频?

      一般相同,尽管向量可以填充计数、二进制、比例等。

      一般相同,尽管向量可以填充计数、二进制、比例等。

  20. 萨姆 2019 年 1 月 13 日下午 1:38 #

    嘿,谢谢杰森的文章。内容丰富且简洁。

  21. 阿贡 2019 年 1 月 24 日凌晨 2:20 #

    谢谢杰森的文章。
    我有一个问题。
    如果我想用 TFIDF 向量表示进行分类任务,那么这种技术表示是应该首先对所有数据集(训练数据 + 测试数据)进行,还是应该分别进行,先对训练数据进行,然后再对测试数据进行?

    • 杰森·布朗利 2019 年 1 月 24 日上午 6:46 #

      好问题。

      准备训练数据集上的词汇表和编码,然后将其应用于训练和测试。

  22. 尤里·杜伦斯 2019 年 1 月 25 日晚上 9:44 #

    亲爱的 Jason,
    我正在考虑写一篇关于使用社交媒体平台(Twitter 或 Facebook)的文本来衡量人们(也许只是影响者)对移动应用软件许可证购买行为的社会影响的论文。您认为词袋模型是一个很好的选择,还是您会建议其他文本分析模型?
    如果您有任何建议,请告诉我!

    提前感谢,
    尤里

    • 杰森·布朗利 2019 年 1 月 26 日上午 6:13 #

      我建议测试一系列表示和模型,以了解哪种方法最适合您的特定预测问题。

  23. 罗伯特·林 2019 年 2 月 13 日凌晨 3:16 #

    谢谢,杰森。

    我是一个来自中国的读者,您因为对机器学习主题的简洁明了的解释而小有名气。感谢您的工作。

    我个人的一个问题是,您花了多长时间撰写这篇文章?

    • 杰森·布朗利 2019 年 2 月 13 日上午 8:02 #

      谢谢!

      我尽量每天写一篇教程。通常,我可以在几个小时内写完一篇教程。

  24. 奥蕾莉亚 2019 年 2 月 15 日凌晨 1:33 #

    很棒的文章!谢谢分享!

  25. 埃利西奥·昆蒂诺 2019 年 2 月 20 日晚上 9:00 #

    嗨,Jason,

    首先,感谢您的资料。

    在“书籍”一节中,我认为“第 6 章,《信息检索导论》,2008 年。”
    和“第 6 章,《统计自然语言处理基础》,1999 年。”都指向后一本书,所以没有第一本书的参考文献。

    此致,埃利西奥

  26. 安贾尼 2019 年 2 月 26 日晚上 10:23 #

    关于 BOW 的好文章,解释得很好

  27. 亚历克斯 2019 年 3 月 13 日凌晨 3:41 #

    好文章。供您参考,维基百科上词袋模型的超链接指向了 N-Grams

  28. 宾杜 2019 年 4 月 5 日下午 3:51 #

    嗨,Jason,

    谢谢这篇文章!!

    如果我必须预测一个问题/故事的“影响区域”,使用以下特征(文本数据)
    1. 作为问题的一部分“修改的文件”。
    2. 问题所属的“组件”。
    3. 相关“测试用例”。

    这里可以使用哪种方法来处理这些数据以输入机器学习模型?
    [1. 数据预处理已完成。
    2. 可用的监督测试数据]

    您能在这里提供一些建议吗?这将非常有帮助!!

    • 杰森·布朗利 2019 年 4 月 6 日上午 6:40 #

      我不知道,听起来是一个有趣的项目。

      也许可以尝试一些技术,并看看文献中针对类似问题使用了哪些技术?

  29. 卡拉 2019 年 5 月 2 日凌晨 1:25 #

    很棒的文章。这个网站 (https://unipython.com/el-modelo-de-la-bolsa-de-palabras-o-bag-of-words/) 抄袭了它,逐字逐句地翻译成了西班牙语。

  30. 汉娜 2019 年 7 月 4 日下午 12:37 #

    嗨,杰森,感谢您清晰的解释。我想知道如何引用您的文章?
    您介意分享任何您的出版物/文章的参考文献,以便我可以在这个主题上引用您的研究。

    谢谢你

  31. 曼莫汉·辛格·博哈拉 2019 年 7 月 24 日凌晨 12:19 #

    谢谢杰森的精彩解释。

  32. 2019 年 7 月 30 日下午 4:48 #

    余弦相似度呢?

    • 杰森·布朗利 2019 年 7 月 31 日上午 6:45 #

      抱歉,我没有关于该主题的帖子。也许将来会写。

  33. VIVEK SINGH SISODIYA 2019 年 9 月 2 日上午 7:13 #

    你能解释一下带算法的模糊词袋聚类(BoWC)吗?

  34. 艾哈迈德·M·沙哈特 2019 年 10 月 24 日上午 5:21 #

    很棒的文章,以直接了当的方式介绍了基本概念。谢谢杰森,期待更多相关文章。

  35. 马丁 2019 年 10 月 24 日上午 7:10 #

    嗨,Jason

    实际上,文档并不是像示例中那样编码为“原始”词袋,例如“[1, 1, 1, 1, 1, 1, 0, 0, 0, 0]”,而是作为一种独热编码方案。所以一个句子将被编码为一个矩阵(词数 * 词汇量大小),而不是一个向量。这是对的吗?

    • 杰森·布朗利 2019 年 10 月 24 日下午 2:01 #

      在这种情况下不是。

      把词袋想象成文档(或段落)的独热编码。

  36. 安巴扎汉·马哈德旺 2019 年 11 月 15 日晚上 8:23 #

    我有幸用我的母语阅读这篇文章,尽管我是一个印度人。

    精湛而精彩的解释。

  37. 布丽娜 2020 年 4 月 29 日上午 9:53 #

    嗨杰森,感谢您清晰而简洁的教程!

    您认为词袋模型是一种“词嵌入”方法吗?如果不是,具体有什么区别?

    我的理解是,词袋方法属于所谓的“向量语义”,因此它是一种词义的嵌入(即表示)为向量的形式。然而,我经常听到人们将“词袋”与“词嵌入”方法(他们指的是 CBOW 或 skip-gram 等)进行对比。这让我怀疑将词袋定义为词嵌入方法是否正确。

    提前感谢您的回答!

    • 杰森·布朗利 2020 年 4 月 29 日下午 12:06 #

      不客气。

      也许吧。不完全是,表示中没有反映词语之间的关系。但它是分布式的。

  38. 詹妮弗 2020 年 5 月 18 日下午 5:16 #

    主要缺点是它不考虑词序,因此丢失了重要的语义方面。它无法考虑不同词之间的相似性(词嵌入是解决此问题的方法)。它是一个大型表示,包含大量特征(每个词一个),其中大部分对于给定文本来说将为零。

  39. 哈迪 2020 年 6 月 1 日晚上 10:43 #

    很棒的解释和文章

    我只有一个问题

    如果我在情感分析中使用词袋模型来预测任何推文的情感极性(积极或消极),并且任何机器学习分类器都与词袋模型一起用于训练,我想知道分类器如何知道整个推文是积极还是消极
    根据什么分类器知道这条推文是积极还是消极
    推文中的每个词都有一个来自词袋模型的向量,那么分类器如何将同一推文中所有词的所有向量联系起来以确定该推文的极性呢

    • 杰森·布朗利 2020 年 6 月 2 日上午 6:13 #

      模型如何知道它是积极还是消极——因为您使用历史数据对其进行了训练。

      也许我没有理解您的问题,如果是这样,也许您可以重新表述一下。

  40. 哈迪 2020 年 6 月 2 日上午 8:55 #

    谢谢回复

    我的意思是机器学习分类器如何仅用词袋模型来识别推文的极性

    我们不使用任何规则或词典从推文中提取情感词,然后对这些情感应用任何规则(聚合或其他规则)来判断整个推文是积极还是消极

    我们只有所有的词及其计数,这怎么行得通呢

    • 杰森·布朗利 2020 年 6 月 2 日下午 1:19 #

      它学习词语和目标类别标签之间的关系。它解决了问题,因为我们无法明确地编写解决方案。

  41. 哈迪 2020 年 6 月 3 日凌晨 12:48 #

    感谢您的回复

    有没有资源可以深入理解细节

    • 杰森·布朗利 2020 年 6 月 3 日上午 8:01 #

      是的,请参阅“进一步阅读”部分中列出的资源。

  42. 哈迪 2020 年 6 月 4 日凌晨 3:18 #

    谢谢你的帮助

  43. 帕鲁尔 2020 年 6 月 9 日下午 3:28 #

    杰森,这篇文章太棒了!它解释了我需要知道的一切。谢谢!

  44. 阿卜杜勒拉赫曼 2020 年 7 月 7 日晚上 11:29 #

    感谢您简洁地提供信息。

  45. 乌察夫·拉斯托吉 2020 年 7 月 12 日下午 2:51 #

    这是我在这个领域读过的最好的文章之一。杰森干得好!我会经常关注这个网站来清除我的疑惑。

  46. 保罗·约瑟夫 2020 年 10 月 12 日凌晨 3:59 #

    见过的最好的解释。
    浏览了许多网站,但都不满意。
    感谢杰森先生清晰、精确的解释。

  47. 印迪卡 2020 年 10 月 14 日凌晨 2:29 #

    您能否提及在没有任何 Python 库的情况下识别负面或正面电影评论的步骤,我遵循了您关于此的教程,但它只有数据准备。我期望接下来要做的步骤。如果我知道每个步骤,我可以在互联网上搜索。
    感谢您的精彩教程。

  48. 瓦伊莎丽 2020 年 10 月 17 日上午 5:36 #

    非常感谢。非常好的文章,很好地解释了词袋模型。

  49. 塞纳·莫西萨 2021 年 1 月 4 日下午 5:37 #

    感谢您分享这个想法,我想知道如何使用独热编码将分类数据转换为数值数据,我想知道这个,请帮帮我

  50. 奥萨马 2021 年 1 月 30 日晚上 11:58 #

    我们可以将词袋分为 3 种类型吗?1-二进制评分(存在/不存在),2-计数,3-频率。如果这是真的,我们可以将 tfidf 也视为词袋的一部分,还是不能说 tfidf 是词袋?

    • 杰森·布朗利 2021 年 1 月 31 日上午 5:36 #

      是的,TF/IDF 就像一个高级词袋。数字有更多含义。

      • 奥萨马 2021 年 2 月 3 日晚上 11:40 #

        谢谢您一直以来的回复和帮助,我的问题是如果我想说
        为了将我们清理过的评论转换为数值特征向量,我们可以使用以下方法:
        1- 词袋模型
        2- TFIDF
        3- word2vec 或 glove
        这是正确的说法,还是我必须说的方法是
        1- 词袋模型
        2-word2vec 或 glove
        在这种情况下,我将 tfidf 视为词袋的一部分
        先谢谢了

        • 杰森·布朗利 2021 年 2 月 4 日上午 6:20 #

          是的,这是一个好的开始。

          • 奥萨马 2021 年 2 月 4 日上午 11:51 #

            你是说我这样说对吗
            1- 词袋模型
            2- TFIDF
            3- word2vec 或 glove

          • 杰森·布朗利 2021 年 2 月 4 日下午 1:39 #

            是的,您可以使用这些方法对单词进行编码,以便进行建模。

  51. 奥萨马 2021 年 2 月 6 日凌晨 1:04 #

    谢谢您一直以来的帮助和您一直清晰明了的解释

  52. 拉迪娜 2021 年 4 月 16 日晚上 11:44 #

    嗨杰森,感谢您的精彩文章!
    我想对推文进行分类,例如它们在谈论什么,例如宠物、家庭等。考虑到 TF-IDF 矩阵的稀疏性,您会推荐使用哪种机器学习模型?我正在考虑逻辑回归,但由于高维问题,惩罚是必须的。随机森林也可能是一个选择吗?

    • 杰森·布朗利 2021 年 4 月 17 日上午 6:11 #

      不客气。

      我建议测试一套数据准备和模型,以发现最适合您的特定数据集的方法。

  53. SanjanaJain 2021年12月23日 晚上11:50 #

    感谢您的文章,它真的很有帮助。

    • James Carmichael 2021年12月24日 凌晨4:43 #

      非常欢迎您,SanjanaJain!如果您对我们的资料有任何疑问,请告诉我们。

      此致,

  54. Gaurav 2022年3月1日 上午9:00 #

    感谢您的文章!

    当使用哈希技巧进行词袋模型时,模型的输入是什么?根据我的理解,它应该是文档中存在的标记的哈希值。我如何在标记的哈希输入中编码计数或频率信息?

    • Gaurav 2022年3月1日 上午9:13 #

      例如,如果输入句子是“quick brown fox was quick”。如果我们使用基于哈希的词袋模型,模型的输入将是这四个词——“quick”、“brown”、“fox”、“was”的哈希值。但是,我们无法输入“quick”这个词在此文本输入中的计数为2的详细信息。

  55. Tony 2022年6月21日 上午7:18 #

    这很棒,但假设我想直接传达一些有意义的东西,比如某种情节,从分数中。比如说,我想比较两个文本的相似性。有没有一种简单的方法可以做到这一点?

    • James Carmichael 2022年6月21日 上午9:57 #

      你好,Tony……你可以绘制均方误差(MSE)准确度。

  56. Bisrat 2023年1月3日 下午6:10 #

    非常棒的文章,我发现它非常直观易懂且结构良好。谢谢!
    您能也介绍一下 Tf-Idf 吗?

    • James Carmichael 2023年1月4日 上午9:21 #

      感谢您的反馈和支持,Bisrat!我们很感谢您的建议!

  57. Sulaiman Khan 2023年2月6日 下午5:09 #

    BOW、TFIDF 属于 Word2vec 吗?这两个概念(TFIDF、Word2vec)是分开的。

发表评论

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。